前言

前文说了光栅化阶段是如何将三角形的顶点转化成屏幕上的像素的(实际是转化为了片元,可以简单理解成像素),得到了如下图左边的图片,将所有红点所在的像素填充颜色后,就得到了中间的图片,但是与最右边想要得到的效果相对比,还是差了很远,出现了严重的锯齿问题。

 

这种问题出现的原因就是采样(Sampling)时出现了走样(Aliasing)问题,而用来修复走样的技术就被称为反走样(Anti-Aliasing),本篇就仔细介绍一下这三个概念。

 

采样(Sampling)和走样(Aliasing)

采样在计算机图形学中是一个广泛使用的概念,指的是用有限离散的点去模拟连续的各种维度,因为在现实中的很多概念,例如时间、尺寸、面积、体积、方向等都是可以无限细分下去的,换言之细节无限多,不可能在计算机中模拟出所有的细节,甚至为了计算、存储、传输的效率,会主动放弃掉一些细节。

比如游戏和电影通过帧率fps来对时间进行采样时精度只有几十分之一秒,显示器通过sRGB色彩模式对颜色进行采样时精度只有几百万种颜色,图片通过像素分辨率对面积进行采样时精度只有几百万个点等等。

就像下面的图片,在一个复杂曲线上均匀采样,采样点越少,则采样结果与真实曲线偏差越大。

这种因为采样频率过低导致的误差,就被称为走样。

再回到开头的三角形,和用点采样曲线类似,用有限的像素点去采样连续的图形,自然也会出现这种走样的现象,因为频率太低,遗漏了绝大多数细节,效果肯定是不准确的。

 

反走样(Anti-Aliasing)

要解决上述问题,就需要用到反走样技术,或者说抗锯齿技术,也就是通称的AA。

下面就介绍一下常用的几种反走样算法。

 

超采样反走样(Super Sampling AA)

SSAA的想法其实是非常直观的,既然频率太低导致走样,那就增加频率,用更多的采样点去采样不就会得到更好的结果了吗?

所以根据这个思想把原来的每个像素点进行细分,比如下例中,将每个像素点细分成了4个采样点,实际采样频率是原来的4倍,得到更多的细节:

根据每个采样点来进行着色,这样得到了每个采样点的颜色之后,将每个像素点内部所细分的采样点的颜色值全部加起来再求均值,作为该像素点的抗走样之后的颜色值!结果如下:

仔细观察可以发现因为将4个采样点的颜色求均值之后,有些靠近三角形边缘的像素点变淡了,从宏观角度来看的话,就是用更高的分辨率去进行着色,再把得到的结果缩小回原来的分辨率,这样边缘变得模糊了,锯齿就不那么明显了。

例如下面这个例子,相对于左侧,做了反走样的右侧锯齿效果明显改善。

SSAA并不局限于分成4个,也可以分得更多,可以自己决定,如果喜欢玩大型游戏的人一定知道游戏画质设置里经常有一个抗锯齿的选项,其中的 X2、X3、X4,分别代表的就是4个,9个,16个采样点,显然采样点越多抗锯齿效果越好。

 

多采样反走样(Multi-Sampling AA)

MSAA是对SSAA的一个改进,因为SSAA的计算量是非常大的,每个像素点分成4个采样点,就要进行4次的光栅化和着色来计算颜色,额外多了3倍的计算量,如何降低它呢?

MSAA的做法也很容易理解,同样会分采样点,但是只在光栅化阶段会去计算究竟有几个采样点在三角形之内,着色阶段只利用像素中心坐标计算一次颜色并乘以有效采样点的比例,如下图:

当只有两个采样点被这个三角形覆盖时,将该像素中心计算出来的颜色值乘以50%即可,在着色阶段的运算量远大于光栅化阶段的今天,这个方法远比SSAA快很多,不必对每个子采样点都进行着色计算,并且得到的反走样效果也是很不错的,因此近年来已经取代SSAA得到大量使用。

为了进一步优化MSAA,这些采样点的排列方式并不局限于2×2,可以排列成其他的组合形式,方便相邻像素之间复用采样点,进一步降低计算量(与AMOLED显示屏的多种像素排列方式原理类似),例如RGSS等。

MSAA的效果是没有SSAA好的,因为MSAA相当于默认了采样点的颜色与像素中心差别不大,导致了误差的存在。

不过对于人眼来说,对几何边缘的敏感度要高于颜色,在观看高帧率的连续画面时损失的少量画面细节是难以分辨出来的,在有限的图形处理器性能限制下用节省下来的计算量换来更高的帧率是很划算的交易。

 

其他反走样技术

后处理反走样(Post Process AA)

MSAA是与硬件紧密结合的built-in AA,在前向渲染下,它是非常好的方案,但由于MSAA不适用于延迟渲染,因此出现了PPAA这样的基于后处理的反走样技术。

例如FXAA(快速近似反走样)、SMAA、NFAA(仅模糊局部边界的边缘模糊算法)、SSXAA(仅模糊局部边界的边界模糊算法)、DLAA(自适应处理长边界抗锯齿算法)等技术,不提升采样点,而是在后处理阶段纯粹通过图像处理,寻找到图像的高对比度像素,也就是容易产生锯齿的边缘,对其进行模糊平滑处理。

优点是不需要增加采样点,不依赖硬件支持,进一步降低了计算量,缺点则是不仅会平滑三角形之间的边缘,还会平滑 alpha 混合纹理内的边缘,或由像素着色器产生的边缘,图像的高对比度细节会变得模糊。

 

时间采样反走样(Temporal AA)

TAA这一技术则又另辟蹊径,对于连续的画面,通过motion vector保存每帧移动的偏移量,每个像素每帧只采样一次,但采样点在像素内的随机位置,再将前面帧中已有的采样的像素与在当前帧中采样的像素混合,得到最终的反走样图像。

TAA缺点是当帧率低或者画面运动快的时候容易产生重影或者模糊。

 

超分辨率技术(Super Resolution)

很多人会把前面的反走样技术与超分辨率技术搞混,这里也顺便说明一下。

反走样技术指的是在硬件计算时输出高分辨率的图像,并通过增加采样点或者图像处理等手段去除图像中的锯齿等走样现象的技术。

而超分辨率技术指的是在硬件计算时输出低分辨率的图像经过插值、近似等图像处理手段得到高分辨率的图像,最广为人知的就是NVIDIA显卡的DLSS技术(Deep Learning Super Sampling)了。

DLSS的实现原理和TAA类似,它在渲染时只计算一半分辨率的图像,再使用机器学习结合当前帧和之前帧中的样本补充更多的画面细节,得到接近完整分辨率的画面,从而提高游戏的帧率,可以将其视为高级的TAA应用,使用类似的技术实现了不同的功能。

 

本文参考自闫令琪老师的《GAMES101-现代计算机图形学入门》以及孙晓磊的计算机图形学系列笔记,感谢。

 


我们听到的一切都是一个观点,不是事实;
我们看见的一切都是一个视角,不是真相。

《沉思录》
——马可·奥勒留