原文:http://vga.zol.com.cn/2002/1007/48701.shtml
一代又一代的图形芯片和显卡不断的推出,PC图形子系统的图形处理能力也随之大幅度的提高,这使得我们有可能在计算机上看到更精美的实时生成的图像。无论图形芯片如何改进,在图形输出技术没有革命性变化的今天,我们看到的最终图像依然是由上百万个显示屏上的像素组成的。正是因为像素的存在,使得图像总是存在一个近乎于无法完全克服的缺点:锯齿。
在现实世界中相邻的两个物体边缘一般是光滑的,但是在电脑上生成的图像中相邻的物体边缘却并非现实中如此完美--即使是在最新的Radeon 9700生成的图像上我们也可以轻易的找到锯齿现象。目前,这已经成为了计算机图形应用需要迫切解决的问题。我们常常提到的全屏抗锯齿(full-scene anti-aliasing,FSAA)就是主要的解决方法之一。
在对于全屏抗锯齿技术进行进一步的介绍之前,我还需要提及Voxel算法--一种主要用于3D场景中地形建模的方法。Voxel其实是Volume Pixel的缩写,如果你非要把它翻译成为中文的话叫做“体积像素”或者“立体像素”应该都差不多。相对于普通的像素来说,Voxel包含了更多的数据,这些数据可以帮助系统有效的降低锯齿现象,而且除了处理这些Voxel之外无需做任何额外的计算。曾经一款叫做Outcast的游戏就应用了这种技术,但是Voxel算法对于当时的Pentium II系统来说负担相当的重,而且其计算量使得现在的计算机系统也并不适合运行它,可见这种技术的广泛应用将是在图形芯片进一步的飞跃之后的事情。本文并无意讨论这种技术,因为这种技术所涉及面的广度和深度并不是我所能很快理解和接受的,这里仅仅以此为例告诉大家用于解决锯齿问题的技术并不仅仅是FSAA,还有很多其它的优秀技术。
超级采样(supersampling)
超级采样被普遍应用于ATI RADEON7000/7200/7500、NVIDIA GeForce 256、GeForce2 GTS/Pro/Ultra/Ti和GeForce2 MX等图形芯片中,这些图形芯片在处理图像的过程中,每个像素被“分为”几个子像素(subpixel)--这其实就是所谓的采样,然后进行独立的处理并写入缓存。当进行图像输出的过程中,所进行的是这个过程的反过程,所有的像素是根据之前分离出来的子像素来构建的,也就是说之前分离的子像素将会影响最终的输出图像的效果和质量。
在超级采样的过程中,图形芯片所处理的图像的分辨率比实际需要输出的图像的分辨率大的多。比如,在800x600分辨率下采用了2x2超级采样模式的情况下,图形芯片实际所处理的图像分辨率是1600x1200--也就是说我们实际得到的图像只是图形芯片所处理图像的数据的1/4。(VSA100和Voodoo4/5图形芯片也是应用了超级采样技术,不过同前面所介绍的情况有所区别,我们这里的讨论不包括这几种芯片)。
超级采样所带来的图像质量的提升是有目共睹的,不过负面效应也是显著的。就是图形芯片的处理效率明显的下降,以前面的例子来说,用户所得到的实际效果只是图形芯片处理能力的四分之一。即使图形芯片的处理能力能大幅度的提高,这种技术也并不适合,比较效率太低。为此,多个图形芯片公司都在开发新的抗锯齿技术。比如,nVidia在推出GeForce 3(NV20)的同时也给我们带来了Multisampling(多级采样)、HRAA(高分辨率抗锯齿)、Quincunx(5点抗锯齿)。
多级采样(multisampling)
NVIDIA GeForce3/GeForce4/GeForce4 MX都采用了多级采样技术,这种技术同之前的GeForce2芯片相比,主要区别在于需要处理的数据数量(subpixels的数量)。多级采样所需要处理的子像素数量明显低于超级采样,主要是在对于像素进行抗锯齿处理之前首先对于像素的位置进行检测,看其是否位于对象的边缘,也就是仅仅处理对象边缘的像素从而大大大降低了所需要处理的数据的量,同时还能保证抗锯齿质量。
如图1所示,这是我们需要生成的图像。如果目前需要处理的像素或者子像素都位于三角形内部,那么这个时候并不需要进行抗锯齿处理,因为对象的颜色是一样的,没有锯齿可言。因此图形芯片只要把这个区域赋予同样的颜色或者材质就可以了。
但是如果需要生成位于三角形边缘的像素,图形芯片则需要考虑抗锯齿的问题了。这个时候如果把相同的颜色或者材质赋予整个像素则会产生明显的锯齿现象,因此需要再详细的计算子像素的位置,看它是否真的位于三角形边缘之外还是之内,然后根据情况更加精确的处理像素,这样我们最后看到的图像的锯齿现象就会明显的减弱。
这就是为什么从GeForce3开始,GPU开始能够提供与超级采样抗锯齿效果相近但是芯片的性能下降幅度却明显减少的原因。Nvidia把这种抗锯齿技术称为HRAA(High Resolution Anti Aliasing,高分辨率抗锯齿),这种抗锯齿技术在多级采样的基础上做了进一步的发展,为了让像素的最终效果更加精确,这种抗锯齿技术不仅仅使用一个像素上的采样点或者说子像素的数据,而是把周围临近像素的采样点也做为计算的依据,这种抗锯齿模式就是HRAA Quincunx模式--它的采样数据量仅仅同HRAA 2x模式一样,但是却通过计算5个采样点来确定一个子像素的计算方式来得出最后的结果:
可以看到Quincunx利用了周围像素的5个子像素来计算,当然这5个采样点的权重是不同的,也就是它们对于计算结果的影响力是不同的。NVIDIA GeForce4 Ti和GeForce4 MX继承了NVIDIA GeForce3的抗锯齿模式,不过它采用了一个新名字“Accuview”。
SMOOTHVISION技术
ATI从Radoen 8500开始引入了SMOOTHVISION技术,这种抗锯齿技术最高支持16x抗锯齿--也就是可以对于同一个像素进行16次采样,这样可以得到更加贴近设计的结果,当然对于性能的影响也是明显的。
如上图所示,左边的图所表示的SMOOTHVISION预设的8个采样点的位置,即使是16x采样,也是根据这个图所示的采样点来进行的。如果进行的是2x抗锯齿,图形芯片则会在相邻的8个像素上按照这个规则进行采样,如果是4x抗锯齿模式,图形芯片则会在相邻的4个像素上分别进行4点采样,如上图所示。可以看到,每个像素上的采样点都是不同的,ATi称这样“随机”的采样比使用固定的采样点的超级采样具有更好的图像质量。听上去这种采样方式的确不错,但是它毕竟不是完全随机的采样,而是在16个预设的点中随机的分配给一组像素。比如,2x模式就是分配给8个像素,随之而来的问题是,部分像素会因为被分配给的采样点的位置比较特殊而产生不准确的结果--这个结果可能会同实际需要的结果有很大的偏差。这些缺点也正是超级采样所面临的主要问题,因此SMOOTHVISION只是超级采样的一个小小的修正版本--至少我们(xbitlabs)是这么认为的。
弱点和瓶颈
在下面的文字中我们主要来讨论一下当前显卡中所应用的超级采样和多级采样的主要优点和缺点。下图所表示的是对于同一个对象的不同的位置进行采样的结果:
对于图中蓝白相间的两个倾斜色带(水平和竖直的情况是不会有锯齿的)的不同位置进行采样,得到的结果完全不同,采样的结果不同将会导致最后图像还原的时候出现偏差。上图左1表示采样点在白色带处,那么采样的结果是白色,最后图形芯片就认为这条蓝白相间的色彩的颜色是白色;左2到左5依次显示采样结果的颜色越来越深,这都不能完全反映图像原来的情况。不过,只要有足够的采样点,采样结果还是基本准确的:
上图中所显示的就是比较理想的进行了抗锯齿处理的效果。如果在实际应用中我们看到的效果都是这样的,那么图像的质量应该已经相当不错了,但是——
在实际应用中,边缘的倾斜角度是各不相同的,如下图中接近水平(一般的认为接近0°、90°和45°、135°的边缘都存在这个问题)的边缘的应用抗锯齿功能之后效果却不会太理想,
这样我们就会看到如下的结果:
而理想的处理结果应该是下图所示的样子(为了便于读者理解,我们使用图像编辑软件做出了这幅图):
对于这种情况我们只有通过增加采样点的方法来提高抗锯齿的质量:
3dfx曾经在其VSA-100芯片中引入了RGSS(Rotated Grid Super-Sampling)来克服这个问题,可惜现在3dfx公司早已仙逝,我们最有希望是在nVidia的产品中看到这些技术的复苏,因为nVidia当时买下了3dfx的所有的技术和专利,应该会根据需要逐步的应用到未来的产品中去的。
NVIDIA GeForce2、GeForce3、GeForce4 Ti/MX在2x抗锯齿模式下,对于接近于水平和竖直的倾斜边缘的抗锯齿效果处理较好,但是对于接近于45°和135°的边缘的抗锯齿处理效果则差了一些。SMOOTHVISION 2x Quality和2x Performance模式下的效果同Nvidia图形芯片的效果类似,也是对于接近于水平和竖直的边缘处理较好,但是对于接近于45°和135°的边缘处理也是差强人意。 如下图所示:
就目前的抗锯齿技术来说,除了进一步的提高采样数量之外没有更好的方法来解决这个问题。当然这样就会使得显卡的性能有了明显的下降,虽然目前所有的厂商都宣称自己的图形芯片都可以在不损失或者很少损失性能的情况下得到更好的抗锯齿效果。因此在你还没有拥有一款性能强劲的显卡之前,最好适度的使用抗锯齿功能。