抗锯齿从一开始到现在,就向两个方向不断发展:更好的图形质量和更高效的计算方法。从早期的SSAA暴力算法,到对性能要求相对不高的MSAA算法,然后到CSAA和CFAA等厂商优化算法,再到近开始流行的后处理抗锯齿,比如MLAA,以及今天我们要介绍的FXAA等,都在画质和计算负荷上不断优化。随后,NVIDIA在推出GTX 680之际更是首次将FXAA集成在驱动控制面板中,引起了玩家的极大兴趣。
首先,我们要明确的是FXAA是一种后处理抗锯齿技术。由于后处理抗锯齿技术在性能和画质上的优势,很多厂商和玩家都开始关注这种全新的抗锯齿算法。一般来说,传统的抗锯齿技术需要依靠更多的采样来获得更精细的画质,而且非常耗费计算资源。而后处理抗锯齿只对后期图形做像素意义上的处理,复杂程度只和终显示的图像本身的复杂程度相关,资源耗费极小。
如果你对上述描述依旧不太明白的话话,下面有更详细的解释。传统的抗锯齿算法是依靠大幅度增大计算量来实现,比如SSAA 4x,它是将图像放大到原始分辨率的四倍,然后缩小后显示在屏幕上。在这个放大过程中,所有的3D计算量都被大大加重了,效果虽然好但由于易用性不高,很快被抛弃。目前比较常见的MSAA算法则是只考虑多边形的边缘部分,在边缘部分多采样,比如四倍和八倍采样,或者增加额外采样点(CSAA的原理)来实现抗锯齿效果。
MSAA相比SSAA可以减少大量的计算,毕竟只有多边形的边缘需要加倍计算(SSAA需要重复计算所有可见的面),因此对性能要求更低。但MSAA只计算边缘也令其对复杂的网格状或者密集孔洞的物体完全“失效”,比如铁丝网、充满孔洞的树叶甚至百叶箱窗栅和条状带间距的木地板等。这些场景往往使用了拥有透明α值的贴图,对MSAA来说不存在可寻找的边缘。在这种场合,就需要TRAA透明抗锯齿(或者叫做自适应抗锯齿)出场了。这种抗锯齿技术类似SSAA,也是将这些密集网格部位放大分辨率计算然后缩小显示,也颇为耗费资源。
FXAA是后处理抗锯齿中相当优秀的一种技术。图为NVIDIA演示FXAA时的对比图,从左到右分别为NOAA、MSAA 4x和FXAA的画质对比。
对用户来说,显示屏可以被看作快速播放一张又一张游戏图片的“胶片电影机”。它上面由各种色彩和线条构成的图像存在着令人难以忍受的锯齿。那么,既然上文提到的在光栅化之前进行的抗锯齿算法不理想(SSAA、MSAA等抗锯齿都是在光栅化之前进行的),我们为什么不能将注意力转移到光栅化之后,即在用户能够看到的终游戏画面上进行抗锯齿处理呢?
一旦转换思路,就会发现这样做的好处实在是太明显了。首先,这不涉及任何3D计算的过程,不存在在3D计算中进行各种特殊的处理;其次,这种计算很有效率,因为它只是寻找终图片上的锯齿部分而已,那些“寻找不到”、“肉眼看不到”的部分是不会去计算的(在传统抗锯齿中,这些部分极有可能也被计算);第三,还是计算负荷问题,因为这种计算方法基本不需要做什么四倍、八倍等超级采样计算,甚至是一个类似Photoshop中的边缘羽化就可以实现抹除锯齿的效果,计算负荷小。
这就是后处理抗锯齿的原理,之前AMD在MLAA上已经展示过一次后处理抗锯齿的工作原理了。简单来说就是在图形光栅化之后,利用特殊的算法,寻找图片上那些可能存在锯齿的部分,然后用模糊、羽化等类似手段消除它们——这和传统的多重采样抗锯齿有异曲同工之妙。多重采样抗锯齿也是通过计算更多特征点的平均值,来获得更平滑的过渡效果,是数学意义上的“模糊”。不过MLAA存在影响纹理清晰度的问题,且性能表现不够理想,性能损失甚至和MSAA 4x相同,因此实际应用范围并不广泛。反倒是NVIDIA推广的FXAA后来居上,成为真正意义上可以大规模使用的后处理抗锯齿技术。
作为目前优秀的后处理抗锯齿技术,FXAA在性能和抗锯齿效果表现上都相当令人满意。
从原理来说,FXAA依旧是通过特定算法寻找如高反差边缘等可能存在锯齿的区域,并进行模糊处理。不过FXAA并不像MLAA那样使用Direct Compute进行处理,只是使用了后期处理着色器,因此不依赖于任何特定GPU和API——当然太老的GPU也是不行的。NVIDIA方面只要支持DirectX 9.0c的GPU理论上都能实现FXAA效果(比如GeForce 6600 GT)。FXAA兼容所有AMD和NVIDIA的显卡(MLAA只能在AMD显卡上运行),完美支持DirectX 9.0到DirectX 11的所有API。除此之外,FXAA基本上做到了软件无关性,只要是和显卡相关的应用,FXAA就有作用(当然不一定全是正面作用)。
除了更广泛的兼容性外,考虑到不同类型用户的需求,FXAA在处理模式上开发出了多种方法以适应不同用户。其中FXAA 1出现得早,在PC游戏中使用多,比如《Crysis 2》、《战地3》等游戏就使用了FXAA 1来处理锯齿;FXAA 2专门针对Xbox 360设计;FXAA 3则有更多的选择,高质量版本针对PC,而普通的主机版本则面向Xbox 360和PS3。
在性能方面,由于计算不需要Direct Compute参与,因此FXAA比MLAA、MSAA 4x的资源耗费更少。笔者的后文测试会给出详细的数据。在画质方面,在NVIDIA控制面板中开启的FXAA大概和MSAA 4x的效果相当。不仅如此,FXAA相比MSAA还存在一定优势。FXAA还可以和任意类型的AA混合使用。比如FXAA+MSAA、FXAA+CSAA等,都可以进一步提高画质。特别是FXAA+MSAA,既可以提高AA画质,还能够对网格等透明物体处进行抗锯齿操作,效果更为出色。
当然,FXAA相比MSAA也存在劣势,那就是对纹理特别是字体的处理可能会带来一定程度的锐度损失。这和MLAA导致字体、纹理模糊的原因基本相同。这类后处理抗锯齿技术主要是依靠寻找高对比度的边缘来实现抗锯齿效果,而字体和变化的纹理边缘往往容易“躺着也中枪”。FXAA虽然无法完全避免这类问题的出现,但会尽可能降低影响。FXAA在算法上确定需要被抗锯齿的范围时更为谨慎,进行抗锯齿处理时处理范围会更小。
当然,这里的损失或者字体边缘破坏等现象,都是基于在NVIDIA控制面板中打开FXAA后的情况。如果游戏中本身集成了FXAA,那么游戏制作人员会根据需要将FXAA的过程适当提前,比如在文本显示甚至纹理贴图之前就可以进行FXAA处理。这种集成在游戏中的FXAA会带来更为优秀的抗锯齿效果和完全无损的文本、纹理表现。相比之下,在NVIDIA控制面板中打开FXAA,则类似于在已经画好的图像上进行操作,存在一些难以预计的因素。
主要测试平台
CPU :Core i7 2600K
主板 :Intel Z68
内存 :DDR3 1600 4GB×2
显卡 :GeForce GTX 560 Ti
FXAA究竟使用的情况如何?画质是否令人满意?对性能的要求真的不高吗?在接下来的部分,笔者将选用几款热门游戏进行FXAA抗锯齿的实际测试和对比。
《坦克世界》是一款内置了FXAA的游戏,其值得关注的地方是游戏场景中的草木较多,FXAA在这种复杂场景下的性能表现值得期待。在NOAA状态下(图上),对《坦克世界》这种游戏来说,画面本身色调比较接近,没有特别鲜明对比的地方,一般情况下锯齿不是特别明显。但在远处天空背景下,直立的电线杆、旗帜、草木、木框上的锯齿还是比较“扎眼”的。在将FXAA设置为“高”以后(图下),抗锯齿效果非常明显。另外,这款游戏在开启FXAA后,性能下降甚至不到5%,性能表现非常出色。
《战地3》一开始并不支持FXAA,后来通过打补丁方式得以支持。笔者可以很方便地用它对比NOAA、FXAA和MSAA的差异。从截图对比来看,当处于NOAA(图1)状态时,画面的座椅顶部、侧边以及边上的铁栅栏处锯齿现象很明显。在开启了MSAA 4x(图3)后,锯齿现象得到了相当大的改善。FXAA(图2)的抗锯齿效果也相当不错,基本和MSAA 4x效果相当。性能方面,FXAA的性能损失大约在5%左右(开启、关闭FXAA的帧数分别为67fps和70fps),而MSAA 4x则大约在32%左右(开启、关闭MSAA 4x的帧数分别为48fps和70fps)。显然,FXAA的性能损失更低。
《魔兽世界》内置了MSAA,但是对性能要求较高,开启以后性能损失在30%以上。笔者主要对比开启和关闭FXAA的画质表现。在NOAA状态下(上图),画面锯齿相当明显,基本上所有的边缘都有可见的锯齿存在。开启FXAA后(下图),锯齿消失殆尽,画质得到明显提高。比如人物边缘、武器边缘等部位。不过游戏中部分物体在FXAA状态下竟然没有任何抗锯齿效果,比如一些旗帜和高塔,这可能与FXAA检测处理有关。性能方面,在开启了FXAA后,GTX 560Ti的性能下降了14%,性能损失令人满意。
根据笔者的测试,对FXAA进行如下的总结。性能方面,FXAA表现极为优秀,是目前性能损耗较低的抗锯齿算法,建议能够开启FXAA的游戏尽量使用FXAA作为首选抗锯齿(个别游戏除外);画质方面,FXAA基本达到了MSAA 4x的效果,并且对透明物体的抗锯齿处理也有很好的表现。纹理模糊方面,目前测试尚未发现明显现象,因此FXAA对画质的增强是可信赖的。但FXAA可能会引起字体破坏,特别是游戏引擎较老的游戏,这种可能性会增大,好在绝大部分新游戏使用FXAA时都不会有太大的问题。除此之外,在NVIDIA控制面板开启FXAA、调用GPU渲染网页、打开IE的情况下,FXAA甚至会主动对网页进行“抗锯齿”操作,终结果就是网页字体变形,甚至难以阅读。