抗锯齿,Anti-Aliasing,反走样,是计算机图形中很重要的一个环节。有很多大佬编写过相关的MME,从而在MMD中消锯齿。相信经常打游戏的人对这些抗锯齿很熟悉。
(资料图)
大概有以下几种,由于是个人收集,可能不全。
FXAA
最为常用的是FXAA,作者是Ray渲染器的编写者,斯基大大。
在ray渲染器下面的extension中下载
https://github.com/ray-cast/ray-mmd/
优点:快速,省资源,效果好.(性价比最高)
缺点:这是一种粗糙的模糊处理方法,动态画面可能会有些许bug.
SMAA
作者也是斯基。也是在ray的渲染器扩展里下载。与FXAA相比似乎逊色一些。
缺点:消锯齿能力较差.
MLAA
作者是針金。MLAA实际尝试的结果与MMD的相合不太好(特别是在MMD边缘描绘中)
下载地址为针金的配布页https://hariganep.seesaa.net/article/201010article_1.html
(作为学习可以参考。)
缺点:如上文所说。
SSAA
作者是Elle/データP。与其他的抗锯齿手法相比,压倒性的“消耗资源(沉重)。
下载地址是作者的配布页https://ux.getuploader.com/Elle_DataPort/
(个人认为这是效果也是非常不错的。)
优点:简单粗暴效果好。
缺点:吃性能。
MSAA
作者是桶口优。也就是MMD的作者。
下载地址……这个不用下,在MMD中打开抗锯齿就是了。(我是从针金的文字里读到的,MMD自带的应该就是MSAA吧。个人体感上并不是很吃资源。)
优点:效果好。
缺点:资源消耗。
下面介绍一下各种抗锯齿。作为入门的学习,可能存在错误,请各位见谅。
锯齿(Aliasing)产生的原因
显示器屏幕是由一个一个的像素组成的,渲染的结果就是去填充这些像素块。
Aliasing的来源是因为场景的定义在空间中是连续的,而最终显示的像素则是一个离散的二维数组。所以判断一个点到底没有被某个像素覆盖的时候单纯是一个“有”或者“没有"问题,丢失了连续性的信息,导致Aliasing的出现。
这里拿出一张图,就比如 乌妃。这张图是我上次学习diffusion时做的。
把乌妃的脑门放大,就会发现,像素块的构成。
当然,从三维空间渲染出一张平面图的过程要复杂一些。因为涉及到渲染流水线。
渲染流水线大致分为三个阶段,应用阶段,几何阶段,光栅化阶段。(逐片元阶段暂时包括进光栅化阶段)
简单地概括理解:
应用阶段:把数据准备好,灯光、场景之类的,然后把数据传输给几何阶段。
几何阶段:把传输过来的数据进行矩阵变换,着色,光照计算,然后再屏幕映射,把顶点位置从3D空间坐标转换到2D空间坐标。
光栅化阶段:拿到映射到2D空间里的顶点位置,我们要设置三角形,进行三角形遍历。把它组装成三角形,要知道三角形包含了哪些2D空间的像素点、深度信息、顶点信息等等,这些信息用于计算每个像素的最终颜色。这些三角形,称为片元,一个片元并不是真正意义的像素。我们最后要把这些片元解为像素,就是逐片元阶段。
后处理:此时我们已经拿到一张图片了,再在此基础上进行修改,就像ps一样,可以理解为图像处理。
MSAA发生在光栅化阶段,MSAA 会对每个像素设置多个子采样点,然后对每个子采样点进行覆盖测试和遮挡测试
覆盖测试就是看这个子采样点是不是在这个三角形以内,遮挡测试是看采样点的深度和 ZBuffer(深度缓冲)比较,看是否能够通过,如果能通过这两个测试,就说明这个子采样点属于三角形,那么最后我们就能得到当前像素被三角形覆盖的信息,并且覆盖信息会被保存起来,到后面的逐片元操作里面,用于后续的着色混合。
FXAA、SMAA、MLAA 是后处理操作,不在光栅化阶段
FXAA
快速近似抗锯齿(Fast Approximately -Aliasing)
FXAA是后处理的方式,并不是在光栅化阶段中完成。所以存在着一些FXAA解决不了的锯齿。(后处理即在画面完成后)通过像素颜色检测边缘。比如较为细小的物体的边缘,很难去进行抗锯齿。所以FXAA的精度并不是很高,画面整体会模糊,而且在动态画面中,细小的边缘不是很稳定。相信有的MMD作者有过这样的体验,移动摄影机时,在光照变化的位置的细节容易产生闪烁。
SSAA
要得到抗锯齿效果的图形,最简单的方法就是,将图形按照 xN 倍的大小进行渲染,再将图像整体缩小。比如现在要渲染到 800x400 的屏幕上,可以先将渲染到 1600x800 的贴图上,再将贴图缩小至 1/2 大小,自然形成抗锯齿效果。
这种方式就是超级采样抗锯齿/SSAA(Super Sampling Anti-Aliasing),将图形先渲染到一张较大的贴图上,再将图形缩小。
可以想象到,这种方式去消锯齿,要消耗的计算资源是很大的。
MSAA
多重采样抗锯齿(MultiSampling Anti-Aliasing)
MSAA跟 SSAA 的区别就是,MSAA 只对于多边形的边缘进行抗锯齿处理。因为边缘是锯齿最明显的地方。
对那些有锯齿边缘的画面进行采样,然后和周围像素的颜色进行混合,让他们过渡得更加自然,这样就不容易看出锯齿效果。这样的话,相比SSAA对画面中所有数据进行处理,MSAA对资源的消耗需求大大减弱,不过在画质上可能稍有不如SSAA。MSAA模式则是在两者之间做出平衡和取舍,不会消耗过大的性能但是也不会获得最优质的画面质量。
使用 MSAA 进行大量物体的渲染时,很多带宽是被浪费的。因此即使在手机上,目前使用 MSAA 的情况也比较少。可以说,MSAA 是一种比较经典,但是目前显得略有些过时的抗锯齿方式。
MLAA
形态抗锯齿 (Morphological Antialiasing)
2009年由Intel的Alexander Reshetov提出, 启发了后续一批基于图像自身形态进行抗锯齿操作的算法例如FXAA和CMAA。MLAA是一种纯粹的后处理算法。
SMAA
子像素增强抗锯齿(Enhanced Subpixel Morphological)
SMAA 与 FXAA类似,性能消耗小,但是相比FXAA更清晰。SMAA是后处理抗锯齿技术的一种,它的基本处理流程建立在Jimenez优化改造后的MLAA(形态学抗锯齿)算法之上。原始的MLAA是由英特尔实验室提出的抗锯齿技术,这项技术代表着后处理式抗锯齿蓬勃发展的开端。
参考
GAMES101-现代计算机图形学入门-闫令琪 第六课 https://www.bilibili.com/video/BV1X7411F744?p=6&vd_source=dda90682ca7ec757a726d7b0f5cd4afb
抗锯齿相关技术介绍 https://www.cnblogs.com/somedayLi/p/12445939.html
主流抗锯齿方案详解(一)MSAA https://zhuanlan.zhihu.com/p/415087003
主流抗锯齿方案详解(三)FXAA https://zhuanlan.zhihu.com/p/431384101
MSAA比SSAA改进了哪里? https://www.zhihu.com/question/496212252
耕升官方的介绍文 https://www.bilibili.com/read/cv17766227?from=search&spm_id_from=333.337.0.0
TA成长之路笔记 https://www.yuque.com/u12120868/md8ze7/ovoxxl
游戏反走样算法调研 | 英伟达最新 DLSS, TAA, FXAA, MSAA 原理及比较https://zhuanlan.zhihu.com/p/57503957