【技术美术图形部分】简述主流及新的抗锯齿技术

电脑的世界里没有曲线,都是三角面组成一个个模型的,因此一定会出现走样(锯齿)的情况,只是严重与否的问题,而AA也是实时渲染最难解决的问题之一。

Sampling&Artifacts

Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering),这里采用101里老师介绍采样和走样的方式:

采样有两种,

  • 图片——离散成像素
  • 视频——采样时间

因此采样不只发生在不同的位置,还发生在不同的时间,意味着采样能发生在空间上,也能发生在时域上,时间上我理解的是采样动态,如下图:

采样会产生一些列问题(Sampling Artifacts),这些Artifacts可能是,

  • 空间上的——锯齿、摩尔纹等失真现象
  • 时域上的——车轮效应(wagon wheel effect)、运动闪烁等动态的失真现象
摩尔纹
人眼时间上的采样跟不上运动速度

把产生这一系列Artifacts的现象叫做走样(Aliasing),而走样的根本原因是:信号变化太快(高频),以至于采样跟不上。

更加详细地从信号采样来分析走样原因可以直接看101第6节后面的内容,这里就直接进入反走样的部分了。

Anti-Aliasing

走样影响呈现效果,要保证画面质量我们就要反走样。游戏中画面设置就会有反走样(抗锯齿)的选项设置,例如大表哥里的:

上往下对应的是TAA、FXAA和MSAA。

反走样是有三种思路的:

  • 多次采样——MSAA、TAA等
  • 后处理寻找边界,插值以平滑边缘——FXAA、SMAA等
  • 基于深度学习的——DLSS

其中DLSS,基于深度学习的抗锯齿,是由英伟达训练模型,以驱动更新的形式推送给用户。 

接下来那就顺着简单介绍一下。首先是最简单粗暴的方法:

1 多次采样

SSAA*

Super Sampling Anti-Aliasing,超级采样。它思路非常简单,提高信号采样频率,使用低通滤波降采样,实时渲染中就是先提高图像采样分辨率(规则采样、旋转采样各种采样都可),把画面渲染到一张较大纹理上,然后再低通滤波(box、Gauss等)降采样,缩小纹理,呈现出来的纹理边缘平滑且清晰。

如下图,对于当前像素我们分为了4个采样当前像素的子像素点,拿shader来讲,SSAA相当于per-sampling-shading,fragment shader要被调用4次才能得到当前像素点的颜色值。

图片截取自 参考文章
图片截取自 参考文章

很显然,SSAA性能消耗很大——需要渲染画面到高分辨率的rt,还需要降采样。一般也不会被应用于游戏中。

1.1 MSAA

Multi Sampling Anti-Aliasing,多重采样,是一种比较古老的游戏中采用的抗锯齿技术。MSAA是SSAA的衍生,但与SSAA相比,MSAA是per-pixel-shading,MSAA并不是通过提升分辨率的方式达到抗锯齿,它的那么多个子像素点仅仅是为了在光栅化阶段去计算覆盖情况(一些子像素点可能会被重复利用),在fragment shader阶段才会去计算最终的像素颜色,即只计算一次,如下图:

截图自水印

你会发现游戏中开MSAA需要设定倍数:X2/X4/X8,这个倍数表示着渲染像素被分配的采样点个数。倍数越大,当然采样分辨率放的越大,意味着效果更好,也很吃显卡性能,例如下图的对比:

图源 参考文章

再次应证了,8倍MSAA并不会让帧数直线下降到原来的1/8,会有很多的子像素点被重复利用。

liasing表现在实时渲染更多的是“锯齿”这一失真现象。MipMap解决的就是缩小纹理产生锯齿的aliasing,

TAA,即Temporal Anti-Aliasing,在图形学中TAA是通过对多个时间点的采样进行加权平均来模糊图像,以减少图像或者动画的锯齿、失真。

1.2 TAA

主流抗锯齿方案详解(二)TAA

Temporal Anti-Aliasing,是基于时间的抗锯齿,基于SSAA的FSAA、MSAA等等都是在空间上做手脚——在一帧内完成所有子像素渲染,而TAA是在时间上做优化——把这个过程分散在多帧完成,在不同时刻进行少量采样,即综合历史帧数据达到抗锯齿。

一些基于采样的后处理效果,例如体积光、SSAO、SSR、体积雾、Raymarching云等等,也可以跟TAA帧混合,通过降低每帧采样次数达到很好渲染效果的同时,开销也不至于太大,例如下图:

图截取自 参考文章

这里就有疑问了:

  • TAA会让画面变得不清晰吗?

首先结论是当然会,如下图,TAA性能明显优于8倍MSAA,但画面会模糊。

图源 参考文章
  • 如果是动态场景那如何去获得历史帧的数据?

这个问题就是TAA复杂的点了,TAA分为采样和合成(Sampling&Resolve)两个过程,对于静态画面TAA很简单,直接把N个次像素点分为几份,每帧来一份,最后叠加取均值即可。但对于视角发生变化的动态画面,直接混合是不可能的,会有残影。

关于TAA如何进行,后面会单独出一个SRP管线下实现TAA的文章,这里就不过多的进行描述。

另外,PO一下别的地方看到对TAA的评价吧,

NVIDA TXAA*

TXAA | 技术 | GeForce (nvidia.cn)

一种电影风格的抗锯齿技术,结合了MSAA和CG中类似电影的解算过滤器——以牺牲性能来换取最高画质,让游戏视效达到接近逼真的水平。 

2 后处理

大部分情况我们想要抗锯齿的地方都是物体边缘、亮度变化较大的地方,可以通过后处理的方式找到边缘进行针对性处理。

2.1 FXAA

主流抗锯齿方案详解(三)FXAA

Fast Approximate Anti-Aliasing,快速近似抗锯齿。FXAA就是一种屏幕后处理算法,提取边缘像素,与周围像素插值以达到平滑边缘的效果。

提取边缘像素(通过亮度) --> 计算边缘像素法线 --> 计算整个边缘的法线方向 --> 混合颜色(这是大概的过程,有机会其实是想手写一次FXAA试试的,这里没时间了只想后面实现TAA,具体的话可以直接看参考文章)。

FXAA几乎不吃性能,只需要一个PASS实现,集成方便,因此也多用于手游,但会模糊画面,由于是基于亮度进行的边缘检测,对于亮度变化快的地方会很不稳定,出现画面闪烁的情况。因此FXAA只是一种粗糙的模糊处理方法。

2.2 SMAA

主流抗锯齿方案详解(四)SMAA

Enhanced Subpixel Morphological,增强次像素?SMAA建立在MLAA之上,比FXAA更清晰,需要3个PASS,性能略大,过程的话主要是看上面文章里罗列的源码,过程了解的会更清楚一点:

有机会会代码走一遍,现在就先过一遍。

3 最近的技术

2023了,盘点抗锯齿技术如果到SMAA就戛然而止那可太古老了,再说说一些新兴的、最近出现的一些抗锯齿技术,虽然没有强到扒源码的程度。。但是知道一点总比不知道强。

3.1 FSR

AMD FidelityFX Super Resolution | AMD Partner Hub

AMD FidelityFX Super Resolution,超强分辨率技术。2021年推出了FSR1.0,2022推出了FSR2.0(maybe对标NVIDA DLSS)时域上实现抗锯齿,未来似乎可以替换掉TAA()

3.2 DLSS

DLSS 2.0 - 重新定义AI渲染

DLSS 2.0 - 基于深度学习的实时渲染图像重建

DLSS1.0和2.0原理是有区别的:

没看这两篇文章之前我以为DLSS只是加上了深度学习的SSAA类别,结果不是的,学到了。太有启发了,保持学习。

猜你喜欢

转载自blog.csdn.net/qq_41835314/article/details/129238947