抗锯齿(英语:anti-aliasing,简称 AA),也译为边缘柔化、消除混叠、抗图像折叠有损,反走样等。它是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术,那些凹凸的锯齿通常因为高分辨率的信号以低分辨率表示或无法准确运算出 3D 图形坐标定位时所导致的图形混叠(aliasing)而产生的,抗锯齿技术能有效地解决这些问题。
超级采样抗锯齿(SSAA)
超级采样抗锯齿(Super-Sampling Anti-Aliasing,简称 SSAA)是比较早期的抗锯齿方法,比 较消耗资源,但简单直接。这种抗锯齿方法先把图像映射到缓存并把它放大,再用超级采样把放大后的图像像素进行采样,一般选取 2 个或 4 个邻近像素,把这些采样混合起来后,生成的最终像素,令每个像素拥有邻近像素的特征,像素与像素之间的过渡色彩,就变得近似,令图形的边缘色彩过渡趋于平滑。再把最终像素还原回原来大小的图像,并保存到帧缓存也就是显存中,替代原图像存储起来,最后输出到显示器,显示出一帧画面。这样就等于把一幅模糊的大图,通过细腻化后再缩小成清晰的小图。如果每帧都进行抗锯齿处理,游戏或视频中的所有画面都带有抗锯齿效果。 超级采样抗锯齿中使用的采样法一般有两种:
-
OGSS,顺序栅格超级采样(Ordered Grid Super-Sampling,简称 OGSS),采样时选取 2 个邻近像素。
-
RGSS,旋转栅格超级采样(Rotated Grid Super-Sampling,简称 RGSS),采样时选取 4 个邻近像素。
另外,作为概念上最简单的一种超采样方法,全场景抗锯齿(Full-Scene Antialiasing,FSAA)以较高的分辨率对场景进行绘制,然后对相邻的采样样本进行平均,从而生成一幅新的图像。
多重采样抗锯齿(MSAA)
多重采样抗锯齿(Multi Sampling Anti-Aliasing,简称 MSAA),是一种特殊的超级采样抗锯齿(SSAA)。MSAA 首先来自于 OpenGL。具体是 MSAA 只对 Z 缓存(Z-Buffer)和模板缓存 (Stencil Buffer)中的数据进行超级采样抗锯齿的处理。可以简单理解为只对多边形的边缘进行抗锯齿处理。这样的话,相比 SSAA 对画面中所有数据进行处理,MSAA 对资源的消耗需求大大减弱,不过在画质上可能稍有不如 SSAA。
为什么延迟渲染对MSAA支持不好?
脱离实际的软硬件环境来讲的话,延迟渲染是完全可以支持MSAA的。
MSAA算法的核心就是容许在必要的地方(被多个片段所覆盖的像素)记录多个样本,最终通过一个叫resolve的过程从多个样本计算得出最终的像素颜色取值。
也就是,对于记录渲染结果的缓冲区,应该采用一种记录格式,这种格式允许记录同一个像素的多个样本信息(该像素被不同多边形(含三角形)覆盖时)
最为简单的方式,就是无脑增加每个像素在缓冲区当中对应的比特数,从而使其可以记录多个样本。比如,当开启8倍MSAA时,将所有记录渲染结果的缓冲区大小设置为未开时的8倍,就可以使得每个像素最多可以“记住”8个多边形对应的数据。
在前向渲染的时候,几何渲染输出结果为颜色和深度,因此只需要将这两个缓冲区容量扩大就可以了。
但是对于延迟渲染,因为其几何渲染输出的为光照前数据,包含诸如Albedo、法线、金属度、粗糙度、AO、次表面散射、材质编号等等多种数据,会使用远多于前向渲染的缓冲区,将这些缓冲区全部增大数倍甚至十数倍(如16xMSAA),对GPU显存的开销极大,而且大大增加了深度测试所需读写的数据量,以及PS着色器需要写入的数据量,使得渲染性能也降低。这点别的回答也提到了。
但是,本质上延迟渲染所使用的多个缓冲区,其数据的重要性并不是相同的。有些缓冲区当中数据的变化很丰富,非常有层次感;而有些缓冲区当中的数据则十分单调,甚至只是0/1这种二选一的黑白图。有些对最终画面的影响很大,有些则很小。所以其实并非所有的缓冲区都需要按照MSAA的倍数进行增大,这里面有优化空间。
其次,只有那些被多个多边形覆盖且在此像素面积内相互不完全遮挡的像素,才会真正记录多个采样。除非渲染大量细微三角形,否则画面当中的大部分区域其实只用得到一个采样值。也就是说,增大了几倍的缓冲区里面,大部分空间其实被浪费。因此,理论上采用更为高级的数据结构,比如类似链表之类的结构来组织存储的话,会有更好的空间密度和更低的访问带宽。
但是,这些缓冲区是供GPU访问的。硬件访问诸如链表等变长结构很不容易,会使得寻址困难,硬件设计变得十分复杂。所以现实当中还是采用线性列表的方式,用空间换设计效率。在一些近代显卡上,会额外增加硬件实时压缩解压模块,减少对缓冲区的读写带宽。但是存储空间还是老样子。
至于不同的G BUFFER使用不同的设置,这个在当前大部分设备上也是受硬件的限制,做不到。大部分Gbuffer采用的是硬件提供的MRT机能,也就是多Render Target功能实现的。这个功能目前在很多硬件上要求RT的设置完全一样,所以无法实现不同的RT不同的设置。但是现在在一些高端卡上开始逐渐解除这个限制。
总之,诸如UE等在开启延迟渲染的时候无法开启MSAA,这主要是现实原因,而非理论上无法实现。
转自知乎为什么延迟渲染不支持MSAA
覆盖采样抗锯齿(CSAA)
覆盖采样抗锯齿(Coverage Sampling Anti-Aliasing,简称 CSAA)是 NVIDIA 在 G80 及其衍生产品首次推向实用化的 AA 技术,也是目前 NVIDIA GeForce 8/9/G200 系列独享的 AA 技术。CSAA 就是在 MSAA 基础上更进一步的节省显存使用量及带宽,简单说 CSAA 就是将边缘多边形里需要取样的子像素坐标覆盖掉,把原像素坐标强制安置在硬件和驱动程序预先算好的坐标中。这就好比取样标准统一的 MSAA,能够最高效率的执行边缘取样,效能提升非常的显著。比方说 16xCSAA 取样性能下降幅度仅比 4xMSAA 略高一点,处理效果却几乎和8xMSAA 一样。8xCSAA 有着 4xMSAA 的处理效果,性能消耗却和 2xMSAA 相同。
高分辨率抗锯齿(HRAA)
高分辨率抗锯齿方法(High Resolution Anti-Aliasing,简称 HRAA),也称 Quincunx 方法,也出自 NVIDIA 公司。“Quincunx”意思是 5 个物体的排列方式,其中 4 个在正方形角上,第五个在正方形中心,也就是梅花形,很像六边模型上的五点图案模式。此方法中,采样模式是五点梅花状,其中四个样本在像素单元的角上,最后一个在中心。
可编程过滤抗锯齿(CFAA)
可编程过滤抗锯齿(Custom Filter Anti-Aliasing,简称 CFAA)技术起源于 AMD-ATI 的 R600家庭。简单地说 CFAA 就是扩大取样面积的 MSAA,比方说之前的 MSAA 是严格选取物体边缘像素进行缩放的,而 CFAA 则可以通过驱动和谐灵活地选择对影响锯齿效果较大的像素进行缩放,以较少的性能牺牲换取平滑效果。显卡资源占用也比较小。
形态抗锯齿(MLAA)
形态抗锯齿(Morphological Anti-Aliasing,简称 MLAA),是 AMD 推出的完全基于 CPU 处理的抗锯齿解决方案。与 MSAA 不同, MLAA 将跨越边缘像素的前景和背景色进行混合,用第2 种颜色来填充该像素,从而更有效地改进图像边缘的变现效果。
快速近似抗锯齿(FXAA)
快速近似抗锯齿(Fast Approximate Anti-Aliasing,简称 FXAA) ,是传统 MSAA(多重采样抗锯齿)效果的一种高性能近似。它是一种单程像素着色器,和 MLAA 一样运行于目标游戏渲染管线的后期处理阶段,但不像后者那样使用 DirectCompute,而只是单纯的后期处理着色器,不依赖于任何 GPU 计算 API。正因为如此,FXAA 技术对显卡没有特殊要求,完全兼容NVIDIA、AMD 的不同显卡(MLAA 仅支持 A 卡)和 DirectX 9.0、DirectX 10、DirectX 11。
时间性抗锯齿(TXAA)
时间性抗锯齿(Temporal Anti-Aliasing,简称 TXAA),将 MSAA、时间滤波以及后期处理相结合,用于呈现更高的视觉保真度。与 CG 电影中所采用的技术类似,TXAA 集 MSAA 的强大功能与复杂的解析滤镜于一身,可呈现出更加平滑的图像效果。此外,TXAA 还能够对帧之间的整个场景进行抖动采样,以减少闪烁情形,闪烁情形在技术上又称作时间性锯齿。目前,TXAA 有两种模式:TXAA 2X 和 TXAA 4X。TXAA 2X 可提供堪比 8X MSAA 的视觉保真度,然而所需性能却与 2X MSAA 相类似;TXAA 4X 的图像保真度胜过 8XMSAA,所需性能仅仅与 4X MSAA 相当。
多帧采样抗锯齿(MFAA)
多帧采样抗锯齿(Multi-Frame Sampled Anti-Aliasing,MFAA)是 NVIDIA 公司根据 MSAA 改进出的一种抗锯齿技术。目前仅搭载 Maxwell 架构 GPU 的显卡才能使用。可以将 MFAA 理解为 MSAA 的优化版,能够在得到几乎相同效果的同时提升性能上的表现。MFAA 与 MSAA最大的差别就在于在同样开启 4 倍效果的时候 MSAA 是真正的针对每个边缘像素周围的 4 个像素进行采样,MFAA 则是仅仅只是采用交错的方式采样边缘某个像素周围的两个像素。
Reference
《Real-Time Rendering 3rd》