【问题标题】:How to get the texture size in HLSL?如何在 HLSL 中获取纹理大小?
【发布时间】:2013-11-23 10:38:38
【问题描述】:

对于我正在处理的 HLSL 着色器(用于练习),如果纹理坐标(在模型上)大于相应大小的一半(即x > width / 2 或 @ 987654322@)。我熟悉 C/C++ 并且了解 HLSL 的基础知识(非常基础)。如果没有其他解决方案,我将使用 XNA 手动设置纹理大小(事实上,我在其中使用着色器)。有更好的解决方案吗?如果可能的话,我会尽量保持在 Shader Model 2.0 中。

【问题讨论】:

    标签: xna textures hlsl


    【解决方案1】:

    默认纹理坐标空间被归一化为 0..1,所以 x > width / 2 应该只是 texcoord.x > 0.5。

    【讨论】:

    • 只是为了确保 - 你知道这在统一中是否也是如此吗?也就是说,vertex.uv 向量是一个有 0..1 个条目的 float2?
    【解决方案2】:

    这里要小心。 tex2d() 和其他纹理调用应该 NOT 在 if()/else 子句中。所以如果你有一个像素着色器输入“IN.UV”并且你的目标是“OUT.color”,你需要这样做:

    float4 aboveCol = tex2d(mySampler,some_texcoords);
    float4 belowCol = tex2d(mySampler,some_other_texcoords);
    if (UV.x >= 0.5) {
       OUT.color = /* some function of... */ aboveCol;
    } else {
       OUT.color = /* some function of... */ belowCol;
    }
    

    而不是将 tex() 调用放在 if() 块中。

    【讨论】:

    • 我明白了。你能告诉我为什么会这样吗?
    • 因为纹理单元跨相邻像素工作以正确计算适当的过滤器大小/MIP 级别——也就是说,它们需要评估屏幕空间 X 和 Y 中的 UV 方差(因此存在HLSL 中的 ddx() 和 ddy() 函数)。 if() 语句具有无限高的潜在频率。如果您可以将 tex2D() 放在 if() 子句中,那么您将遇到纹理/过滤错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多