图形学补完计划(三):Antialiasing
参考:
光栅化所带来的问题
光栅化是将图形转换成像素图像的过程,由于三维空间中的物体都是连续的,而屏幕上的像素则是一个离散的二维数组,判断一个点到底没有被某个像素覆盖的时候单纯是一个“有”或者“没有"问题,丢失了连续性的信息,因此会带来很多问题。
学过 dsp 的同学都知道,离散就意味着采样率有限,因此一定存在一个最大的采样率;当要采样的信号频率大于这个值时,就会出现各种问题。
常见的问题有:锯齿、摩尔纹、车轮效应等。
转动过快的车轮会让人觉得在往反方向旋转
本节主要探讨抗锯齿的一些方法。
抗锯齿的方法
SSAA
最直接的抗锯齿方法就是SSAA (Super Sampling AA)。拿4xSSAA举例子,假设最终屏幕输出的分辨率是800x600, 4xSSAA就会先渲染到一个分辨率1600x1200的buffer上,然后再直接把这个放大4倍的buffer下采样致800x600。这种做法在数学上是最完美的抗锯齿。但是劣势也很明显,光栅化和着色的计算负荷都比原来多了4倍,render target的大小也涨了4倍。
MSAA
MSAA (Multi-Sampling AA) 在光栅化阶段,判断三角形是否被像素覆盖时,会计算多个采样点,然后计算一个覆盖率;在片段着色阶段,每个像素仍然只计算一次颜色值,片段以像素中央来进行计算,只是最后的结果会乘上一个覆盖率;MSAA的高效性在于,他没有每个采样点都计算一次着色,而是每个像素只计算一次着色,最后乘上一个覆盖率;
MSAA对延迟渲染的支持不是很好;有三个原因,一个是MSAA本质上是一种发生在光栅化阶段的技术,也就是几何阶段后,着色阶段前,这个技术需要用到场景中的几何信息,但是延迟渲染因为需要节省光照计算的原因,事先把所有信息都放在了GBuffer上,着色计算的时候已经丢失了几何信息;而且关键一点是如果强行这么做,MSAA会增加数倍的带宽性能消耗,因此一般都不会这么做。还有一个原因是是以前DX9的时代,MRT(多重渲染目标)技术不支持MSAA。
FXAA
除了增加每个像素点的采样数,我们实现抗锯齿的另一种方式就是后处理。考虑到大部分情况下,我们想要抗锯齿的部分,其实都只是在物体边缘或者高光变化的部分,我们通过后处理的方式,检测出图像块之间的边缘,然后根据边缘信息对边缘两侧的图像进行混合处理,达到抗锯齿的效果。这类基于后处理的抗锯齿方式也叫做形变抗锯齿/Morphological antialiasing。
比如下图中的图像,左边是待处理的图像,中间是找到的边界,右侧是将边界两侧像素混合后得到的抗锯齿效果。
FXAA(fast approximate antialiasing) ,快速近似抗锯齿处理,是MSAA一种高性能近似;它位于后处理阶段实现,不依赖于硬件;总体思想是:a. 找出图像中的所有边缘(通过亮度比较,G分量,因为绿色对整体亮度的贡献是最大的);b.平滑化边缘(沿着某个方向将一定范围的像素取出来加权平均)。
FXAA 是一种比较注重性能的形变抗锯齿方式,只需要一次 Pass 就能得到结果,FXAA 注重快速的视觉抗锯齿效果,而非追求完美的真实抗锯齿效果。
其他抗锯齿方法
TAA(Temporal Anti-Aliasing) 是时间性抗锯齿,是最常用的图像增强算法之一,这是一种基于着色器的算法,使用运动矢量组合两帧,以确定在何处对前一帧进行采样。在每一帧对屏幕区域内的像素进行一个抖动操作,这样当连续的多个帧的数据混合起来以后,就相当于对每个像素进行了多次采样,他将采样点从单帧分布到多个帧上,使得每一帧并不需要多次采样增加计算量,但TAA往往会盲目地跟随移动物体的运动矢量,从而造成屏幕上的细节模糊不清,容易出现鬼影和抖动的现象。
后来NVIDIA提供了一种称作TXAA的抗锯齿技术,实际上就是TAA+MSAA(多重采样抗锯齿Multi-Sample Anti-Aliasing)的组合,通过引入额外的深度信息来实现在延迟渲染上使用MSAA,TXAA专门用来直接集成在游戏引擎里,TXAA综合了MSAA的强大能力与类似于CG电影中所采用的复杂的高画质过滤器。还可以抖动帧与帧之间的采样位置来获得更高画质。
NVIDIA在Turing架构的时候推出了DLSS深度学习超级采样技术,DLSS利用深度神经网络来提取渲染场景的多维特征,并能以智能方式结合多帧细节,从而构建高质量的最终图像。与传统技术(如 TAA)相比,DLSS 使用更少的输入样本,同时还能避免此类技术在透明度和其他复杂场景元素方面遭遇的算法难题。DLSS 可以自行学习生成接近 64xSS 质量的图像,同时还避免出现影响 TAA 等传统方法的模糊、不清晰和透明问题。其实DLSS第一代的时候效果并不是特别好,虽然帧数上升,但画面还是有点糊,到了现在的DLSS2.0,NVIDIA升级了算法,使得整个处理效果非常出色,画面特别精细。