3

当我使用以下代码时:


#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 语句?

4

2 回答 2

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

于 2013-02-24T21:56:30.227 回答
2

fxc 会给你一个指令计数。但实际上,你应该以另一种方式来做这件事。尝试一个双向滤波器,一个在 U 上,另一个在 V 上?

于 2012-12-04T21:00:43.460 回答