【问题标题】:OpenGL GLSL bloom effect bleeds on edgesOpenGL GLSL 绽放效果在边缘流血
【发布时间】: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


【解决方案1】:

当环绕模式设置为GL_REPEAT 时,通常会出现向屏幕另一侧的出血。将其设置为GL_CLAMP_TO_EDGE,它不应该再发生了。

编辑-解释一下为什么会在您的情况下发生这种情况:纹理坐标 [1,1] 表示右下角纹素的右下角。启用线性过滤后,此位置将读取该角周围的四个像素。在重复纹理的情况下,其中三个位于屏幕的另一侧。如果你想手动防止这个问题,你必须限制在[0 + 1/texture_size, 1 - 1/texture_size]的范围内。

我也不确定你为什么要钳制到 [-1, 1],因为纹理坐标通常在 [0, 1] 范围内。负值将在纹理之外并由环绕模式处理。

【讨论】:

  • 谢谢。 -1 值是因为我启用了纹理环绕。现在我恢复到正常的纹理值,但现在我的图片是颠倒的。我想我需要以某种方式操纵纹理坐标。顺便说一句:我在四边形上使用了负 UV,以便将屏幕上下翻转。
  • 禁用重复并使用 1-uv.y 上下翻转。
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 2020-03-11
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 2019-11-17
相关资源
最近更新 更多