图形学篇 — 抗锯齿

Posted by Xun on Wednesday, September 28, 2022

屏幕显示画面是以像素格子输出显示的,往往边缘会出现一些锯齿状的效果,抗锯齿技术则可以较好地解决这种表现问题。

简介

  • 在基于像素的屏幕显示下,如果没有很好地采样和过滤,三角形的边缘会产生明显的锯齿效果。同样,阴影边界、镜面高光和其他颜色快速变化的现象也会导致类似的问题。为了提高这些情况下的渲染质量,需要采用抗锯齿技术(Antialiasing)。
  • 目前有很多抗锯齿技术,但并没有一种最好的抗锯齿技术,因为每种技术在质量、捕捉尖锐细节或其他现象的能力、移动过程中的外观、内存成本、GPU需求和速度方面都有不同的优势。因此,需要根据实际需求和应用场景来选择最适合的抗锯齿技术方法。

SSAA

  • SSAA(Supersampling Antialiasing),也叫 FSAA(Full-Scene Antialiasing),通过更高的分辨率来渲染场景,然后过滤邻近的样本,生成显示图像。例如,假设需要 1280 × 720 像素的图像,就渲染 2560 × 1440 像素的图像,然后对的每个 2 × 2 像素区域求平均值,生成所需的图像,即最终图像每个像素有四个子样本。 SSAA_1.png
  • SSAA 的优势是简单,但缺点也非常明显,因为每个子样本都必须要填充和着色,并且需要有深度值,每个图像需要处理和存储的数据都是原来的4倍,所以性能成本较高。这种方法有其他低质量版本,即仅在一个屏幕轴上以两倍的速率采样,称为 1 × 2 或 2 × 1 超抽样,一定程度上可以降低性能压力。 SSAA_2.png

MSAA

  • MSAA(Multisampling Antialiasing),通过每像素计算一次表面的着色,并在样本之间共享这一结果,减少了高昂的计算成本。每个像素可能有4个样本点,每个子样本都有自己的颜色和深度,但是对于应用到像素上的每个对象片段,像素着色器只计算一次。 MSAA_1.png
  • 如上图所示,正方形为一个像素,而 0 ~ 3 分别为四个样本点,采样时,检查每个点是否在三角形内,以及每个点的深度值是否比缓冲区的值小。如果满足条件,则该样本点会对这个像素产生作用。可以看到,在这个像素中,对于这个三角形,只有点 1 和点 2 会产生作用,根据覆盖的样本点和边界信息,硬件上确定一个着色计算的位置,对像素进行一次着色计算,再计算结果更新到样本点。当所有三角形计算完后,像素中心的颜色即为四个样本点的颜色平均值。
  • 和 SSAA 相比,MSAA 同样需要更大的缓冲区来记录样本点的颜色和深度信息,但是对于每个三角形,每个像素只需要进行一次着色计算,效率明显提高。因此, MSAA 也是应用比较广泛的抗锯齿方案。

TAA

  • TAA(Temporal Antialiasing),使用前一帧的结果来改进图像的技术。在 TAA 之前,MSAA 是实时引擎中使用最多的抗锯齿技术。然而在延迟渲染中, MSAA 并不能有很好的效率。一方面,延迟渲染将每个像素的光照、法线、深度信息存入到 G-buffers 中,在 2 x MSAA 下,每个像素需要 4 个子样本点,所以需要 G-buffers 也需要扩大为原来的 4 倍,在移动端上会有很大的压力。另一方面,由于渲染时已经没有边界信息,所以 MSAA 的硬件加速失效,MSAA 不得不退回消耗更大的 SSAA 。因此,MSAA 方案在延迟渲染中难以达到前向渲染一样的作用。而 TAA 通过从前一帧重新投影得到着色结果,有效地分摊了连续帧上每个像素着色多个样本的成本,并在单样本着色的基础上以很小的成本实现了超采样。从质量的角度来看,与单帧后处理抗锯齿技术相比,TAA不仅更有效地抑制了锯齿,而且产生了更稳定的时间结果。 TAA_1.png
  • TAA 的大致流程如上图所示,在第 N 帧之前为每个像素收集了一些样本(红色点),并已被混合并作为每像素(橙色点)的颜色值存储在历史缓冲区中。对第 N 帧中的每一个像素,通过运动向量(motion vector)会映射到上一帧该位置对应的像素,得到颜色值,该颜色值也就是以前累积的样本的混合值。然后,对于当前帧 N ,在抖动的位置着色一个新的样本(绿色点),并将结果与重新采样的历史颜色合并,最终得到该像素的最终颜色(蓝色点)。第 N 帧这个像素的颜色,也将作为 N + 1 帧的历史颜色。

MLAA

  • MLAA(Morphological Antialiasing),是基于图像处理的技术。通过查找给定图像中像素之间的不连续性,确定形成边缘的可能方向,再根据边界对像素的覆盖范围大小,将相邻颜色按比例混合到中心像素,从而得到扛锯齿效果。FXAA(Fast Approximate Antialiasing)、SMAA(Enhanced Subpixel Morphological Antialiasing)都是同样的技术,FXAA 发展得到了 MLAA,MLAA 再进一步发展到 SMAA,但主要处理思想都是一致的。 MLAA_1.png
  • 如图所示,可以看到(1)中存在锯齿边界,边界大体上如(2)中红色线所示,边界处实际的颜色应该如(3)中所示,将边界经过的像素的颜色,按照占比对混合后,得到(4)即为抗锯齿处理后的表现。由于是在后处理中进行的处理,所以效率也相对较高。

总结

  • 抗锯齿技术目前有很多方案,在这几类方案的基础上,也有很多优化或类似的方案,常用的方案主要就是这几种类型,这里只介绍了主流方案的大致实现,更多的实现细节需要深入研究总结。了解了基本的方案实现后,对于不同的应用场景,不同的硬件设备,基本上能选择相对合适的技术方案。

参考