我们所看到的图像的基本构成单位是像素,而像素的形状则是一个又一个的小方格,当两个相邻像素存在巨大的颜色反差时,这两个像素中间就会出现一条非常显眼的颜色分界线。颜色分界线带来的界面效应是区分物体边缘的重要标识。
AA过程,本质上就是界面过渡性的调整
对于垂直和水平出现的像素分界来说,由于其本身的范围非常均一,因此并不会造成界面效果之外的效应,但当像素分界以斜线的形式出现时,效果就完全不一样了。斜向像素分界线,正是困扰3D图形界多年的问题——锯齿。
打开你的画笔,尝试着画一条最简单的斜线,然后放大看看。是的,非常不幸,这就是让人讨厌的锯齿,外号“狗牙”。
既然锯齿的产生源自斜向分布像素之间的反差所生成的颜色分界线,那么淡化这条分界线就成了抗锯齿的首选方案。分界线的碍眼是因为他极强的对比性,那么我们如果将分界线周围数个像素的颜色提取出来进行混合,然后重新赋予分界线周围这些像素“中和”后的颜色,不就能让原本非常突兀的颜色分界线变成自然平顺的颜色过渡,并借以消灭碍眼的锯齿了么?没错,事实上这正是通行的抗锯齿操作方式的最简洁描述。
目前最常见的抗锯齿方式来自MSAA,MSAA全称MultiSampling Anti-Aliasing,意思就是多重采样抗锯齿。这一过程的起点开始于对图像的放大,我们首先要将整个图像放到帧缓存中进行放大,然后对颜色反差巨大的物体边缘部分的像素及其周围的像素进行提取和混合,形成比原来更加自然但也更加模糊的颜色过渡,最后再将图像缩小回原来的尺寸以便减轻颜色过渡产生的模糊现象。
由于放大缩小操作需要大量帧缓存来进行映射和缓冲,所以MSAA过程对显存容量以及带宽的消耗是非常巨大的。尽管MSAA仅对Z-Buffer和Stencil Buffer进行操作,但这种操作仍旧成为了目前图形应用中对显存带宽要求最为巨大的部分之一。过高的显存带宽需求不仅限制了大部分显卡在游戏中的帧数表现,更让开发者不得不对显存带宽有所顾忌进而放弃使用分辨率更高的材质。为了解决这一矛盾,FXAA出现了。
FXAA全称Fast Approximate Anti-Aliasing,意为快速近似抗锯齿,我们可以将之理解成MSAA操作过程的高度近似。FXAA是一种典型的边缘检查取样操作,它属于Shader的一种特殊应用,它的基本原理与MSAA相同,都是通过提取像素界面周围的颜色信息并完成色彩调整来消除高对比度界面所产生的锯齿,但作为后效处理(Post-Processing)的一部分,它将像素的提取和混合过程直接交给GPU的ALU以着色的形式执行,整个过程以像素颜色调节为核心,并不涉及图像的放大和过多增量渲染,因此其所占用的显存带宽要明显低于传统的在ROP中进行的MSAA。另外,由于它并不是必须依赖Direct Compute进行执行,因此不仅可以兼容DirectX 9~DirectX 11等多种API,而且AMD显卡在理论上一样可以进行执行。