Почему мой шейдер GLSL вызывает неправильное обтекание краев

Я пишу свой собственный фрагментный шейдер SSAA, пока я сэмплирую 4 точки: верхний левый, верхний правый, нижний левый и нижний правый.

Я делаю рендеринг в маленьком окне, я заметил, что когда я открываю это окно в полноэкранном режиме, у меня есть полосы по всей стороне экрана, которые повторяют то, что должно быть на другой стороне экрана.

В настоящее время мой шейдер вычисляет, смотрим ли мы на крайний пиксель следующим образом: TL = TopLeft

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 ));
}

person Darision    schedule 13.12.2017    source источник


Ответы (1)


Координаты текселей варьируются от 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, вероятно, является правильным режимом для использования.

person bernie    schedule 14.12.2017