我一直在编写自己的SSAA片段着色器,到目前为止我正在采样4点:左上角,右上角,左下角和右下角。
我正在渲染到一个小窗口,我注意到当我全屏显示这个窗口时,屏幕四周都有条形图,它重复了屏幕另一侧应该显示的内容。
我的着色器目前正在计算,如果我们正在查看像这样的边缘像素:TO =左上角
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 ));
}
Texel坐标在整个纹理上的两个轴上的范围从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)
进行采样,则线性滤波将给出所有角点纹理的平均值。
可以通过使用GL_TEXTURE_WRAP_S
配置GL_TEXTURE_WRAP_T
和glTexParameter
来控制此行为。在您的情况下,GL_CLAMP_TO_EDGE
可能是正确使用的模式。