游戏中的抗锯齿技术Anti-Alasing提炼总结

Posted Mr_厚厚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游戏中的抗锯齿技术Anti-Alasing提炼总结相关的知识,希望对你有一定的参考价值。

游戏中的抗锯齿技术Anti-Alasing提炼总结

锯齿(走样,失真)产生的根本原因

图形学的根本过程是一个图形转化成图像的过程,该过程是一个连续信号经过采样转化成离散信号(显示设备的像素是离散的)的过程,之所以产生锯齿现象(失真,走样)就是因为信号的离散性被人眼识别出来。抗锯齿就是通过一些手段来重构丢失的信号。我们通常用的抗锯齿算法实际上是降低锯齿,并非消除锯齿。

  • 走样的两个来源:采样点的颜色信息丢失采样点的可见性信息(包括覆盖coverage和遮挡occlusion)丢失
  • 抗锯齿(复原信号)的根本方法:多采样(multi-sampling)前置过滤(pre-filter)

抗锯齿算法的分类方法

  • 在管线前段(前向渲染),通过增加采样、以及利用深度信息精确在边缘进行抗锯齿的方法:SSAA、MSAA、CSAA(MSAA的优化版,五点采样)、RGSS(采样点旋转,非规则)等。
  • 在管线后段(延迟渲染)通过纯碎的后处理,即图形处理进行的抗锯齿算法:FXAA、MLAA、SMAA等。
  • 滤波器类型的抗锯齿:类似于图像处理中的图像恢复和抗噪技术(锯齿可以看作高频噪音),滤波算法有很多,例如:几何或算数均值滤波、中值滤波、适应性均值滤波等,区别主要取决于滤波器那个卷积算子的权重设计以及混合方式。注:这种滤波是在屏幕空间进行的,当然也可以走先进行边缘检测(拉普拉斯算子等卷积核),然后只在边缘进行滤波的优化路线。
  • 设计前置过滤器,将走样信息尽可能传递到管线后段,可能会对管线进行修改:NSAA,AGAA。
  • 时域上的抗锯齿(以上其他的都是屏幕空间的抗锯齿):temprial anti-alasing,TXAA。
  • 其他:基于深度学习的DLAA,实时抗锯齿。

简单粗暴的原始SSAA和MSAA,抗锯齿技术的地基

SSAA(Super Sample Anti-Aliasing),超级采样抗锯齿

  • 简单暴力的过度倍数采样来更高精度还原信号,4x,8x,16x等。
  • GPU的shader iteration mode分per pixel和per sample,如果使用SSAA则GPU会使用per sample模式。
  • 最后coverage mask降采样。

MSAA(Multi-Sample AntiAliasing),多重采样抗锯齿

  • 光栅化阶段计算遮挡覆盖信息并保存到二进制掩码中,颜色信息取自离像素中心最近的采样点的颜色,像素内深度测试失败的采样点不着色。
  • MSAA一般是由硬件支持的反走样(anti-aliasing,AA)技术,它在光栅化阶段在一个像素区域内对每个像素使用多个深度采样值,但是每个像素内的这些深度采样值共享一个着色计算,即是每个像素仍然只执行一次fragment shader的计算,然后计算的结果被复制到每个子深度采样点上,这样一个像素内深度测试失败的子采样点将不会包含颜色信息,从而能够更使最终的颜色过渡更平滑。
  • MSAA与SSAA的不同就在于MSAA的每个像素只执行一次着色计算(针对可见性,弱化颜色走样来源),因此比SSAA具有较大的性能优势,但是也因此MSAA不能处理由于着色计算中对函数(如高光)采样不足导致的走样(如Shader Aliasing),但是由于人眼对于几何边缘的敏感度更高于对颜色的敏感度,因此MSAA是一种相当受偏爱的技术。

https://www.cnblogs.com/ghl_carmack/p/8245032.html

这种超采样的抗锯齿方法都发生在管线前段,在延迟渲染中不支持。

##后处理类型的抗锯齿技术

FXAA(Fast Approximate Anti-Aliasing),快速近似抗锯齿

  • 偏经验性的一个算法,算法设计者都不知道为什么该算法抗锯齿会有效。
  • 存在后处理抗锯齿方法自身存在的不可避免的模糊问题,对像绒毛一类的复杂物体效果不好。
  • 主要根据luma亮度检测边缘,然后在边缘上进行抗锯齿操作;

http://blog.simonrodriguez.fr/articles/30-07-2016_implementing_fxaa.html

MLAA

MLAA的基本思路是:检测每帧图像上的边缘(通常可对亮度、颜色、深度或者法线进行边缘检测),然后对这些边缘进行模式识别,归类出Z、U、L三种形状,根据形状对边缘进行**重新矢量化(re-vectorization)**逆向还原原形状,并对边缘上的像素根据覆盖面积计算混合权重,将其与周围的颜色进行混合,从而达到平滑锯齿的目的。

SMAA(Subpixel Monorplogical Anti-Aliasing)

http://www.iryoku.com/smaa/

https://blog.csdn.net/qezcwx11/article/details/78426052

  • SMAA的核心原理来源于MLAA,边缘检测加入了对比度的考量。SMAA是结合MLAA和SSAA/MSAA各自的优点,减轻FXAA导致的模糊的后处理抗锯齿技术。
  • 边缘检测加入了对比度的考量;
  • 分成垂直方向和水平方向的锯齿。

比较

新型抗锯齿技术

TAA/TXAA(Temporal Anti-Aliasing),时间反走样

英伟达设计的更高画质的抗锯齿技术。

https://zhuanlan.zhihu.com/p/24063209

https://docs.nvidia.com/gameworks/content/gameworkslibrary/postworks/util.html

https://zhuanlan.zhihu.com/p/20786650

https://developer.download.nvidia.cn/gameworks/events/GDC2016/msalvi_temporal_supersampling.pdf

  • 达到和SSAA的效果,只不过多采样是基于历史帧缓冲,从历史帧中采样,在像素范围内进行加权抖动。
  • 缺点是随着历史颜色的累积,会导致不可绝对消除的模糊(运动模糊),尤其在移动过快的镜头或物体情况下,会导致重影现象,尤其VR设备中此方法不适用。
  • 针对TAA的问题AGAA诞生,但是仍不成熟,对硬件要求高。

AGAA(Aggregate G-Buffer Anti-Aliasing),G缓冲增强反走样

  • AGAA采用MSAA的思路,只不过通过pre-filter聚合前置过滤器将MASS倍数采样导致G-Buffer内存过大的问题降低,将倍数的子采样点过滤到更少的聚集中。

NSAA(None-Sampling Anti_Aliasing),非采样抗锯齿

  • 特殊的针对可见性的分析型prefilter,边缘抗锯齿。
  • 不是应用与传统光栅华渲染管线的,新型管线,目前不太适用。

DLAA

。。。

总体上算法改进的思路:

  • 边缘检测,只在边缘进行抗锯齿(对比度适应)
  • 锯齿边缘形态模式识别,重新矢量化进行信息还原
  • 人眼对几何边缘的敏感度高于颜色
  • pre-filter前置过滤,减少直接倍数采样的内存过大问题
  • 在时域上采集历史帧信息进行超采样,减少超采样导致的内存过大问题

以上是关于游戏中的抗锯齿技术Anti-Alasing提炼总结的主要内容,如果未能解决你的问题,请参考以下文章

画布中的抗锯齿大文本

CALayer 中的抗锯齿绘图

paintComponent() 方法中的抗锯齿

Metal2剖析:抗锯齿之基于Imageblock特性的增强MSAA

UE4在PSVR中的抗锯齿和优化相关知识

基于图片的抗锯齿方法