Почему мой шейдер 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 ));
}

1 ответ

Решение

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

Другие вопросы по тегам