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)数が劇的に増加します!

だから私の質問はこれです:何が命令数を増やすのですか?また、ifステートメントを使用すると、110命令の長さしかないループで、命令数が400を超えるのはなぜですか。

編集:上記の質問を編集しました。本当に指示だったのに、レジスターが取られていると勘違いしてしまいました。ただし、質問は引き続き適用されます。2つのforループ(それぞれ長さが55)によって、ループ内にifステートメントが1つ追加されただけで、命令数が400を超えて増加する原因は何でしょうか。

4

2 に答える 2

2

fxcはあなたに命令カウントを与えます。しかし、実際には、これを別の方法で行う必要があります。Uをパスし、Vをパスする双方向フィルターを試してみてください。

于 2012-12-04T21:00:43.460 に答える
2

命令をカウントするには、FXC.exeを使用できます。こちらがクイックガイドです。

FXC.exeは、VS2012に同梱されているWindows8SDKに含まれるようになりました。

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 に答える