一切为了更真实──显卡中的3D技术(二)
整机外设
上期我们为大家介绍了3D图像的形成以及贴图技术。不过,这样的3D图像看上去是比较粗糙的,为了让图像看上去更真实,我们需要用其他的一些技术对图像进行美化处理。
纹理过滤技术
显卡在对场景进行渲染时,构成3D模型的三角形(或多边形)大小不一,并且要找到一张和最终纹理贴图大小吻合的纹理是非常困难的一件事情。当纹理贴图贴到三角面上、绘制三角面所需要的取样点,并不一定会刚好是纹理贴图所使用的取样点,所以就会进行二次取样。在被重新取样的过程中存在“放大取样”和“缩小取样”的情况,重新取样的第一个动作,就是要重建原来的信号。如果重建信号的动作不正确,就会在重新取样的时候,造成失真的问题。而纹理过滤技术就能有效地解决这一问题,它是通过在原材质中对不同像素间利用插值算法的柔化处理来平滑图像的。
1.双线性过滤(Bi-linear Filtering)
双线性过滤是第二代处理贴图失真的3D技术(第一代应该是Point Sampling,点采样技术)。其工作原理是将一个像素分成2×2的纹理元素区域块,这样我们就拥有A、B、C、D 4个纹理元素区域了,然后以目标纹理的像素点为中心,对该点附近的这个4个像素颜色值求平均值,然后再将这个平均颜色值贴至目标图像素的位置上。双线性过滤的优点是运算量少,效果也很不错,因此当时不少显卡如GeForce256以及游戏如QuakeⅢ都采用此种过滤方式。
(图1 上图中显示出一条直路,你可以看到左边的斜线标志在某个距离外,会出现一些环状失真的现象)
由于3D技术必须根据人类视觉对物体及场景“近大远小”的特点自动进行调整,所以当Z轴数据越大时,代表该物体的实际距离越远。在这种情况下如果只使用一份原始纹理贴图,将会出现在较远处用来表现物体或场景的有效像素表现区比贴图小的问题。以图1中的路标为例,视线内的路标纹理必定比远处的要清楚,但如果将近处路标所使用的纹理贴图应用到远方的路标之上,显然是不匹配的,因为远处路标可供贴图的像素区没有纹理贴图大,这时就会出现锯齿的问题。
2.Mip Mapping(纹理映射等级)过滤技术
为了解决这个问题,人们引入了Mip Mapping技术。Mip Mapping的工作原理是将原本较大的纹理通过分级方法,建立许多不同大小的贴图来应用于不同的像素工作区。例如:如果纹理贴图的大小是256×256,可以事先计算出128×128、64×64、32×32、…、4×4、2×2和1×1不同分辨率下需要的贴图(注:这些不同的纹理层被称为LOD细节等级,原始纹理贴图的等级为LOD 0,它的下一级是LOD1,其大小是前者的1/4)。假设现在对纹理贴图重新取样,需要缩小为1/5,这时只要取用64×64的版本就可以很快得到重新取样的结果,而不需要再对原来的贴图做5×5的过滤。这个过程有点像放幻灯片,随着渲染场景远近的变化来“播放”不同分辨率的贴图。
Mip Mapping过滤技术可以提高场景渲染的速度,但它要占用大量的显存空间,最主要的缺点是纹理之间的接缝以及采用低分辨率Mip Mapping时会造成的模糊感,而且在动态场景中存在发生闪烁的现象。
(图2 从图中你可以很明显地看出,应用Mip Mapping过滤后出现了过渡模糊的现象,而且还出现了令人讨厌的锯齿接缝现象)
为什么图2中会出现接缝现象?这是因为在不同的距离,会需要不同分辨率的贴图,但是在转换分辨率的时候,由于并不能很平滑地转换从而导致接缝的出现。因此为了解决不同分辨率贴图之间接缝的问题,技术人员推出了更先进的纹理过滤技术──三线性过滤。
3.三线性过滤(Trilinear Filtering)
三线性过滤技术主要是解决双线性过滤与Mip Mapping相配合使用时所出现的不同纹理层接缝的突发变化失真问题。三线性过滤的原理同双线性过滤一样,只不过三线性过滤的采集范围更大:它主要是在双线性过滤的基础之上增加了4个的纹理元素采样参考,也就是三线性过滤必须使用两次双线性过滤,即必须计算2×4=8个像素的值。三线性过滤可以比双线性过滤更有效地解决不同LOD细节等级纹理过渡时出现的组合交叉重叠现象。但是当物体消失的方向(透视方向)和我们的视角有一定夹角时,三线性过滤仍然存在失真现象。
(图3 从上图可以以看到,在使用三线性过滤后,虽然接缝现象不见了,但存在有过渡模糊的现象)
为什么会出现过渡模糊的现象呢?这是因为这条路相对于观察者来说,是相当“扁平”的,所以一个像素在贴图上的图元像素会变得很扁。由于形状的不规则,显示芯片在选择不同分辨率的Mip Mapping时会选较低分辨率的Mip Mapping,这样就会造成在某个方向下分辨率是适当的,但是在另一个方向则会过渡模糊。我们可以强迫显示芯片使用较高分辨率的贴图来解决这个问题。不过,这个方法只能用在方向是固定的情形,如果视角常常会转动(Z轴旋转表面),那它可能反而会变得更为模糊。当然,对于一般视角变化不大的情形,如一般的赛车游戏,效果还是不错的。不过,对于像是第一人称射击、飞行仿真等视角变化较大的游戏来说,这个方法就不见得这么有用了。针对这个问题,人们又推出了各向异性过滤技术。
4.各向异性过滤(Anisotropic Filtering)
各向异性过滤主要作用通过增加更多的贴图模型来消除Z轴旋转表面的锯齿状线条、而达到更好的画面效果。它融合了双线性过滤和三线性过滤的一些特点。但从各向异性过滤又不同于传统的双线性和三线过滤:后两者都是各向同性的过滤,各方向上矢量值是一致的,在渲染时各个图元像素的尺寸、形状都是固定的;各向异性过滤正好相反,它主要处理矢量方向上值不一致的数据,在渲染时使用尺寸可变的图元像素。
(图4 启用各向异性过滤后可以看到几乎所有的失真包括过渡模糊的现象,都已经消失了)
不过在显卡实际工作中,上面几种过滤模式是相辅相承的。各向异性过滤一般都配合双线性过滤或三线性过滤来运行的。不过,它的缺点也是很明显的:对每个贴图来说,使用三线性过滤的情形下,最多会需要读取128个像素。这会占用很多显存的带宽,因此会造成性能降低。不过,这个问题在今天已经不再是问题了──目前主流的显示芯片在设计时就考虑了对各项异性过滤的硬件支持并提供了相当高采样率,如Radeon9500、Radeon9700就提供了高达16×的采样率。
抗锯齿技术
由于电脑显示的图像是由上百成千万个显示屏上的像素组成的,因此游戏的画面始终都是由像素这一个基本单元组成。无论画面看起来多么真实,那些组成3D模型的三角形边缘往往都存在锯齿。这对追求视角完美性的用户来说,这是一个致命的缺点。那么显卡如何解决这个问题呢?
(图5 上边是没有反锯齿的游戏画面,下边是开启了反锯齿的游戏画面,注意护栏处)
1.Super-sampling(超级采样技术)
超级采样,就是先将画面使用更大的分辨率进行处理,然后显示的时候,合成抗锯齿失真的画面,再用较低的分辨率显示。例如一个使用2×2方式处理的800×600的画面,就是先用1600×1200的分辨率进行处理,然后使用一个2×2的滤波器进行处理,合成的子像素权重系数就是1/4了。超级取样的缺点,就是当我们使用800×600显示加上4×AA的时候,其游戏性能就会等于1920×1440分辨率下的运行速度了,这会使游戏速度大大降低。在ATi Radeon 7000/7200/7500系列显卡芯片上,以及NVIDIA GeForce 256/GeForce2系列中,都是使用这种超级取样的抗锯齿失真方式。
2.MultiSampling(多重采样技术)
在研发GeForce3时,NVIDIA在原Supersampling(超级采样)的基础之上提出多重采样的观念。在进行多重取样的处理时,也是先将显示的画面使用更大的分辨率进行处理。与超级取样不同的是,对于子像素,多重取样就会先判断是否所有的子像素都在同一个三角形里面。如果是的话,就说明这个像素本身就在同一个三角形里面,所以肯定不需要进行抗锯齿的平滑处理,如果刚好在三角形的边缘,就是一部分的子信号像素在三角形的外面,一部分的子像素在三角形的内部,那么这样的像素本身就是处于三角形的边上,需要进行抗锯齿的平滑处理。
这种抗锯齿的方法好处在于只对需要渲染待抗锯齿的场景一次就可以达到效果,不过对于一些三角形数量特别多的场景,这样的运算就显得还是力不从心了,因为有大量的像素需要进行处理,而且分辨率越高,像素越多,处理的速度也就越慢了。后来在GeForce4 Ti上,NVIDIA又提出Accuview Antialiasing(锯齿失真修正)技术,这属于改良的多重采样技术。在这里面NVIDIA使用新的取样位置来改善锯齿的品质,因为可以减少错误堆积,而且所采用的新过滤技术会在每次(多重)取样时被一起执行来产生抗锯齿的帧,并且省下了完整的帧写入,这样可以大幅改善抗锯齿的性能。
3.SmoothVison(视觉平滑技术)
针对超级采样的缺点,ATi在R200中推出了新的抗锯齿技术──SmoothVison。ATi的SmoothVison抗锯齿是一种超级采样算法(RGSS),没有采用NVIDIA的多重采样技术。SmoothVison提供达16个不同的可程序化取样模式,并且每个像素可以作FSAA取样达16次,让它们进行位移叠加而得到最终的抗锯齿效果。这种方法在提供优秀的纹理分辨率的同时也除去了锯齿,当然它需要极大的填充率,因为一幅抗锯齿的场景需要进行多次渲染。由于SmoothVision强调的是画质,占用的系统资源和显存带宽比较多(这就是为什么ATi显卡比NVIDIA显卡对CPU的依赖程度要大的原因之一。)。
鉴于多重取样抗锯齿技术具有降低对GPU计算资源和显存带宽的消耗的优点,所以ATi在R300芯片中对超级采样抗锯齿和多重采样抗锯齿都加以了支持。ATi将他们在R300芯片上应用的多重采样抗锯齿技术命名为“SmoothVison 2.0”,而在R350中又提升到了“SmoothVison 2.1”。
总的来说,目前抗锯齿的原理就是对低分辨率的图像,利用边缘模糊的原理、通过显存缓冲以高分辨率的标准来渲染。如果显示系统的分辨率非常高,远远超出人眼可以分辨的范围,那么锯齿的现象就会慢慢消失。不过,贴图纹理过滤则是不同,无论分辨率有多高,都需要适当的过滤技术才不会让图像失真。





