3

我的应用程序将第一个场景渲染为绑定到 FBO 的纹理,然后计算着色器对纹理图像进行一些处理并将其写入另一个纹理,然后我将其用于渲染第二个场景。一切都好。

现在我想对第一个场景进行抗锯齿处理,因此我创建了一个多重采样纹理并将其绑定到 FBO,然后再进行渲染。在计算着色器中,我使用imageLoad(buf, pos, sample)image2DMS(而不是imageLoad(buf, pos)image2D)读取所有样本并计算片段的平均值,但看起来所有样本都具有相同的值。

在我提取相关代码并将它们组合成一个简单的测试程序之前,我想知道我是否理解多样本模型,以及我正在尝试做的事情是否可能。我一直在 Windows 7 中使用 OpenGL 4.3 的 nVidia GTX 660 上运行,驱动程序 9.18.13.4052,2014 年 7 月。

4

1 回答 1

1

我认为您应该查看多重采样(MSAA)和超级采样(SSAA)之间的区别。

多重采样使用多重采样深度和颜色目标。当您的几何图元被光栅化时,它会根据您的所有样本进行检查以确定其覆盖范围。之后,每个像素只调用一次片段着色器,并将结果复制到每个覆盖的样本。因此,您只有一个片段着色器实例在运行,您的图元覆盖像素内的所有样本。另一方面,当图元仅覆盖一个像素的一小部分时,仅针对该样本复制片段着色器颜色。因此,只有当基元覆盖该像素中的特定样本时,您才能在一个像素中收集 n 个样本不同的颜色。

超级采样更容易理解,并且需要更多的计算能力。超级采样为每个样本调用一个片段着色器实例。因此,即使相同的图元覆盖相同像素中的所有样本,您也会得到不同的颜色。

在 OpenGL 中,您可以使用 glMinSampleShading 选项从 MSAA 无缝移动到 SSAA。此设置描述了至少每个像素必须执行多少个片段着色器实例。该值是样本数量的一个因子 (0.0-1.0)。因此,如果您选择 1.0 的因子,您将获得超级采样。

由于 MSAA 仅涉及基于不同图元的附加片段着色实例,因此可以将其视为基于纯几何的 AA。因此,例如基于 Alpha 纹理的混叠无法解决。这就是为什么一些网站将 glMinSampleShading 选项也称为 MSAA 的透明度示例的原因。

我推荐这篇描述得很好的和图解的 AA 概述以供进一步阅读: https ://mynameismjp.wordpress.com/2012/10/24/msaa-overview/

于 2015-07-26T10:04:04.823 回答