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;
}

我得到的结果与只执行一次的循环一致。我检查了 PIX 中的着色器,事情变得更加奇怪,指示代码中位置的黄色箭头进入循环,穿过它一次,然后跳回到起点,此时黄色箭头不再移动,但光标遍历代码并返回结果(PIX 中的一个错误,或者我只是使用错误?)

我怀疑这可能与纹理读取被编译器移出循环有关,但是我认为 tex2Dlod 不会发生这种情况,因为我手动设置了 LOD:/

所以:

1)有什么问题?

2)任何建议的解决方案?

4

1 回答 1

2

问题解决了,这是一个简单的编码错误,我需要在每次迭代时提高 mip 级别,而不是降低它。

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 回答