为什么我的 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_S
和 GL_TEXTURE_WRAP_T
来控制此行为。在您的情况下,GL_CLAMP_TO_EDGE
可能是正确的使用模式。
我一直在编写自己的 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_S
和 GL_TEXTURE_WRAP_T
来控制此行为。在您的情况下,GL_CLAMP_TO_EDGE
可能是正确的使用模式。