我可以使用OpenGL计算着色器来解决多重采样纹理吗?

3
我的应用程序将第一个场景渲染到绑定到FBO的纹理中,然后计算着色器对纹理图像进行处理并将其写入另一个纹理中,我随后用它来渲染第二个场景。一切都很好。
现在我想让第一个场景抗锯齿,因此我创建了一个多重采样纹理,并在渲染之前将其绑定到FBO。在计算着色器中,我使用imageLoad(buf,pos,sample)image2DMS(而不是从image2D)读取所有样本并计算片段的平均值,但看起来所有样本的值都相同。
在我提取相关代码并将它们组合成一个简单的测试程序之前,我想知道是否我理解了多重采样模型,以及我尝试做的是否可行。我一直在nVidia GTX 660上运行,在Windows 7上使用OpenGL 4.3,驱动程序为9.18.13.4052,日期为2014年7月。

1
嗨,请在代码中使用引号:`code` - ArnonZ
@ArnonZilca,如果问题存在文本格式问题,您可以随时进行编辑 ;) - glampert
是的,但那样我就会错过教育价值了。 ;) 我正在审查这个问题。 - ArnonZ
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/

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