【发布时间】: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的演示(演示与我应用的几乎相同)。
链接:
正如你在图片中看到的那样,模糊出血效果比我的要强得多!你认为作者使用了几个卷积核(更高分辨率)?
我不明白的第一件事是高斯模糊算法如何使第三张图片上出现与白色(灰度值)不同的其他颜色。我非常仔细地观察(高变焦)明亮的图片(第二张),所有像素似乎都接近白色或白色(灰度)。有一件事是肯定的:明亮的纹理上没有蓝色或橙色像素。那么我们如何解释从图 2 到图 3 的这种转变呢?这对我来说很奇怪。
我不明白的第二件事是图片3、4、5和6之间的模糊出血效果差异很大!在我的演示中,我使用了 35x35 卷积核,最终结果接近这里的第三张图片。
你如何解释这样的差异?
PS:请注意,我使用 GL_HALF_FLOAT 和 GL_RGBA16F 像素内部格式来初始化布隆渲染通道纹理(所有其他渲染通道都初始化为 GL_RGBA 和 GL_FLOAT 数据类型)。
我的程序有问题吗?
非常感谢您的帮助!
【问题讨论】: