2009-08-31 77 views
2

我有一段HLSL代码看起来像这样:问题的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)任何建议的解决方案?

+0

您是针对SM3还是SM4进行编译?如果这是DirectX 10,则编译着色器时可能需要设置D3D10_SHADER_DEBUG和D3D10_SHADER_SKIP_OPTIMIZATION标志,因为这可能有助于您追踪PIX中的问题。 – Tchami 2009-09-01 00:49:20

+0

使用DirectX9编译为SM3,这是我可以使用的最高版本,因为这是XNA – Martin 2009-09-01 08:46:29

+0

好的,自从您将它标记为DirectX和XNA以来,这并不是很明显;) – Tchami 2009-09-01 11:11:51

回答

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