Эффект свечения OpenGL GLSL растекается по краям

У меня есть фреймбуфер под названием «FBScene», который отображает текстуру TexScene. У меня есть фреймбуфер под названием «FBBloom», который отображает текстуру TexBloom. У меня есть фреймбуфер под названием «FBBloomTemp», который отображает текстуру TexBloomTemp.

Сначала я визуализирую все свои цветущие/светящиеся объекты в FBBloom и, таким образом, в TexBloom. Затем я играю в пинг-понг с FBBloom и FBBloomTemp, попеременно размывая по горизонтали и вертикали, чтобы получить приятную текстуру блума.

Затем я передаю окончательную текстуру «TexBloom» и TexScene экранному шейдеру, который рисует квадрат заполнения экрана обеими текстурами:

gl_FragColor = текстура (TexBloom, uv) + текстура (TexScene, uv);

Проблема в том, что при размытии изображений эффект цветения распространяется на противоположные края экрана, если светящийся объект находится слишком близко к границе экрана.

Это мой шейдер размытия:

vec4 color = vec4(0.0);
vec2 off1 = vec2(1.3333333333333333) * direction;
vec2 off1DivideByResolution =  off1 / resolution;
vec2 uvPlusOff1  = uv + off1DivideByResolution;
vec2 uvMinusOff1 = uv - off1DivideByResolution;


color += texture(image, uv) * 0.29411764705882354;
color += texture(image, uvPlusOff1) * 0.35294117647058826;
color += texture(image, uvMinusOff1) * 0.35294117647058826;
gl_FragColor = color;

Я думаю, мне нужно, чтобы uvPlusOff1 и uvMinusOff1 не находились за пределами диапазона -1 и +1 uv. Но я не знаю, как это сделать.

Я попытался зафиксировать значения uv в промежутке в приведенном выше коде с помощью:

float px = clamp(uvPlusOff1.x, -1, 1);
float py = clamp(uvPlusOff1.y, -1, 1);
float mx = clamp(uvMinusOff1.x, -1, 1);
float my = clamp(uvMinusOff1.y, -1, 1);

uvPlusOff1 = vec2(px, py);
uvMinusOff1 = vec2(mx, my);

Но это не сработало, как ожидалось. Любая помощь высоко ценится.


person 3DLearner    schedule 03.02.2018    source источник
comment
Показывать изображение было бы хорошо.   -  person BDL    schedule 03.02.2018


Ответы (1)


Проступание на другую сторону экрана обычно происходит, когда для режима переноса установлено значение GL_REPEAT. Установите его на GL_CLAMP_TO_EDGE, и этого больше не должно происходить.

Изменить. Чтобы немного объяснить, почему это происходит в вашем случае: координата текстуры [1,1] означает нижний правый угол нижнего правого текселя. Когда линейная фильтрация включена, это местоположение будет считаться четырьмя пикселями вокруг этого угла. В случае повторяющихся текстур три из них находятся на других сторонах экрана. Если вы хотите предотвратить проблему вручную, вы должны зажать диапазон [0 + 1/texture_size, 1 - 1/texture_size].

Я также не уверен, почему вы вообще зажимаете [-1, 1], потому что координаты текстуры обычно находятся в диапазоне от [0, 1]. Отрицательные значения будут находиться за пределами текстуры и обрабатываются режимом переноса.

person BDL    schedule 03.02.2018
comment
Спасибо. Значение -1 было связано с тем, что у меня было включено наложение текстур. Теперь я вернулся к нормальным значениям текстуры, но теперь моя картинка перевернута. Я думаю, мне нужно как-то манипулировать координатами текстуры. Кстати: я использовал негативные UV-развертки на своем квадроцикле, чтобы перевернуть экран вверх дном. - person 3DLearner; 03.02.2018
comment
Отключите повтор и используйте 1-uv.y, чтобы перевернуть вверх ногами. - person BDL; 03.02.2018