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

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

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

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

gl_FragColor = texture (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. Но я не знаю, как это сделать.

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

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

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

1 ответ

Решение

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

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

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

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