3

我的应用程序将第一个场景渲染为绑定到FBO的纹理,然后计算着色器对纹理图像执行一些处理并将其写入到另一个纹理,然后用于渲染第二个场景。一切都好。我可以使用OpenGL计算着色器来解析多重采样纹理吗?

现在,我想第一个场景是反锯齿,所以我创建了一个多重采样的纹理和渲染它之前绑定到FBO。在计算着色器,我使用imageLoad(buf, pos, sample)image2DMS(而不是imageLoad(buf, pos)image2D)读取读取所有样品和计算的片段的平均,但它看起来像所有的样品具有相同的值。

我拉出来之前的代码中的相关位,并把它们连成一个简单的测试程序,我想知道如果我理解多样品模型,如果我想要做的是甚至可能。我一直在使用Windows 7中的OpenGL 4.3,2014年7月的驱动程序9.18.13.4052运行nVidia GTX 660.

+1

你好,请用引号代码:\'代码\' – 2014-09-05 23:28:15

+0

@ArnonZilca,您可以随时修改有文本格式问题的问题;) – glampert 2014-09-06 02:28:53

+0

是的,但后来我想念教育价值。 ;)我正在评论这个问题。 – 2014-09-06 12:06:52

回答

1

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

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

超级抽样更容易理解,需要更多的计算能力。超级采样调用每个示例一个片段着色器实例。所以即使相同的基元覆盖了同一像素中的所有样本,也可以获得不同的颜色。

在OpenGL中你能够无缝地从MSAA移动到SSAA与glMinSampleShading选项。此设置描述每个像素至少需要执行多少个片元着色器实例。该值是您的样本数量的一个因子(0.0-1.0)。所以如果你选择一个1.0的因子,你会得到超级抽样。

由于该MSAA只涉及基于不同的原语附加片段着色的情况来看,它可以蜜蜂看作是一个纯几何基于AA。所以例如基于alpha纹理的混叠不能解决。这就是为什么一些网站调用glMinSampleShading选项为MSAA提供透明度样本的原因。

我建议进一步阅读这很好地描述和说明AA概述: https://mynameismjp.wordpress.com/2012/10/24/msaa-overview/