多重采样是如何工作的?

12

我对多重采样技术如何工作非常感兴趣。我已经找到了很多关于如何启用或使用它的文献,但是对于它实际上是如何实现抗锯齿渲染的信息很少。在许多地方,我发现有冲突的信息只会让我更加困惑。

请注意,我知道如何启用和使用多重采样(我实际上已经在使用它),我不知道真正进入多重采样渲染缓冲区/纹理的数据类型以及该数据在渲染管线中如何使用。

我可以很好地理解超级采样是如何工作的,但多重采样仍有一些模糊的地方需要理解。

以下是规范中的说明:(OpenGL 4.2)

像素采样值,包括颜色、深度和模板值,都存储在这个缓冲区(多重采样缓冲区)中。每个片段颜色都包含单独的颜色值的样本。

...

在多重采样渲染期间,像素片段的内容会以两种方式进行更改。首先,每个片段都包括一个带有SAMPLES位的覆盖值。

...

其次,每个片段都包含多个深度值和相关数据的集合而不是单个深度值和关联数据,这与单一采样渲染模式下维护的相同。

因此,每个样本都包含不同的颜色、覆盖率和深度。与普通的超级采样有什么区别?对我来说,它似乎是一种“加权”超级采样,其中每个最终像素值由其样本的覆盖值确定,而不是简单的平均值,但我非常不确定。那样本级的纹理坐标呢?

如果我将法线存储在RGBF的多重采样纹理中,那么我是否可以在多边形边缘读取到“抗锯齿”(即逐渐接近0)的值?

每个片段着色器会针对每个片段调用一次,除非它使用gl_SampleID、glSampleIn或具有'sample'存储限定符。如何实现让片段着色器在每个片段上调用一次并获得抗锯齿渲染?


NVIDIA的解释:http://www.nvidia.com/object/feature_hraa.html - The Nail
抱歉,但此链接完全没有提供有关微软的工作原理的信息,您甚至可以从维基百科获得更好的信息。 - user815129
这是一场2007年斯坦福CS讲座:http://graphics.stanford.edu/courses/cs248-07/lectures/2007.10.11%20CS248-06%20Multisample%20Antialiasing/2007.10.11%20CS248-06%20Multisample%20Antialiasing.ppt,可惜它没有引用任何来源。 - The Nail
实际上,它们确实引用了来源:http://graphics.stanford.edu/courses/cs248-07/schedule.php,但您需要订阅才能查看文章。 - The Nail
还有来自OpenGL网站的技术规范(1994年),但也许你已经看过了。它详细解释了如果启用MULTISAMPLE_SGIS会发生什么:http://www.opengl.org/registry/specs/SGIS/multisample.txt - The Nail
最后.. 这很有趣。SGIS规格有点老旧(1994年),但给出了多采样功能的深入视图,我想OpenGL基本上是以这种方式实现了多采样.. - user815129
1个回答

7

硅图系统上的OpenGL:

http://www-f9.ijs.si/~matevz/docs/007-2392-003/sgi_html/ch09.html#LE68984-PARENT

提到:当您使用多重采样并读取颜色时,您会获得已解决的颜色值(即样本的平均值)。当您读回模板或深度时,通常会返回单个样本值而不是平均值。此样本值通常是最靠近像素中心的值。

还有来自OpenGL网站的技术规格(1994年)。如果启用了MULTISAMPLE_SGIS,它会详细说明正在执行的内容: http://opengl.org/registry/specs/SGIS/multisample.txt

请参阅相关问题:在多重采样时,OpenGL纹理中的深度值是如何解决的?

以及这个问题的答案,建议使用GL_MULTISAMPLE_ARB:GL_MULTISAMPLE定义在哪里?。 GL_MULTISAMPLE_ARB的规格(2002年)在这里:http://www.opengl.org/registry/specs/ARB/multisample.txt


非常好,感谢您提供有关多重采样问题的参考。 - user815129

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