即超级取样抗锯齿模式。这是最基本的抗锯齿模式,实现原理是渲染时把画面按照显示器分辨率的若干倍放大,如在1024x768分辨率上开启2xSSAA,GPU会先渲染2048x1536 图像,再“塞进”1024x768的边框里成型,将画面精细度提升一倍,毫无疑问会改善边缘锯齿情况。但是众所周知,高分辨率图形的渲染会极大的消耗 GPU运算资源和显存容量及带宽,因此SSAA资源消耗极大,即使是最低的2x也未必就能轻易承受。
2、MSAA--MultiSampling Anti-Aliasing
即多重取样抗锯齿模式。这是nVidia在NV20即GeForce 3显卡上首次引入实用化。简单说MSAA就是SSAA的改进版。SSAA仅仅为了边缘平滑,而不得不重新以数倍的 分辨率渲染整个画面,造成宝贵显卡处理资源的极大浪费,因此MSAA正是为了改善这种情况而生。MSAA实现方式类似于SSAA,不同之处在于MSAA仅 仅将3D建模的边缘部分放大处理,而不是整个画面。简单说3D模型是由大量多边形所组成,MSAA仅仅处理模型最外层的多边形,因此显卡的负担大幅减轻。 nVidia和ATI也不遗余力的推出各种MSAA优化技术用以提升MSAA的画面质量与速度,MSAA虽然是2002年推出的技术,当前却正是红火的正 式实用化时代,许多游戏在菜单里都提供了直接支持。
MSAA虽然趋于易用化,十分流行,但是缺点也很明显:1,如果画面中单位物体较多,需要处理的边缘多边形数量也自然增多,此时MSAA性能也会下降的十 分厉害。2,同样倍数的MSAA,理论上边缘平滑效果与SSAA相同,但是由于仅仅处理边缘部分的多边形,因此非边缘部分的纹理锐度远不如SSAA。
3、CSAA--CoverageSampling Anti-Aliasing
即覆盖取样抗锯齿。这是nVidia在G80及其衍生产品首次推向实用化的AA技术,也是目前nVidia GeForce 8/9/G200系列独享的AA技术。CSAA就是在MSAA基础上更进一步的节省显存使用量及带宽,简单说CSAA就是将边缘多边形里需要取样的子像素 坐标覆盖掉,把原像素坐标强制安置在硬件和驱动程序预先算好的坐标中。这就好比取样 标准统一的MSAA,能够最高效率的执行边缘取样,效能提升非常的显著。比方说16xCSAA取样性能下降幅度仅比4xMSAA略高一点,处理效果却几乎 和8xMSAA一样。8xCSAA有着4xMSAA的处理效果,性能消耗却和2xMSAA相同。
CSAA是目前最为先进的AA实现方式,可以遇见,在将来的两三年内,CSAA必定会获得大量游戏软件的直接支持从而大放异彩。
上述从技术角度分析了主流抗锯齿技术SSAA、MSAA、CSAA的差异。
下面重点说一下各种流行的AA实现方法。
通过技术方式直接提高画面效果的方法包括三种:
1、运用特效。
2、提高分辨率。
3、优化3D图形。
在优化3D图形方面,抗锯齿(AA)与各向异性过滤(AF)是主要部分,AA能够使得3D物体的边缘部分显得较为平滑,而AF则主要起到优化与视线有一定 夹角的3D图形表面材质显示质量的作用。
一、锯齿的形成
像素(Picture element)是显示设备中构成图像的最小单位,虽然像素非常的小,但是无数像素组织在一起才构成了一幅完整的图画,每一个象素都占据着画面上的某个区 域。像素在色彩缓冲区或屏幕中以一组整数类型的二维坐标(x,y)表示当前位置,如果在实际计算得到任何坐标为浮点数值的像素,该浮点数将被转换为整数坐 标。
举个例子:在游戏中,白色背景下,飞过一个黑色物体,若黑色物体的某坐标为100的话,画面表示则是第100个像素是黑色,第101个像素是白色。若黑物 体的坐标不是整数100而是浮点数100.1 的话,第100个素还是黑色,而第101个还是白色,此时失真便会产生。
根据计算可以知道:假设白色的亮度为0,黑色为100,则第101个灰色像素的亮度应为(0*0.9)+(100*0.1)=10
这个灰色像素(10)与白色像素(0)在视觉上是有差别的,计算机图形学称这种由于采样频率不足而造成的失真为锯齿(Aliasing)。
计算机处理像素的方法,通常是通过对某象素内的某一点进行采样,并用得到颜色来决定整个像素的颜色(PointSampling 点采样)。这样的做法的确有非常高的效率,可惜代价是采样得到的的某点的颜色无法完全体现该点所在的象素的实际颜色分布状况,特别是在物体边缘,这种缺陷 尤其明显。
图4 锯齿的形成
无论3D还是2D游戏的物体边缘,都会存在大量跨越着整个边缘的像素,实际上这些像素所想表示的图像信息(颜色)是有比例有尺寸的,符合现实情况的。但是 由于点采样技术的引入,使得边缘处的像素没有办法体现出这一比例或者尺寸,在物体边缘的整个像素里仅仅只能显示出边缘两边的某一种颜色。对于人眼来说,这 种不符合现实的边缘间的颜色跳变是十分敏感的,为了改善这种刺眼的锯齿,尽可能的修正像素原本应该显示的颜色信息,于是便有了抗锯齿 (Antialiasing)技术。
从锯齿形成的原理中可以分析推断,抗锯齿的方法不外乎下面几种:
1、提高分辨率,使得像素尽可能小。
2、将跨越边缘像素的前景色和背景色进行计算混合,用第3种颜色来填充该象素。
3、寻找一种更好的采样方法来替换点采样,对单个像素采用更细致的采样和计算。
二、抗锯齿技术
通过前文对锯齿形成机理的介绍,能够看出锯齿的形成与采样点不足有很大关系。分辨率的提高总有其瓶颈,而目前通过对采样点进行进一步处理的抗锯齿方式全景 抗锯齿FSAA(FullScene Anti-aliasing),基本可以说是最为主流的抗锯齿方式。
1、SSAA及其原理
采用了超级采样 (Super Sampling)技术对像素进行采样的工作方式称为SSAA。超级采样技术在3dfx的VSA100、Voodoo4、ATI Radeon 7xxx系列、NVIDIA GeForce 1/2系列被广泛应用。
在超级采样处理像素的过程中,每一个像素被分为数个子像素(Subpixel)进行采样,这样无疑比过去提高了每个像素内对颜色的描述精度。SSAA技 术,可以说是从软件角度提高了图形的分辨率,使得显卡所处理的图形分辨率比最终显示的分辨率大了几倍。
单个像素被分成了两个子像素进行采样,这使得该像素内颜色的描述更加精确了,但是另一方面,显卡所需处理的数据量却变成了原本的两倍。这种简单的技术由于 过于消耗显存的带宽而没有被过多的使用,特别是在更高效技术层出不穷的今天。
2、MSAA及其原理
作为目前作为主流的抗锯 齿技术,多重采样在GeForce 4系列中首先开始采用。多重采样在对子像素进行抗锯齿处理之前首先对子像素的位置进行检测,忽略对像素的采样影响不大内部部分,仅仅处理会产生锯齿的对象 边缘的部分,从而大大大降低了所需要处理的数据量。
如图所示,处于三角形内部的像素并不需要进行处理。MSAA跟SSAA相比,大幅度降低了处理量。但是MSAA由于忽略了像素内部部分,因此不能改善一个 使用了透明材质的物体内部的画质,之后为了解决这一问题又产生了TMAA,对透明以及细小物体的边缘做进一步处理。
3、Quincunx及其原理
Quincunx 5点采样抗锯齿技术是Nvidia改良之后的MSAA,每次采样4个像素内共5个子像素的数据,它的像素采样量相当于MSAA 2x的水平模式,而子像素数据则要多上1个,开启Quincunx实际效果则约相当于MSAA 4x的水平。
4、CSAA及其原理
CSAA(Coverage Sampling Anti-Aliasing,覆盖面采样),其中心依然是利用更加优化的算法降低数据传输的带宽压力,所要达到的抗锯齿倍数却仍然很高,这是一种高性价比 的解决办法,其思路源自于Quincunx算法,CSAA将其思路扩展到了更多的采样样本(子像素)。传统的采样技术MSAA通常都只是对模型的覆盖面进 行采样,CSAA的新抗锯齿技术同时使用到了覆盖面采样和几何采样。
在CSAA的采样中,色彩值和深度值是由被采样的点中心取得,并且运用特殊的算法对得到的多个像素中心得到的数据进行比较,剔除重复部分,保留与其他数据 不同的的色彩和深度值,最终在使用同样的子像素采样点的情况下,降低需要保存的Color/Z数据。
相对于MSAA采样模式而言,CSAA在覆盖面采样点数相同的情况下,所要保存的Color数据(颜色数据)和Z数据(深度数据)将减小至原来的25%到 50%,(CSAA 8x的数据量相当于MSAA 4x数据量),这大大节约了抗锯齿所需要的显存带宽。
5、TSAA与TMAA
GeForce 7系列显卡开始支持TSAA(透明动态超采样)与TMAA(透明动态多采样),TSAA(Transparency Adaptive Supersampling)和TMAA(Transparency Adaptive Multisampling)实际上是SSAA和MSAA的改进版本,这有效地解决了之前的抗锯齿技术在Direct 3D环境下处理细长的物体如栅栏、树叶、植物等效果时缺乏Alpha混色能力的问题。TSAA和TMAA通过控制纹理的Alpha值,对细小边角使用 Alpha混色,从而在画面的细节部分更完美,使得在细长物体的AA表现上有了提升。
三、关于各向异性过滤 (Anisotropic Interpolation)
既然前面提到了AF,那么下文简要对AF作一下简单介绍。
对普通用户来说,AF打开和关闭后最直观的感觉就是改善了贴图接缝问题和不规则物体的材质贴图。(大家可以注意下,两个版本DMC4的不少物体边缘有闪烁 现象,这就是AF不足的问题导致的。)
在3D游戏中的3D对象都经过了一定的材质处理,随着材质不断显示后视角的增加,显示出的材质会逐渐模糊变形。为了解决这个问题,图形处理器开始使用材质 过滤。最早的材质过滤是双线性的,会呈现明显的过滤条纹。
现今最常使用的过滤方式是各向异性过滤(Anisotropic filtering),和AA一样,各向异性过滤有着自己的等级,等级越高效果越好。各向异性过滤和抗锯齿一样,要求硬件的运算能力更强,且随着AF的级 别上升依然消耗大量的系统资源。
在对3D物体进行渲染的时候,需要对每个纹理单元进行取样,使得物体在屏幕上可以按照预先设想好的形式显示出来,但是实际上需要映射的像素却往往是另外一 个数值,这时显示出来的结果就有可能不是预想好的画面,可能出现不规则的块状,这是由于视觉以及视角的关系产生的。如果纹理很细小而像素颗粒很大的情况 下,纹理相互临近的像素就会赋予纹理上同一个元素,在显示的时候出现多个像素拥挤在一起的块状图形。如果多个纹理元素结合在一起对应一个像素,就需要通过 图形处理器的算法来决定哪个纹理元素需要被映射。下面是几种主流映射算法:
Bilinear Interpolation (双线过滤)
这是一种较好的材质影像插补的处理方式,会先找出最接近像素的四个图素,然后在它们之间作差补效果,最后产生的结果才会被贴到像素的位置上,这样不会看到 “马赛克”现象。这种处理方式较适用于有一定景深的静态影像,不过无法提供最佳品质。其最大问题在于,当三维物体变得非常小时,一种被称为Depth Aliasing artifacts(深度赝样锯齿),也不适用于移动中的物件。
Trilinear Interpolation (三线过滤)
这是一种更复杂材质影像插补处理方式,会用到相当多的材质影像,而每张的大小恰好会是另一张的四分之一。例如有一张材质影像是512×512个图素,第二 张就会是256×256个图素,第三张就会是128×128个图素等等,总之最小的一张是1×1.凭借这些多重解析度的材质影像,当遇到景深极大的场景时 (如飞行模拟),就能提供高品质的贴图效果。一个“双线过滤”需要三次混合,而“三线过滤”就得作七次混合处理,所以每个像素就需要多用21/3倍以上的 计算时间。还需要两倍大的存储器时钟带宽。但是“三线过滤”可以提供最高的贴图品质,会去除材质的“闪烁”效果。对于需要动态物体或景深很大的场景应用方 面而言,只有“三线过滤”才能提供可接受的材质品质。
Anisotropic Interpolation (各向异性过滤)
取样时候,会取8个甚至更多的像素来加以处理,所得到更好的质量。
图8 三线性过滤和各项异性过滤效果对比图
注:部分内容来自图形专业网站,有英文阅读能力的也可以查看NV图形网站。
链接:
http://developer.nvidia.com/object/coverage-sampled-aa.html