你如何计算HLSL中的指令?

时间:2012-10-12 05:13:26

标签: image-processing 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个for循环(每个长度为55)将指令数增加400以上,只需在循环中添加1个if语句?

2 个答案:

答案 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输出