我有一个名为“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);
但它没有按预期工作。非常感谢任何帮助。