OpenGL 3.3中用于后处理效果的高效降采样

3
我了解绽放效果背后的想法:我们缩小纹理以保持卷积核小。现在我正在尝试实现它,但我不确定应该采取哪条路线。
我的第一个想法是使用glGenerateMipMap进行缩小。但是,我不能告诉它停在4步之后。对我来说它有点像个黑盒子。据我所知,它可能生成10张图像,从1024*768缩小到1*1,最后几步可能很便宜,因为一切都已经如此之小,但也可能不是这样。
我在谷歌上搜索发现,许多人都使用FBO而不是glGenerateMipMap。由于我使用延迟光照,所以我很熟悉FBO。我的第二个想法是简单地使用线性采样器在较小的纹理中渲染一个“四边形”。我会连续进行四次,每次将宽度和高度减半。然而,我发现有些人更喜欢使用自己的片段着色器进行下采样,而不是依赖于GL_LINEAR,我想知道为什么;也许这样更快?
有什么方法可以快速对我的全屏纹理进行四次下采样,并保留每个版本?我不需要复杂的边缘保留采样算法,因为我无论如何都会模糊一切。
1个回答

2

我们对纹理进行下采样以保持卷积核的大小。

或者你可以在第一次渲染bloom/glow层时使用较小的分辨率。这既可以节省填充率,又不需要之后再进行缩小。

我的第二个想法是简单地将“quad”用线性采样器渲染到较小的纹理中。

这并不是完全的下采样。它是在采样点之间进行线性插值,可能会产生伪影。


1
“bloom/glow层”,这假设存在一个“层”,而不仅仅是您渲染的HDR图像,您想要将其应用于bloom。 - Nicol Bolas
实际上,我没有为发光部分创建一个图层,只有一张HDR图像。 如果将其渲染到较小的纹理中,会出现什么样的伪影? - Niriel
1
@Niriel:如果采样数据包含高于子采样频率一半的频率,则通常会出现的典型伪影。这就是为什么首先应用模糊核的原因:它作为低通滤波器,以便子采样不会产生Moiree伪像或混叠(在信号理论意义上的混叠,而不是“块状边缘”的意义,尽管在数学上两种效应都相关)。 - datenwolf
当然!我的大脑糊涂了。这正是我们使用mipmap的原因,我已经习惯了它们,几乎忘记了平均采样器不是其中的一部分。很高兴你让我的思路回到正确的方向。所以,如果我调用 glTexParameter(GL_TEXTURE_MAX_LEVEL) 获取4个级别,然后生成mipmap,我会得到我想要的确切的4个图像吗? - Niriel
1
@Niriel:确实如此。您可以使用纹理级别参数控制glGenerateMimap创建哪些级别。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接