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

问题描述 投票:1回答:1

我一直在编写自己的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 ));
}
opengl shader super sampling texel
1个回答
3
投票

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_TglTexParameter来控制此行为。在您的情况下,GL_CLAMP_TO_EDGE可能是正确使用的模式。

© www.soinside.com 2019 - 2024. All rights reserved.