【问题标题】:Problem with HLSL looping/samplingHLSL 循环/采样问题
【发布时间】:2009-08-31 23:40:15
【问题描述】:

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

【问题讨论】:

  • 您是针对 SM3 还是 SM4 进行编译?如果这是 directx 10,您可能需要在编译着色器时设置 D3D10_SHADER_DEBUG 和 D3D10_SHADER_SKIP_OPTIMIZATION 标志,因为这可能有助于您在 PIX 中找到问题。
  • 使用 DirectX9 编译到 SM3,这是我能用的最高级别,因为这是 XNA
  • 好吧,这不是很明显,因为你同时标记了 DirectX 和 XNA ;)
  • 是的,我猜想这个问题会是很多 DirectX 人会做出贡献的问题(我猜是像你自己一样?),所以我将它标记为这样 :)

标签: directx xna hlsl shader


【解决方案1】:

问题已解决,这是一个简单的编码错误,我需要在每次迭代时提高 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;
}

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 2021-02-25
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2013-03-27
    相关资源
    最近更新 更多