Unity 抗锯齿方案梳理

我们在Unity开发过程中通常会碰到锯齿的问题,尤其是一些直边斜过来的时候,如图:

Unity 抗锯齿方案梳理

抗锯齿在实际项目中必不可少,本文梳理一下Unity中各抗锯齿方案:
MSAA-----多重采样抗锯齿----MultiSampling Anti-Aliasing
FXAA-----快速近似抗锯齿----Fast Approximate Anti-Aliasing
SSAA-----超级采样抗锯齿----Super Sampling Anti-Aliasing
FSAA-----全屏抗锯齿----Full Scene Anli-Aliasing
MSAA----多重采样抗锯齿----MultiSampling Anti-Aliasing
CSAA-----覆盖采样抗锯齿----CoverageSampling Anti-Aliasing
CFAA-----可编程过滤抗锯齿----Custom Filter Anti-Aliasing
MLAA----形态抗锯齿(统称,包含FXAA、SMAA等)----Morphological Anti-Aliasing
TAA------时间性抗锯齿----Temporal AA(TXAA,TSMAA,TSSAA)
CTAA-----电影时间抗锯齿----Cinematic Temporal Anti-Aliasing
SMAA----增强型子像素形态抗锯齿----Enhanced Subpixel Morphological Anti-Aliasing
MFAA----多帧采样抗锯齿----MultiFrame Sampling Anti-Aliasing
EQAA-----增强型抗锯齿----Enhanced Quality AA
DLSS-----深度学习超采样----Deep Learning AA


MSAA

MSAA基本上只对画面中物体的边缘进行放大、混合的抗锯操作,因为边缘是锯齿最明显的地方(注意不是所有的边缘)。在光栅化阶段,判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本,但是在pixel shader着色阶段计算像素颜色的时候每个像素还是只计算一次。

我们一般说的4x、8x,就是放大倍数,放得越大,供混合的采样越充份,效果越好,但是处理速度也就越慢。

Unity自带的设置中的2倍、4倍、8倍就是MSAA。实测项目中MSAA会导致复杂模型内部边缘闪烁问题,最终未开启MSAA。

Unity 抗锯齿方案梳理

8倍MSAA效果:

Unity 抗锯齿方案梳理


FXAA

FXAA是屏幕后处理的边缘模糊技术。但是和MSAA不同,MSAA提边缘是在图形管线的前段(跟深度有关)。FXAA是种后处理技术,后处理技术一般在画面完成后,通过像素颜色检测边缘(色彩差异太大时,不是边缘也被认为成边缘,精度有问题)。后处理技术一般没倍数概念,因为不存在放大。

效果上FXAA接近MSAA的4倍效果,但在一些细节上会比4倍MSAA差一点。

FXAA作为性能最好的抗锯齿效果,直接加入使用了。FXAA插件地址或者直接AssetStore去搜,免费的:https://pan.baidu.com/s/1gs_5MaukJ71AFas2ZsPQug 提取码: fdjn

FXAA效果:

Unity 抗锯齿方案梳理


SSAA

场景要以最终分辨率的两倍渲染到缓冲区,并平均四个像素的块以生成最终图像。甚至可以使用更高的分辨率和不同的采样模式来进一步改善效果。这种方法消除了锯齿,但也会稍微模糊整个图像。

简单说就是原来渲染1024x768分辨率的,我直接x2或者更高,最后缩小到1024x768来渲染。

SSAA是最暴力的抗锯齿方案,这种做法在数学上是最完美的抗锯齿。但是劣势也很明显,光栅化和着色的计算负荷都比原来多了4倍,render target的大小也涨了4倍。效率非常差,实际项目中效果确实最好,但在某些移动端机型会造成严重的发热情况。

SSAA的代码可以直接去这篇取,放相机上即可。

SSAA效果:

Unity 抗锯齿方案梳理

简单常用的基本就上述三种,使用起来比较简洁。


官方的后处理插件PostProcessing抗锯齿用法:

1. 在Package Manager中找到Post Processing并安装

Unity 抗锯齿方案梳理

2. 给相机添加Post-process Layer

Unity 抗锯齿方案梳理

3. 修改需要影响的物体层,并选择抗锯齿方案,物体别忘了改到对应的层

Unity 抗锯齿方案梳理

Unity 抗锯齿方案梳理

4. Post-process插件提供了3种抗锯齿方案:FXAA,SMAA,TAA。

FXAA

其中FXAA是如上所述效率最高1个DrawCalls,效果最差的,主要针对抗锯齿要求不太高的项目,甚至还能在FXAA基础上选Fast Mode进一步提升效率。

SMAA

SMAA是类似FXAA的滤镜类抗锯齿,性能消耗约为FXAA的2倍左右,也算比较好的,SMAA的核心原理来源于MLAA。MLAA的基本思路是:检测每帧图像上的边缘(通常可对亮度、颜色、深度或者法线进行边缘检测),然后对这些边缘进行模式识别,归类出Z、U、L三种形状,根据形状对边缘进行重新矢量化(re-vectorization),并对边缘上的像素根据覆盖面积计算混合权重,将其与周围的颜色进行混合,从而达到平滑锯齿的目的。

Unity 抗锯齿方案梳理

SMAA在MLAA的基础上加入了针对尖锐几何特征的处理,并加入了对角线模式识别,加入了对局部对比度的考虑,改善了距离搜索算法。总体上是效果和性能的中和产物,个人尝试了一下简单的面片这个抗锯齿效果最好,4个DrawCalls。

TAA

TAA据说(未考证)是目前业内游戏大厂使用最多,最广泛的抗锯齿。使用运动矢量组合两帧,以确定在何处对前一帧进行采样。在每一帧对屏幕区域内的像素进行一个抖动操作,这样当连续的多个帧的数据混合起来以后,就相当于对每个像素进行了多次采样,他将采样点从单帧分布到多个帧上,使得每一帧并不需要多次采样增加计算量,但TAA往往会盲目地跟随移动物体的运动矢量,从而造成屏幕上的细节模糊不清。

据说(未考证)大厂基本会自己根据自己的项目写TAA的效果。如果物体运动过快会导致画面糊、残影,性能方面好像各有说辞,3个DrawCalls,这里如果是小团队,建议这几个方案都试试根据项目需求录取吧。

Post Processing除了抗锯齿之外还提供了很多其他的后处理效果,小伙伴们可以自行百度试试(这应该是TA的事情)。


版权声明:本文为CSDN博主「ShawnWeasley」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/eevee_1/article/details/118632398

最新文章