如何在OpenGL中实现抗锯齿?


28

我想在OpenGL中进行全屏抗锯齿,并且不想使用OpenGL本身提供的抗锯齿功能,因为我正在构建游戏并希望在其中获得良好的效果。

我应该如何进行?


通过“ GL本身提供的抗锯齿”,您是指标记为“抗锯齿”的较旧的名称不正确的线和面质量提示,还是通过GLX / WGL视觉效果使用常规MSAA?
拉尔斯·维克隆德

Answers:


28

在OpenGL中,有多种替代本机MSAA的方法。有了后处理效果,关于它们的最好的事情就是您通常可以将着色器扔到未经处理的最终图像中,其余的事情就可以完成。以下是三种值得一看的方法:

  • 快速近似抗锯齿(Geeks3D) -在大多数情况下都很好。相当容易应用和理解。缺点是尖锐的,纹理中的高对比度噪点有些模糊。像传统的MSAA一样,只有1/4像素陡峭的边缘看起来非常精确。陡峭程度的降低都会降低精度。

  • 常规过滤抗锯齿(GameDev)-尚未对此进行准确测试,但这是最容易理解的。在最佳情况下,它类似于16倍MSAA,在最坏情况下,它类似于2倍MSAA。它会生成一个临时法线贴图,以表示边缘和相对角度。您可以使用亮度差异或颜色差异对法线贴图进行采样。

  • 形态抗锯齿(Iryoku) -已改进为SMAA-亚像素Mophologic AA。4次通过时它非常复杂,但是达到了我见过的最佳结果。它沿边缘创建渐变,渐变为1/100到1/200像素的陡峭(!)。采样可以基于亮度,基于颜色或基于深度。纹理保持非常清晰和干净。(该示例基于DX10和HLSL,将需要一些时间才能将其准确地移植到GLSL)

这些技术不会进行超级采样或多次采样,因此,粗细小于1个像素的线条将出现间隙,并且无法正确消除锯齿。这是使用非MSAA方法的缺点。由于仅使用全分辨率的光栅图像,因此无法从这些空白中创建其他信息。

请注意,所有这些技术都取决于对相邻亮度(亮度)或色度(颜色)值的采样。计算亮度和可选的伽玛校正需要在AA着色器上附加说明,尽管这非常简单。您可以通过在提供未修饰图像的上一个着色器中计算亮度来减轻这种负担,并将亮度存储在alpha通道中。然后,在AA着色器中,您只需采样Alpha。


7

有很多方法可以进行抗锯齿。一种是使用多重采样抗锯齿(MSAA),其中后缓冲区实际上存储了多个子像素采样,并且当渲染三角形,直线等时,系统会自动在每个像素中填充正确的采样集。然后,在渲染结束时,通过对所有子像素样本求平均值以每个像素获得一个样本来“解析”图像。

另一种方法是使用后处理抗锯齿,在该处理中,您可以正常渲染场景,然后对最终结果进行一些有针对性的模糊处理以隐藏锯齿边缘。为此有多种技术,但目前最流行/最受欢迎的技术之一是FXAA(快速近似抗锯齿)。

MSAA通常会提供比后处理AA更好看的结果,但是会慢一些,因为它每次绘制操作都需要大约两倍的内存带宽。MSAA还可能需要比后处理AA更多的视频内存,具体取决于设置的细节。

您可以找到有关在网络上实施MSAA或FXAA的特定信息-只需在Google中搜索其中一项即可。


2

您愿意编写自己的GLSL着色器吗?如果是这样,请检查教程。


好吧,我想使用着色器完成此操作,因为即时消息也将着色器用于其他效果。能否为着色器提供其他链接
点头
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.