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