Anti-Alias

Anti Alias 做了什么

因为光栅化的原因,所有的颜色在pixel shader之后必须定下来,也就是说一个像素点的颜色只取决于渲染的图元。那么会导致锯齿(走样)问题。人们为了消除这一影响就采用了很多反走样方法。

Image

下面我会用冒号来表示它们之间的关系,比如A:B,C这证明A是基于B,C两种技术发展而来。

SSAA

最直接的抗锯齿方法就是SSAA(Super Sampling AA)。拿4xSSAA举例子,假设最终屏幕输出的分辨率是800x600, 4xSSAA就会先渲染到一个分辨率1600x1200的buffer上,然后再直接把这个放大4倍的buffer下采样致800x600。这种做法在数学上是最完美的抗锯齿。但是劣势也很明显,光栅化和着色的计算负荷都比原来多了4倍,render target的大小也涨了4倍。

MSAA : SSAA

MSAA(Multi-Sampling AA)则很聪明的只是在光栅化阶段,判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本(Coverage sample),但是在pixel shader着色阶段计算像素颜色的时候每个像素还是只计算一次。例如下图是4xMSAA,三角形只覆盖了4个coverage sample中的2个。所以这个三角形需要生成一个fragment在pixel shader里着色,只不过生成的fragment还是在像素中央(位置,法线等信息插值到像素中央)然后只运行一次pixel shader,最后得到的结果在resolve阶段会乘以0.5,因为这个三角形只cover了一半的sample。现代所有GPU都在硬件上实现了这个算法,而且在shading的运算量远大于光栅化的今天,这个方法远比SSAA快很多。

MSAA的一个问题就是和现在大街小巷都是的deferred shading框架并不是那么兼容。因为用deferred shading的时候场景都先被光栅化到GBuffer上去了,不直接做shading。

CSAA : MSAA

是MSAA的改进版,它就是更进一步的把coverage sample和depth,stencil test分开了。

TAA

TAA(Temporal Anti-Aliasing)是时间性抗锯齿,是最常用的图像增强算法之一,这是一种基于着色器的算法,使用运动矢量组合两帧,以确定在何处对前一帧进行采样。在每一帧对屏幕区域内的像素进行一个抖动操作,这样当连续的多个帧的数据混合起来以后,就相当于对每个像素进行了多次采样,他将采样点从单帧分布到多个帧上,使得每一帧并不需要多次采样增加计算量,但TAA往往会盲目地跟随移动物体的运动矢量,从而造成屏幕上的细节模糊不清。

对静态物体而言,TAA好像失效了?其实并不会,TAA会加入抖动,让静态物体也可以被抗走样。

TAA有一个致命问题,那就是鬼影。这是前后两帧采样的值差距过大导致的。避免的方法是将上一帧的颜色project into可以接受的颜色空间。通常人们会采样当前帧附近的像素并得到rgb AABB,然后把上一帧颜色与当前帧颜色连线,其与AABB的交点作为上一帧的颜色,从而避免颜色差距过大导致的鬼影。

Image

TXAA : TAA, MSAA

NVIDIA提供了一种称作TXAA的抗锯齿技术,实际上就是TAA+MSAA(多重采样抗锯齿Multi-Sample Anti-Aliasing)的组合,通过引入额外的深度信息来实现在延迟渲染上使用MSAA,TXAA专门用来直接集成在游戏引擎里,TXAA综合了MSAA的强大能力与类似于CG电影中所采用的复杂的高画质过滤器。还可以抖动帧与帧之间的采样位置来获得更高画质。

FXAA

FXAA和CMAA可以划归为Post Processing AA这一类技术。这一类东西包括FXAA,TXAA等,不依赖于任何硬件,完全用图像处理的方法来搞。有可能会依赖于一些其他的信息例如motion vector buffer或者前一贞的变换矩阵来找到上一贞像素对应的位置,然后再做一些hack去blur或者blend上一贞的颜色等,通常非常hacky。

FXAA大致思路是找到需要被抗锯齿的边界(匹配),然后得到两条边界,然后把边界的颜色做混合。

CMAA : FXAA

FXAA的升级版,避免了FXAA的糊的现象(经过CMAA的图像更锐利)。

DLSS

NVIDIA在Turing架构的时候推出了DLSS深度学习超级采样技术,DLSS利用深度神经网络来提取渲染场景的多维特征,并能以智能方式结合多帧细节,从而构建高质量的最终图像。与传统技术(如 TAA)相比,DLSS 使用更少的输入样本,同时还能避免此类技术在透明度和其他复杂场景元素方面遭遇的算法难题。DLSS 可以自行学习生成接近 64xSS 质量的图像,同时还避免出现影响 TAA 等传统方法的模糊、不清晰和透明问题。其实DLSS第一代的时候效果并不是特别好,虽然帧数上升,但画面还是有点糊,到了现在的DLSS2.0,NVIDIA升级了算法,使得整个处理效果非常出色,画面特别精细。

最后更新于 2023-04-24