游戏中的抗锯齿技术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)
https://blog.csdn.net/qezcwx11/article/details/78426052
- SMAA的核心原理来源于MLAA,边缘检测加入了对比度的考量。SMAA是结合MLAA和SSAA/MSAA各自的优点,减轻FXAA导致的模糊的后处理抗锯齿技术。
- 边缘检测加入了对比度的考量;
- 分成垂直方向和水平方向的锯齿。
比较
- FXAA相比SMAA会更模糊,对比效果如下:https://images.nvidia.com/geforce-com/international/comparisons/just-cause-3/just-cause-3-anti-aliasing-interactive-comparison-001-smaa-vs-fxaa.html
新型抗锯齿技术
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提炼总结的主要内容,如果未能解决你的问题,请参考以下文章