2012-10-12 23 views
3

當我使用下面的代碼:你如何計算HLSL的指示?


#define MAX_RADIUS 55 
#define KERNEL_SIZE (MAX_RADIUS * 2 + 1) 
... 
float[] kernel[KERNEL_RADIUS]; 
... 
float4 PS_GaussianBlur(float2 texCoord : TEXCOORD) : COLOR0 
{ 
    float4 color = float4(0.0f, 0.0f, 0.0f, 0.0f); 

    //add the right side offset pixels to the color 
    for (int i = 0; i < MAX_RADIUS; i++) 
    { 
     if(kernel[i] != 0) //this will improve performance for lower filter radius's, but increases const register num 
      color += tex2D(colorMap, texCoord + offsets[i]) * kernel[i]; 
    } 
    //add the left side offset pixels to the color 
    for (int j = 0; j < MAX_RADIUS; j++) 
    { 
     if(kernel[i] != 0) 
      color += tex2D(colorMap, texCoord - offsets[j]) * kernel[j]; 
    } 
    //finally add the weight of the original pixel to the color 
    color += tex2D(colorMap, texCoord) * kernel[MAX_RADIUS]; 

    return color; 
} 

if(kernel[i] != 0)顯着增加使用的指令數!

所以我的問題是這樣的:什麼增加指令計數?爲什麼在只有110條指令的循環中使用if語句將指令數增加400以上?

編輯:編輯上述問題。我錯誤地認爲寄存器是在真正的指令時被採用的。但是,這個問題仍然適用。什麼會導致2循環(每個長度爲55)增加400以上的循環內只有1條if語句的指令計數?

+0

如果反彙編編譯後的HLSL,你會得到什麼?究竟有多少額外的寄存器正在使用? –

+1

@AndrewRussell我不知道我是怎麼錯過了這個,但它真的是指令計數,而不是註冊。我已經適當地重述了這個問題。 – Darkhydro

+0

您使用的着色器模型是什麼? –

回答

2

fxc會給你一個指令數。但是,真的,你應該以另一種方式來做。嘗試一個雙向濾波器,一個通過U和另一個V?

+0

對於遲到的迴應感到抱歉,有一段時間沒有在SO上。我的着色器代碼有點生疏,但如果我沒有記錯的話,那就是這個着色器在做什麼。第一個循環是水平傳球,第二個是垂直傳球。我簡單地實現了一些註冊保存方法,爲了提高性能,我們引入了if語句,它跳過了元素爲0的元素(對於小的過濾器半徑,有很多0)。也許你可以更多地向我解釋你在想什麼? – Darkhydro

+0

我的意思是兩個不同的通過兩個不同的着色器(或具有不同參數的相同着色器),您將第一個結果渲染到紋理,然後在這些結果上運行第二個結果。 – bjorke

+0

「平面2遍紋理映射和變形」。 Alvy Ray Smith,1987 – bjorke

2

要計算指令,您可以使用FXC.exe。這是一個快速指南。

FXC.exe現在可以在VS2012附帶的Windows 8 SDK中找到。

在64位PC FXC.exe居住在此目錄中:C:\ Program Files文件(x86)的\的Windows套件\ 8.0 \ BIN \ 86 \ fxc.exe

使用,您可以輸入一個FX文件和輸出組裝加上標題到一個文本文件,使用此命令行:

> FXC.exe C:/Shader.fx /T fx_4_0 /Fx C:/Output.txt 

> FXC.exe C:/Shader.fx /T fx_4_0 /Cc /Ni /Fc C:/Output.html 

得到一個很酷的語法高亮的HTML輸出

+0

如果需要,我會提供SDK,但是我有VS2010,所以我想知道是否有另一個位置可以找到FXC?另外,當XNA結束時,我可以獲得指令計數。 – Darkhydro

+0

我也是(ABT博士說的),但我有VS2012以及VS2010。對我來說: > fxc「* .fx」/ T ps_3_0/E PixelShaderFunction/Zi/Cc/Ni/No/Fx C:/output.html 工作奇蹟。非常感謝你的回答! (ps3_0爲pixelshader版本3.0和「/ E」來標記pixelshader的函數名稱) 我在文件結尾處得到了「//約104個指令槽(14個紋理,90個算術)」。 – Lodewijk

+0

exe文件在這裏:(儘管你不應該相信陌生人的exe文件!) https://mega.co.nz/#!7FZm2ajK!YFgqoVtKgc6bkyzsARwTrTIlrflaMzEfvGBB5jxMwLs – Lodewijk