【问题标题】:HDR Bloom effect rendering pipeline using OpenGL/GLSL使用 OpenGL/GLSL 的 HDR Bloom 效果渲染管线
【发布时间】:2015-08-05 19:14:48
【问题描述】:

我已经使用 OpenGL 和 GLSL 集成了Bloom HDR 渲染......至少我认为!我不太确定结果。

我遵循了英特尔网站上的教程:

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

关于高斯模糊效果,我严格遵循以下网站上有关性能的所有建议:

https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms

根据第一个网站:

“然后将亮通输出缩小一半 4 倍。每个缩小的亮通输出用可分离的高斯滤波器进行模糊处理,然后添加到下一个更高分辨率的亮通输出。最终输出是 ¼ 大小的布隆在色调映射之前对其进行上采样并添加到 HDR 输出中。”

这是bloom pipeline(上图取自NSight NVIDIA Debugger)。

在我的测试中,窗口的分辨率是 1024x720(为了这个算法的需要,这个分辨率将被缩小 4 倍)。

第 1 步:

Lighting pass(材质pass + shadow mask pass + skybox pass的混合):

第 2 步:

将hight light信息提取到bright pass(准确的说是生成了4个mipmaps纹理(“bright pass output is then downscale by half 4 times” -> 1/2, 1/4, 1/8 and finally 1/2)):

第 3 步:

“每个缩小的亮通输出都使用可分离的高斯滤波器进行模糊处理,然后添加到下一个更高分辨率的亮通输出。”

我想准确地说,双线性过滤已启用 (GL_LINEAR),上面图片上的像素化​​是在 NSight 调试器窗口 (1024x720) 上调整纹理大小的结果。

a) 分辨率 1/16x1/16 (64x45)

“1/16x1/16 模糊输出”

b) 分辨率 1/8x1/8 (128x90)

“1/8x1/8 缩小的亮通,结合 1/16x1/16 模糊输出”

“1/8x1/8 模糊输出”

c) 分辨率 1/4x1/4 (256x180)

“1/4x1/4 缩小的亮通,结合 1/8x1/8 模糊输出”

“1/4x1/4 模糊输出”

d) 分辨率 1/2x1/2 (512x360)

“1/2x1/2 缩小的亮通,结合 1/4x1/4 模糊输出”

“1/2x1/2 模糊输出”

为了达到所需的 mipmap 级别,我使用 FBO 调整大小(但使用在初始化时已经调整大小的单独 FBO 而不是多次调整同一个 FBO 可能会更聪明。您如何看待这个想法?)。

第 4 步:

色调映射渲染通道:

在此之前,我想就我的工作获得外部建议。是否正确?我不太确定结果,尤其是关于第 3 步(缩小和模糊部分)的结果。

我觉得模糊效果不是很明显!但是我使用了一个 35x35 的卷积核(我认为这已经足够了 :))。

但我真的对 pdf 上的一篇文章很感兴趣。这是bloom pipeline的演示(演示与我应用的几乎相同)。

链接:

https://www.google.fr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCMQFjAA&url=https%3A%2F%2Ftransporter-game.googlecode.com%2Ffiles%2FRealtimeHDRImageBasedLighting.pdf&ei=buBhVcLmA8jaUYiSgLgK&usg=AFQjCNFfbP9L7iEiGT6gQNW6dB2JFVcTmA&bvm=bv.93990622,d.d24

正如你在图片中看到的那样,模糊出血效果比我的要强得多!你认为作者使用了几个卷积核(更高分辨率)?

我不明白的第一件事是高斯模糊算法如何使第三张图片上出现与白色(灰度值)不同的其他颜色。我非常仔细地观察(高变焦)明亮的图片(第二张),所有像素似乎都接近白色或白色(灰度)。有一件事是肯定的:明亮的纹理上没有蓝色或橙色像素。那么我们如何解释从图 2 到图 3 的这种转变呢?这对我来说很奇怪。

我不明白的第二件事是图片3、4、5和6之间的模糊出血效果差异很大!在我的演示中,我使用了 35x35 卷积核,最终结果接近这里的第三张图片。

你如何解释这样的差异?

PS:请注意,我使用 GL_HALF_FLOAT 和 GL_RGBA16F 像素内部格式来初始化布隆渲染通道纹理(所有其他渲染通道都初始化为 GL_RGBA 和 GL_FLOAT 数据类型)。

我的程序有问题吗?

非常感谢您的帮助!

【问题讨论】:

    标签: opengl glsl shader


    【解决方案1】:

    模糊的小分辨率纹理似乎不够模糊。我认为过滤器的宽度(不是样本数,而是样本之间的距离)或帧缓冲区大小存在问题。

    假设您有 150x150 的原始 fbo,这是一个 15x15 缩小版的bloom。并且您使用 15x15 模糊滤镜。

    模糊的高分辨率版本会影响明亮部分周围的 7px 描边。 但是在模糊低分辨率图像的同时,内核的宽度实际上会影响整个图像区域。在低分辨率下,7px 笔画意味着 - 整个图像区域。因此,模糊低分辨率版本中的所有像素都会对最终合成图像有一定的贡献。因此,高分辨率模糊图像会在明亮部分周围的 7px 笔划中产生模糊,而低分辨率模糊图像会在整个图像区域产生相当大的差异。

    您的低分辨率图像似乎不太模糊,因为它们的贡献仍然保持在明亮部分周围 35/2 像素的笔划内,这是错误的。

    我希望我设法解释出了什么问题。究竟要改变什么,可能是在模糊低分辨率图像时视口大小,但我不能 100% 确定。

    【讨论】:

    • 非常感谢!实际上,我将坏视口作为统一变量发送到我的高斯模糊着色器(它始终设置为我的原始窗口分辨率 -> 1024*720)。所以每个像素偏移的平均值是完全错误的。再次感谢你的帮助!再见。
    • 能否请您上传带有修复的图片,以便其他人了解问题所在?干杯,祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2015-05-10
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多