MCPLive > 杂志文章 > 说好的抗锯齿 FXAA使用经验谈

说好的抗锯齿 FXAA使用经验谈

2012-07-02SSlab《微型计算机》2012年5月下

抗锯齿从一开始到现在,就向两个方向不断发展:更好的图形质量和更高效的计算方法。从早期的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的画质对比。
FXAA是后处理抗锯齿中相当优秀的一种技术。图为NVIDIA演示FXAA时的对比图,从左到右分别为NOAA、MSAA 4x和FXAA的画质对比。

对用户来说,显示屏可以被看作快速播放一张又一张游戏图片的“胶片电影机”。它上面由各种色彩和线条构成的图像存在着令人难以忍受的锯齿。那么,既然上文提到的在光栅化之前进行的抗锯齿算法不理想(SSAA、MSAA等抗锯齿都是在光栅化之前进行的),我们为什么不能将注意力转移到光栅化之后,即在用户能够看到的终游戏画面上进行抗锯齿处理呢?

一旦转换思路,就会发现这样做的好处实在是太明显了。首先,这不涉及任何3D计算的过程,不存在在3D计算中进行各种特殊的处理;其次,这种计算很有效率,因为它只是寻找终图片上的锯齿部分而已,那些“寻找不到”、“肉眼看不到”的部分是不会去计算的(在传统抗锯齿中,这些部分极有可能也被计算);第三,还是计算负荷问题,因为这种计算方法基本不需要做什么四倍、八倍等超级采样计算,甚至是一个类似Photoshop中的边缘羽化就可以实现抹除锯齿的效果,计算负荷小。

这就是后处理抗锯齿的原理,之前AMD在MLAA上已经展示过一次后处理抗锯齿的工作原理了。简单来说就是在图形光栅化之后,利用特殊的算法,寻找图片上那些可能存在锯齿的部分,然后用模糊、羽化等类似手段消除它们——这和传统的多重采样抗锯齿有异曲同工之妙。多重采样抗锯齿也是通过计算更多特征点的平均值,来获得更平滑的过渡效果,是数学意义上的“模糊”。不过MLAA存在影响纹理清晰度的问题,且性能表现不够理想,性能损失甚至和MSAA 4x相同,因此实际应用范围并不广泛。反倒是NVIDIA推广的FXAA后来居上,成为真正意义上可以大规模使用的后处理抗锯齿技术。

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就有作用(当然不一定全是正面作用)。

NVIDIA首次在控制面板中提供了FXAA设置选项
NVIDIA首次在控制面板中提供了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,则类似于在已经画好的图像上进行操作,存在一些难以预计的因素。

分享到:

用户评论

共有评论(1)

用户名:

密码: