首页>资讯 > >正文

【MME】抗锯齿

抗锯齿,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

标签: 下载地址 覆盖测试 动态画面

相关阅读