У меня есть фреймбуфер под названием «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);
Но это не сработало, как ожидалось. Любая помощь высоко ценится.