当我使用以下代码时:
#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个for循环(每个长度为55)将指令数增加400以上,只需在循环中添加1个if语句?
答案 0 :(得分:2)
fxc将为您提供指令计数。但实际上,你应该采取另一种方式。尝试双向滤波器,一次通过U,另一次通过V?
答案 1 :(得分:2)
要计算说明,您可以使用FXC.exe。这是一个快速指南。
FXC.exe现在可以在VS2012附带的Windows 8 SDK中找到。
在64位PC上,FXC.exe位于以下目录中:C:\ Program Files(x86)\ Windows Kits \ 8.0 \ bin \ x86 \ 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输出