【发布时间】:2018-02-03 08:17:15
【问题描述】:
我有一个名为“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);
但它没有按预期工作。非常感谢任何帮助。
【问题讨论】:
-
显示图像会很好。
标签: opengl glsl blur texture-mapping bloom