2

次のようなHLSLコードがあります。

float4 GetIndirection(float2 TexCoord)
{
    float4 indirection = tex2D(IndirectionSampler, TexCoord);

    for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip--)
    {
        indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip));
    }
    return indirection;
}

私が得ている結果は、そのループが 1 回だけ実行されることと一致しています。PIX でシェーダーを確認したところ、事態はさらに奇妙になりました。コード内の位置を示す黄色の矢印がループに到達し、ループを 1 回通過して最初に戻り、その時点で黄色の矢印は二度と移動しませんが、カーソルはコードを移動して結果を返します (PIX のバグか、単に使い方が間違っているのでしょうか?)

これは、コンパイラによってループの外に移動されたテクスチャ読み取りに関係する問題である可能性があるのではないかと疑っていますが、LOD を手動で設定しているため、tex2Dlod では発生しないと思いました:/

そう:

1) 問題は何ですか?

2) 提案された解決策はありますか?

4

1 に答える 1

2

問題は解決しました。単純なコーディングのミスでした。ミップ レベルを下げるのではなく、反復ごとに上げる必要がありました。

float4 GetIndirection(float2 TexCoord)
{
    float4 indirection = tex2D(IndirectionSampler, TexCoord);

    for (half mip = indirection.b * 255; mip > 1 && indirection.a < 128; mip++)
    {
        indirection = tex2Dlod(IndirectionSampler, float4(TexCoord, 0, mip));
    }
    return indirection;
}
于 2009-09-01T09:05:50.627 に答える