为什么我的 GLSL 着色器导致不正确的边缘环绕

Why is my GLSL shader causing incorrect edge wrapping

我一直在编写自己的 SSAA 片段着色器,到目前为止,我采样了 4 个点:左上角、右上角、左下角和右下角。

我正在渲染一个小 window,我注意到当我全屏显示这个 window 我在屏幕的所有边上都有条,重复了应该在另一边的内容屏幕.

我的着色器当前会计算我们是否正在查看这样的边缘像素: TL = 左上角

if(texCoord.s <= 1 || texCoord.s >= textureWidth - 1)
{
    //dont offset by -x, instead just use the current x and only offset y
    TL = texture2D(texture, vec2(texCoord.s , texCoord.t + y ));
}
else
{
    TL = texture2D(texture, vec2(texCoord.s - x, texCoord.t + y ));
}

整个纹理的两个轴上的纹素坐标范围从 0 到 1 。因此,纹理坐标(0, 0)指的是左下纹素的左下角(即不是中心)。

画报:

d_x = 1 / textureWidth
d_y = 1 / textureHeight

           +-----+-----+-----+
           |     |     |     |
           |     |     |     |
           |     |     |     |
(-d_x,d_y) +-----+-----+-----+ (2d_x, d_y)
           |     |     |     |
           |     |  A  |     |
           |     |     |     |
           +-----+-----+-----+
    (-d_x,0) (0,0)  (d_x,0)  (2d_x, 0)

A: (d_x/2, d_y/2) <= center of the bottom-left texel

如果你在A点采样,线性纹理过滤会精确地产生左下纹素的值。但是,如果您在 (0, 0) 采样,线性过滤将给出所有角纹素的平均值。

可以通过使用 glTexParameter 配置 GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T 来控制此行为。在您的情况下,GL_CLAMP_TO_EDGE 可能是正确的使用模式。