【发布时间】: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 之间找到最佳平衡点。纹理越小,您的高斯模糊偏移就越小,以避免屏幕上出现伪影。纹理越大,高斯模糊偏移越大,但着色器越慢。