【问题标题】:Using floor() function in GLSL when sampling a texture leaves glitch在对纹理进行采样时使用 GLSL 中的 floor() 函数会产生故障
【发布时间】:2016-01-25 16:50:32
【问题描述】:

这是我看到的问题的一个着色玩具示例:

https://www.shadertoy.com/view/4dVGzW

我正在通过从地板纹理坐标中采样来对纹理进行采样:

#define GRID_SIZE 20.0

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = fragCoord.xy / iResolution.xy;

    // Sample texture at integral positions
    vec2 texUV = floor(uv * GRID_SIZE) / GRID_SIZE;

    fragColor = texture2D(iChannel0, texUV).rgba;
}

我看到的错误是在网格方块之间有时会画出 1-2 条像素线。

请注意,我们不仅在 Web 上使用 GLSL ES,而且在 Unity 中使用 HLSL,都发现了这个问题。

floor() 和我不懂的浮点运算有什么关系吗?!我不仅想知道如何解决它,还想知道究竟为什么会发生这种情况?

【问题讨论】:

    标签: pixel-shader floor


    【解决方案1】:

    原来是为那些网格线使用纹理中的低细节 mipmap。将纹理上的过滤器设置更改为“最近”或“线性”过滤而不是“mipmap”修复它。

    还可以使用第三个“bias”参数调用 texture2D,该参数修改它将使用哪个 mipmap 级别。

    感谢shadertoy的评论者回答问题!

    (不确定在没有偏差的情况下,mipmap 级别实际上是如何为自定义着色器选择的,如果有人知道会感兴趣!)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多