很多玩家对于游戏“锯齿”现象并不陌生,这种在场景物体边缘产生的锯齿样形变常常令玩家感到不爽。除了不美观以外,还会造成一些闪烁的不适感。
这种锯齿的产生原因是什么?为了减少这种现象,计算机图形领域又做出了怎样的对抗?本文会一一解答这些问题。
锯齿的产生,其实是计算机图形原理上的问题。
真实世界中的场景的图像信号是连续的,当你使用照相机去拍下一张照片,实际上就是对真实世界做了一次“采样”。因为计算机里的图像是由一个个像素单位组成的,每个单位都是独立的个体,每个像素都储存一个颜色信息,这就是计算机、手机等记录图像的一个特性——离散化。
同样在三维渲染领域中,三维的场景就相当于“真实世界”,它们所记录的信号是连续的。但是计算机将三维场景完成渲染(这一步骤就相当于相机记录光学信息)之后,还需要将渲染出来的场景映射到屏幕像素上面。映射到屏幕像素,就代表本来连续的信号,被一个个像素采样了,原本连续的信号变成离散的信号,就会导致一部分信息的丢失。
举个例子,这是一个还没有映射到屏幕像素上的已经被渲染好的三角形。(图片来自Beyond3D网站中的《Diving into Anti-Aliasing》)
按照屏幕像素映射规则:每个像素块的中心点如果在三角形的区域内,那么我们就将该像素的颜色信息记为1(在这里就是100%的白色);如果像素的中心点不在渲染出来的三角形区域内,那这个像素的颜色信息就是0(在这里就是100%的黑色)。
按照这个映射规则,最终到达屏幕上的三角形,就出现了信息丢失,这就是锯齿产生的根本原因。也就是说,锯齿是一个“不得不”产生的东西,它是原理性的问题。自然世界的信号是连续的无穷的,但是计算机不能够处理无限多的信号,只能使用这种“离散化”的取样方式,去大致的记录自然世界的色彩。也就是说,照片在诞生的那一刻,就注定是“折衷”了的效果,是一种不完全和现实世界中一样的效果。
锯齿的产生使得实时渲染画面质量大打折扣,计算机图形领域也开发了很多的技术去抵抗锯齿带来的影响,这些技术统称“抗锯齿技术”,即我们经常在游戏里看到的“抗锯齿”选项。
抗锯齿的其中一个原理就是对每个像素多增加一些采样点(原本只有一个采样点,就是像素中心点),根据采样点落入三角形区域的多少,来衡量这个像素应该记录多少颜色信息。这一过程相当于平滑了锯齿的边缘,因为原本只有100%的黑和100%的白,而抗锯齿带来了一些中间色,就可以减少锯齿的锐利性,从而也减少了锯齿。
关于抗锯齿技术的内部细节还很复杂,不同的抗锯齿技术,采用的具体方法也不一样,而且也不是每一个抗锯齿技术都是使用增加采样点的方式来进行的,本文篇幅有限不再赘述。
游戏里常见的抗锯齿技术,在这里笔者会做简要介绍。
FXAA(Fast Approximate Anti-Aliasing,快速近似抗锯齿),这是一种效果一般但是开销低的抗锯齿方案,在相当多的游戏里都有应用。这种抗锯齿技术并不会很大程度优化画面,但也不会对系统有过多的负担。
FSAA(Full Screen Anti-Aliasing,全屏抗锯齿)或称为SSAA(Super Sampled Anti-Aliasing,超级采样抗锯齿),这种抗锯齿技术虽然效果相对好一些,但是设计上非常极端,以至于一般的机器不会选择去开启。这种抗锯齿方法通常需要成倍的GPU性能作为代价,来生成一个相对平滑的效果
MSAA(MultiSampled Anti-Aliasing,多重采样抗锯齿),MSAA是针对FSAA(SSAA)进行优化的一种方案,开销没有FSAA(SSAA)那么恐怖,还原度也很好。
TXAA(Temporal Anti-Aliasing,也称TAA,时间性抗锯齿),是NVIDIA开发的一种抗锯齿方案,效率和效果兼得,是一种很先进的抗锯齿技术。但是会一定程度上导致画面的模糊。
DLSS(Deep Learning Super Sampling,深度学习超级采样),是伴随着NVIDIA RTX技术而生的一种新型抗锯齿方案,将传统的由本机进行操作的超级采样部分的工作由深度学习去完成。如今DLSS2.0已经推出,效果和效率上都有了一定的保障,但是在游戏内的支持率还比较低。