【MME】抗锯齿

本文由 简悦 SimpRead 转码, 原文地址 www.bilibili.com

作者:小林呓

抗锯齿,Anti-Aliasing,反走样,是计算机图形中很重要的一个环节。

抗锯齿,**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 的出现。

这里拿出一张图,就比如 乌妃。这张图是我上次学习 diffusion 时做的。

乌妃可爱滴捏

把乌妃的脑门放大,就会发现,像素块的构成。

我们的图片是由一个个像素块构成的。

当然,从三维空间渲染出一张平面图的过程要复杂一些。因为涉及到渲染流水线。

渲染流水线大致分为三个阶段,应用阶段,几何阶段,光栅化阶段。(逐片元阶段暂时包括进光栅化阶段)

简单地概括理解:

应用阶段:把数据准备好,灯光、场景之类的,然后把数据传输给几何阶段。

几何阶段:把传输过来的数据进行矩阵变换,着色,光照计算,然后再屏幕映射,把顶点位置从 3D 空间坐标转换到 2D 空间坐标。

光栅化阶段:拿到映射到 2D 空间里的顶点位置,我们要设置三角形,进行三角形遍历。把它组装成三角形,要知道三角形包含了哪些 2D 空间的像素点、深度信息、顶点信息等等,这些信息用于计算每个像素的最终颜色。这些三角形,称为片元,一个片元并不是真正意义的像素。我们最后要把这些片元解为像素,就是逐片元阶段。

后处理:此时我们已经拿到一张图片了,再在此基础上进行修改,就像 ps 一样,可以理解为图像处理。

  • MSAA 发生在光栅化阶段,MSAA 会对每个像素设置多个子采样点,然后对每个子采样点进行覆盖测试和遮挡测试

    覆盖测试就是看这个子采样点是不是在这个三角形以内,遮挡测试是看采样点的深度和 ZBuffer(深度缓冲)比较,看是否能够通过,如果能通过这两个测试,就说明这个子采样点属于三角形,那么最后我们就能得到当前像素被三角形覆盖的信息,并且覆盖信息会被保存起来,到后面的逐片元操作里面,用于后续的着色混合。

  • FXAA、SMAA、MLAA  是后处理操作,不在光栅化阶段

快速近似抗锯齿(Fast Approximately -Aliasing)

FXAA 是后处理的方式,并不是在光栅化阶段中完成。所以存在着一些 FXAA 解决不了的锯齿。(后处理即在画面完成后)通过像素颜色检测边缘。比如较为细小的物体的边缘,很难去进行抗锯齿。所以 FXAA 的精度并不是很高,画面整体会模糊,而且在动态画面中,细小的边缘不是很稳定。相信有的 MMD 作者有过这样的体验,移动摄影机时,在光照变化的位置的细节容易产生闪烁。

要得到抗锯齿效果的图形,最简单的方法就是,将图形按照 xN 倍的大小进行渲染,再将图像整体缩小。比如现在要渲染到 800x400 的屏幕上,可以先将渲染到 1600x800 的贴图上,再将贴图缩小至 ½ 大小,自然形成抗锯齿效果。

这种方式就是**超级采样抗锯齿 / SSAA(Super Sampling Anti-Aliasing)**,将图形先渲染到一张较大的贴图上,再将图形缩小。

可以想象到,这种方式去消锯齿,要消耗的计算资源是很大的。

多重采样抗锯齿(MultiSampling Anti-Aliasing)

MSAA 跟 SSAA 的区别就是,MSAA 只对于多边形的边缘进行抗锯齿处理。因为边缘是锯齿最明显的地方。

对那些有锯齿边缘的画面进行采样,然后和周围像素的颜色进行混合,让他们过渡得更加自然,这样就不容易看出锯齿效果。这样的话,相比 SSAA 对画面中所有数据进行处理,MSAA 对资源的消耗需求大大减弱,不过在画质上可能稍有不如 SSAA。MSAA 模式则是在两者之间做出平衡和取舍,不会消耗过大的性能但是也不会获得最优质的画面质量。

使用 MSAA 进行大量物体的渲染时,很多带宽是被浪费的。因此即使在手机上,目前使用 MSAA 的情况也比较少。可以说,MSAA 是一种比较经典,但是目前显得略有些过时的抗锯齿方式。

形态抗锯齿  (Morphological Antialiasing)

2009 年由 Intel 的 Alexander Reshetov 提出, 启发了后续一批基于图像自身形态进行抗锯齿操作的算法例如 FXAA 和 CMAA。MLAA 是一种纯粹的后处理算法。

子像素增强抗锯齿(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

评论