你好,我正在尝试在我的程序中实现Bloom效果。事实上,我已经使用高亮传递和单独的高斯模糊传递实现了效果。
下面是一个例子:
明亮的过道纹理:
高斯模糊渲染传递(2次内部传递,用于此效果):
最后是最后一关(brightPass + BlurPass):
(我想确切地说,我还没有实现HDR音调映射)。
但我从英特尔找到了一篇非常有趣的文章:
https://software.intel.com/en-us/articles/compute-shader-hdr-and-bloom
它说:
“首先执行亮通,将低于指定阈值的值过滤掉。然后将亮通输出缩小一半4倍。每个缩小的亮通输出都用可分离的高斯滤波器模糊,然后添加到下一个更高分辨率的亮通输出中。”
我理解它是如何工作的,但我不知道如何使用OpenGL执行纹理缩小。但是,我知道如果我在4个mipmap级别上使用glGenerateMipmap()函数(在FBO的初始化时),我想我的4个缩小纹理将像本文中所写的那样,直接使用所需的格式(1/16、1/8、1/4和1/2)。
但我的问题是我找不到办法做到这一点!
它是否存在一种方法来绑定使用mipmaping生成的其他纹理并在片段着色器中使用它们?如果我必须渲染4次光明传球与4分离FBO应用不同的格式(1/16,.)。我认为这是一个解决方案,但它可能不正确的表现。我认为明亮的通行证应该使用窗口的最大尺寸来渲染一次,然后使用已经加载在内存中的缩小纹理(mipmap),但是我不知道如何将它们绑定到我的着色器中!我真的迷路了。
提前谢谢你的帮助!
发布于 2015-05-17 13:33:08
正如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级别。
发布于 2015-05-17 08:45:43
属性访问着色器中的特定mipmap级别。
gvec4 textureLod(gsampler2D sampler, vec2 P, float lod);
方法,其中lod指定mipmap级别。(链接到文档)。
https://stackoverflow.com/questions/30282749
复制相似问题