我的应用程序将第一个场景渲染到绑定到FBO的纹理中,然后计算着色器对纹理图像执行一些处理并将其写入另一个纹理,然后我将其用于渲染第二个场景。一切都很好。
现在我想要第一个消除锯齿的场景,所以我创建了一个多重采样纹理并在渲染之前将其绑定到FBO。在计算着色器中,我使用imageLoad(buf, pos, sample)
从image2DMS
(而不是imageLoad(buf, pos)
中的image2D
)读取所有样本并计算片段的平均值,但看起来所有样本都具有相同的值。
在我拿出代码的相关部分并将它们放在一个简单的测试程序之前,我想知道我是否理解多样本模型,以及我想要做的是什么可能。我一直在使用Windows 7中的OpenGL 4.3的nVidia GTX 660,2014年7月的驱动程序9.18.13.4052。
答案 0 :(得分:1)
我认为你应该查看多重采样(MSAA)和超级采样(SSAA)之间的区别。
多重采样使用mutlisampled深度和颜色目标。对几何图元进行栅格化处理时,会根据确定其覆盖范围的所有样本进行检查。之后,每个像素仅调用一次片段着色器,并将结果复制到每个覆盖的样本。因此,只有一个片段着色器实例在运行,其中基元覆盖像素内的所有样本。另一方面,当图元仅覆盖像素的一小部分时,仅对于该样本,复制片段着色器颜色。因此,只有当图元覆盖该像素中的特定样本时,才能在一个像素中收集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/