您好我试图在我的程序中实现Bloom效果。事实上,我已经使用高亮传递和单独的高斯模糊传递来实现效果。
以下是一个例子:
亮色纹理:
高斯模糊渲染传球(此效果有2次内部传球):
最后传球(brightPass + BlurPass):
(我想确切地说,我还没有实现HDR色调映射)。
但是我从英特尔发现了一篇非常有趣的文章:
https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom
它说:
"首先执行明亮传递,其中滤除低于指定阈值的值。然后将亮通输出缩小一半4次。每个缩小的明亮通道输出都使用可分离的高斯滤波器模糊,然后添加到下一个更高分辨率的亮通输出。"
我理解它是如何工作的但我不明白如何使用OpenGL执行纹理缩减。但是我知道如果我使用glGenerateMipmap()函数(在我的FBO初始化时)有4个mipmap级别,我想我会直接用所需的格式(1 / 16,1 / 8,1 / 4和1)进行4个缩小的纹理/ 2)喜欢它写在文章中。
但我的问题是我找不到办法做到这一点!
是否存在绑定使用mipmaping生成的其他纹理并在片段着色器中使用它们的方法?我是否应该使用4种不同格式(1/16,...)的FBO渲染4次亮光通道。我认为这是一个解决方案,但它的性能可能不正确。我认为明亮的传递应该使用窗口最大尺寸渲染一次,然后使用已经加载到内存中的缩小纹理(mipmap),但我不知道如何绑定并将它们用于我的着色器!我真的输了。
非常感谢您的帮助!
答案 0 :(得分:1)
您可以使用
访问着色器中的特定mipmap级别gvec4 textureLod(gsampler2D sampler, vec2 P, float lod);
方法,其中lod指定mipmap级别。 (link to documentation)。
答案 1 :(得分: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级别。