HLSL循环/采样问题

时间:2009-08-31 23:40:16

标签: directx xna hlsl shader

我有一段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)任何建议的解决方案?

1 个答案:

答案 0 :(得分: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;
}