首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用OpenGL/GLSL的降尺度(下采样)技术实现布卢姆效应

利用OpenGL/GLSL的降尺度(下采样)技术实现布卢姆效应
EN

Stack Overflow用户
提问于 2015-05-17 02:27:57
回答 2查看 3.7K关注 0票数 2

你好,我正在尝试在我的程序中实现Bloom效果。事实上,我已经使用高亮传递和单独的高斯模糊传递实现了效果。

下面是一个例子:

明亮的过道纹理:

高斯模糊渲染传递(2次内部传递,用于此效果):

最后是最后一关(brightPass + BlurPass):

(我想确切地说,我还没有实现HDR音调映射)。

但我从英特尔找到了一篇非常有趣的文章:

代码语言:javascript
运行
复制
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),但是我不知道如何将它们绑定到我的着色器中!我真的迷路了。

提前谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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级别。

票数 1
EN

Stack Overflow用户

发布于 2015-05-17 08:45:43

属性访问着色器中的特定mipmap级别。

代码语言:javascript
运行
复制
gvec4 textureLod(gsampler2D sampler, vec2 P, float lod);

方法,其中lod指定mipmap级别。(链接到文档)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30282749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档