使用OpenGL/GLSL的HDR Bloom效果渲染管道

use*_*743 7 opengl shader glsl

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

我按照英特尔网站的教程:

https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom
Run Code Online (Sandbox Code Playgroud)

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

https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms
Run Code Online (Sandbox Code Playgroud)

根据第一个网站:

"然后将明亮的通过输出缩小了4倍.每个缩小的亮通输出都用可分离的高斯滤波器模糊,然后加到下一个更高分辨率的亮通输出.最终输出是1/4大小的绽放,向上采样并在色调映射之前添加到HDR输出."

这是bloom流水线(上面的图片来自NSight NVIDIA Debugger).

我测试中窗口的分辨率是1024x720(对于这种算法的需要,这个分辨率将缩小4倍).

步骤1:

照明传递(材质传递+阴影蒙版传递+天空盒传递的混合):

在此输入图像描述

第2步:

将高光信息提取到明亮的通道中(准确地说,生成4个mipmaps纹理("亮通过输出然后缩小半个4倍" - > 1/2,1/4,1/8最后1/2 )):

在此输入图像描述

第3步:

"每个缩小的明亮通道输出都用可分离的高斯滤波器模糊,然后加到下一个更高分辨率的亮通输出."

我想确切地说,双线性过滤是启用的(GL_LINEAR),上面图片中的pexilization是将纹理大小调整到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会更聪明,而不是多次调整相同的大小.你怎么看待这个想法?).

第4步:

色调映射渲染过程:

在此输入图像描述

在此之前,我想对我的工作提出外部建议.它是否正确?我不太确定第3步(降尺度和模糊部分)的结果.

我认为模糊效果不是很明显!但是我使用卷积内核35x35(我认为这就足够:)).

但我真的对一篇关于pdf的文章很感兴趣.这是bloom管道的演示文稿(演示文稿与我应用的演示文稿非常相似).

在此输入图像描述

链接:

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像素内部格式初始化bloom渲染通道纹理(所有其他渲染通道初始化为GL_RGBA和GL_FLOAT数据类型).

我的程序有问题吗?

非常感谢您的帮助!

Abs*_*thm 1

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

假设您有 150x150 的原始 fbo,aa 15x15 的 Bloom 缩小版本。并且您使用 15x15 模糊滤镜。

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

你的低分辨率图像看起来不太模糊,因为它们的贡献仍然保留在明亮部分周围的 35/2px 笔划内,这是错误的。

我希望我能解释出哪里出了问题。到底要改变什么,可能是视口大小,同时模糊低分辨率图像,但我只是不能 100% 确定。