【问题标题】:Bloom effect using downscaling (downsampling) technique using OpenGL/GLSL使用 OpenGL/GLSL 的缩减(下采样)技术的 Bloom 效果
【发布时间】:2015-05-17 02:27:57
【问题描述】:

您好,我正在尝试在我的程序中实现 Bloom 效果。事实上,我已经使用高光通道和单独的高斯模糊通道实现了效果。

这是一个例子:

明亮的传递纹理:

高斯模糊渲染通道(此效果的 2 个内部通道):

最后是最后一关(brightPass + BlurPass):

(我想准确地说我还没有实现 HDR 色调映射)。

但是我从intel发现了一篇非常有趣的文章:

https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom

上面写着:

“首先执行亮通,过滤掉低于指定阈值的值。然后将亮通输出缩小一半 4 倍。每个缩小的亮通输出用可分离的高斯滤波器模糊,然后添加到下一个更高分辨率的亮通输出。”

我了解它的工作原理,但我不了解如何使用 OpenGL 执行纹理缩减。但是我知道如果我使用具有 4 个 mipmap 级别的 glGenerateMipmap() 函数(在我的 FBO 的初始化时)我想我将直接使用所需格式(1/16、1/8、1/4 和 1)获得我的 4 个缩小纹理/2) 就像文章中写的那样。

但我的问题是我找不到这样做的方法!

是否存在一种方法来绑定使用 mipmaping 生成的其他纹理并在片段着色器中使用它们?我是否必须使用应用不同格式(1/16,...)的 4 个单独的 FBO 渲染明亮的通道 4 次。我认为这是一个解决方案,但性能可能不正确。我认为应该使用窗口最大大小渲染一次明亮的通道,然后使用已经加载到内存中的缩小纹理(mipmap),但我不知道如何将它们绑定并使用到我的着色器中!我真的迷路了。

非常感谢您的帮助!

【问题讨论】:

  • 在缩小图像尺寸时会遇到的一个问题是在将图像组合成最终形式时出现伪影。您必须在 Texture Size 、 Gaussian Blur Offset 和 Speed 之间找到最佳平衡点。纹理越小,您的高斯模糊偏移就越小,以避免屏幕上出现伪影。纹理越大,高斯模糊偏移越大,但着色器越慢。

标签: opengl glsl shader


【解决方案1】:

您可以按照 BDL 的建议使用 textureLod,但我认为没有真正需要这样做。 生成所需的 mipmap 级别后,将根据活动渲染缓冲区的大小自动选择正确的级别。 您提到的文章的主要思想是,他们对不同大小的源执行几个模糊步骤。 生成 mipmap 级别后,您将拥有 4 个 mipmap 级别,它们代表来自明亮通道的 1/16、1/8、1/4 和 1/2 缩放纹理。 您应该使用相同大小的渲染缓冲区(分别为 1/16、1/8、1/4 和 1/2)来模糊每个缓冲区。 如果渲染缓冲区,您要渲染到来自明亮通道的源纹理的 1/16 比例,则将使用第 4 个 mipmap 级别。所以你不需要手动指定 mipmap 级别。

【讨论】:

  • 感谢您的回复。举个例子:bright pass纹理格式是1024x720。让我们尝试恢复 mipmap 级别 3 (128x90)。就像你说的,我只需要创建一个附加的 FBO 和 RBO + 纹理(因此颜色纹理和 RBO 使用尺寸 128x90 进行初始化)。因此,当我执行模糊过程时,我将高斯模糊算法应用于 128x90 明亮纹理(mipmap 级别 3)。但问题是我需要模糊 1024x720 纹理(最大精度)。所以我认为正确的解决方案就像你说的在片段着色器中使用函数 textureLod。你同意吗?
  • 我想我需要在应用模糊效果之前将低级别纹理重新缩放到更高级别但保持低分辨率(128x90 -> 1024x720)。我认为输入明亮渲染通道纹理的中间渲染通道并恢复我的 4 个缩小的明亮纹理。接下来我需要做的就是在模糊通道中分别绑定它们。就像我的 FBO(进入模糊通道的那个)在 1024x720 中缩放一样,这次模糊算法将应用于 1024x720 低级纹理。您对此有何看法?
  • 但我认为函数 textureLod 应该避免中间渲染通道并直接进入模糊通道,在我的片段着色器中选择正确级别的 mipmap。
  • @user1364743,你说:Let's take an example: the bright pass texture format is 1024x720. Let's try to recover the mipmap level 3 (128x90). Like you said I just have to create a FBO and RBO + texture attached to it (so the color texture and the RBO are initialized with the dimension 128x90). So when I execute my bluring pass I apply the gaussian blur algorithm on a 128x90 bright texture (mipmap level 3).你完全正确。您不需要以最大分辨率执行模糊。
  • 没有任何意义。缩小图像的模糊并不像模糊原始图像那样昂贵,而结果几乎相同。
【解决方案2】:

您可以使用着色器访问特定的 mipmap 级别

gvec4 textureLod(gsampler2D sampler, vec2 P, float lod);

方法,其中 lod 指定 mipmap 级别。 (link to documentation)。

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多