色彩深度(Colors and Depths)
近来玩家们争论得最厉害的莫过于游戏中究竟要不要采用更高位数的颜色这一问题。其 中之一就是Voodoo 3与TNT 2孰优孰劣的争论(前者支持16位色渲染,后者支持32位色渲 染),那么是否就能立刻断定TNT2的画面质量会比Voodoo 3要好呢?为了回答这个问题 ,我们必须先了解什么是颜色深度。 上面的这幅图就是采用16位色进行渲染的,我们可以注意到,在光环处有一层层明显的 红色向黄色过渡的色带。这是什么呢? 我们知道,16位色能表现的最大颜色数为216次方=65 536种,在上面这幅图中,因为在 颜色过渡的地方使用的颜色超出了16位色所提供的范围,因此在颜色过渡的地方就出现 了明显的色阶。为了避免这些情况的出现,人们提出了更高的色彩深度标准,24位色, 24位色能提供224=16 700 000种颜色。可以说,人眼能看到的颜色种类也就是那么多了 ,所以有人把24位色称之为全彩色。更高的颜色深度能使图像色彩还原更为准确。因此 ,我们可以肯定的是,更高的色彩深度的确能提高图像质量。但问题是,24位色或更高 的32位色有一个明显的缺点,它所占用的存储空间比16位色的要大--为了描述更多的色 彩,必须使用更多位数的调色盘,占用的存储空间自然就增加了。因此,16位色也并不 是一无事处,至少在现今显卡性能不高的情况下能大幅度提高渲染的速度。当需要的时 候,你还可以进行适当的处理来获得更好的过渡效果,我们把这种处理称为抖动。 那么,这个16位、24位或更高的颜色深度是怎样生成的呢?当我们向一个像素填上色彩 的时候,我们使用的是通过按一定比例混合红(R)、绿(G)、蓝(B)三种颜色(RGB 三基色)来获得所需的色素。应该注意到,我们只能使用仅有的3种颜色来获得其它的色 素,并且因为16位中的每一位都仅对应一种特定的颜色。当我们使用的是第16位颜色, 也就是最后一位颜色的时候,我们发现并不能很清楚地把这种颜色划分成三种颜色混合 的色素。16/3会出现小数位啊,因此,在实际中,色盘里是这样划分的。红色占了5位的 空间,绿色占了6位的空间,而蓝色占了5位空间。因此,如果我们认真看看调色盘就能 发现,绿色部分占的位置要稍大。 采用了32位色的渲染后,我们发现色阶现象完全消失了,色彩过渡得非常平滑,因此, 我们可以确定,使用更高的颜色深度肯定能提升画面品质。但为什么在玩游戏时发现两 者之间的差别没有那么大呢?这是因为现有的游戏在制作时多是用16位色的原图,因此 你在玩(重放)的时候,无论是使用16位还是32位色的渲染方式,得到的效果都差不多 ,但某些游戏已经为了32位色做了充分的优化,如果你有机会玩玩Motorhead这个游戏, 你就能很清楚的分辨出16位色和32位色的不同了。 阿尔法Alpha 32位色似乎让人有点难以理解。照理说,32位色表示的应该是2^32次方种颜色吧。但实 际上,32位色却只和24位色一样拥有同等数量级的色素。什么,它只拥有2^24次方种不 同的颜色?那么还有的8位颜色跑那里去了? 对于32位色来说,多出来的8位不是用来表示RGB颜色值,而是用来反映一个像素的alph a值,也可以称为alpha通道值。通过对像素alpha值的确定,我们能够表示一个像素的透 明、半透明、不透明或者在它们之间的那种隐隐约约的效果。也可以这样说,alpha值是 用来反映像素透明度的一个指标。使用alpha值能够展现一些特殊的画面效果,好像玻璃 ,水和爆炸效果。 如果一个像素被给定一个较低的alpha值,那么这个像素我们看起来就好像是透明的。反 过来,如果给它一个相当高的alpha值,那么这个像素看上去就完全是不透明的了。在使 用中间值alpha通道的时候,就可以制作出好像有色玻璃的那种效果,如果你有用photo shop的话,应该会经常使用到这种效果的。 上图是3D Mark99 Max Pro中的第二个游戏测试场景,看到图中绿色的那部分吗?这就是 用中间值的alpha效果做的。看上去就好像被绿色光照一样。 alpha效果被广泛应用到光影效果十足的游戏兵人中,许多爆炸的光影效果就是这样实现 的。但前提是,必须使用32位色渲染,否则惊人的alpha光影效果就不会出现。 抖动Dithering 抖动,是一种用来"欺骗"人眼的着色法。它通过随意地向色彩过渡地区添加模仿周围像 素颜色的像素,从而掩饰低位数图像因色彩深度不足造成的过渡色区一条条的色阶现象 。 为了讲得更清楚点,我们假设你现在有两个调开的水彩颜色,放在色盘上。两种颜色中 间空出些位置。现在,你要把两种颜色混合起来,为了使两种颜色不要区分得那么明显 ,你大力抖动色盘,这下好了,A颜色向B颜色靠了过来,B颜色也有点向A颜色端混过来 ,结果就在它们中间的地区混合起来形成一些由原来两种颜色混合起来的过渡色,看起 来有一种很平滑的过渡过程,没有了那种突变的感觉。 你看了下面的这幅图就会明白了。 这幅图,远处看,我们发现墙壁上的颜色渲染得很好,过渡得非常平滑。现在我们把它 放大来看看。 我们可以发现,渲染得很平滑的墙壁原来是由许多不规则颜色变化的小点组成的,如果 不是放得那么大,还以为是使用一幅高位色纹理的贴图呢。通过抖动处理,16位色的图 像也能表现出不错的画质。我们发现,Voodoo3这块标准的16位色显示芯片代表它采用特 别的抖动算法,这个算法集成在新版本的驱动程序中,通过设置Smooth选项,Voodoo 3 几乎能获得与TNT 2在32位色渲染下的平滑图像。 纹理过滤 在实际应用中,对纹理进行处理是很吃力的。虽然对固定大小的纹理,比如256*256纹理 来说处理起来很简单,然而要把它贴到各种各样的多边型上,却不是那么容易的事。有 没有想过,当经过计算后,texel(特塞尔)要被放置到一个不能定位的地方,又或者是 计算出来的X或Y轴的值不是整数?你不能把texel放置在计算好的地方,因为你只能绘制 完整的点(这是最小的绘制单位了)。 Point Sampling(点取样) 这时你不得不把texel绘制到离计算值最近的完整点上,这就叫做点取样。由于使用了点 取样,因此特塞尔只能取以计算值为中心最近的一些像素。然后,这个带有相同特性的 纹理就会映射到像素上。不管怎么样,这样就导致一些超出范围的像素明显凸了出来, 画面就出现了一个个"小格子"组成的情况。如果没有采用一些特别的过滤方法,一条界 乎于两个不同纹理之间的斜线边缘就会出现锯齿的现象,就是因为在边缘上的像素没有 被正确放置在原来计算好的位置上。 当像素稍微超出自己原定位置的时候,虽然它们仍然采用正确的颜色值,但我们假设它 超出的位置刚好是一片深深的蓝色,而这一点超出的像素刚好是白色,那么它就很容易 被注意到了。另外,点取样还有一个缺点就是像素会出现"微微发光"现象。下面是一幅 3D Mark99 Max的截图,我们可以留意到图片远处的像素点有些发光的现象,这是由于该 像素的值是仅从一个特塞尔上取值造成的。这种现象在运动的3D环境中更是明显。 很明显,在实际使用中单纯使用点取样不是办法。想一想在DF的大混战中,明明我是躲 在一栋建筑物后的,本应该看不到我,但我脚的一个像素却超出了范围,露了出来,从 而把我隐藏的位置给暴露了(这样打法不赔机时才怪)。所以,我们需要一些特别的方 法来处理这些错误。 Bilinear Filtering(双线性过滤) 双线性过滤要比点取样做的多一点。它以需要贴纹理的那个像素点为中心,而在相对应 纹理中该点附近2*2范围内(即4个)特塞尔的颜色值求一个平均值,然后使用这个"平均 的"颜色值做为需要贴图像素的色值。通过使用双线性过滤,两个不同特塞尔之间的过渡 就可以更圆滑,不会出现在点取样中出现的"格子"现象,但它同时带来一个新的问题, 那就是经过双线性处理后的图像会显得有些模糊。如果你使用过photoshop就应该知道了 。其中的blur滤镜效果就和双线性过滤差不多。 双线性过滤是最基本的3D技术,通常3D显示卡都会提供这种过滤效果,并且都能在一个 时钟周期内实现。下图就是双线性过滤和点取样的对比图 从图中可以看到,图像经过双线性过滤后,点取样中"格子"的现象都消失了,整幅图中 像素过渡都很平滑,没有发现明显的越界点。然而,双线性过滤也带来了一个新的问题 ,那就是"深度变化"错误。设想一下,按照正常的透视,当图像离我们越远,那么图像 看起来就越小。而贴到该图像(像素)中的纹理也越小。造成纹理被压缩了。结果造成 双线性过滤中,离视点较远位置出现了贴图错误。很可惜,对于双线性过滤来说,这是 固有的错误,不可能避免和解决。 MIP mapping(组合式处理映射) 那么我们如何来修正深度变化错误呢?答案是引入组合式处理映射技术。组合式处理映射 其实是用一组同一物品不同大小的纹理来提供给不同深度(大小)像素贴图取值时使用 的。当视点比较近的时候,像素点填充的颜色采用大块纹理中的采样值。当视点越来越 远的时候,就选用越来越小的纹理来进行取值。这样我们就能获得没有因视点距离变化 而变形的图像。 Level of Detail(LOD,深度等级) 深度等级的计算是用来确定哪种大小的Mipmaps(组合式位图-纹理)要被贴到对象上。 深度等级能够控制一个像素由几个特塞尔映射而成的。还记得我们前面说的吗?特塞尔 是组成纹理的最基本单位,当一个纹理被用来做贴图使用的时候,它甚至可以缩小为一个 点贴在像素中,换而言知,一个像素能够是几个甚至无限多个特塞尔映射而成的。如果 特塞尔映射到像素上的比例为1:1。那么LOD的值就为0。表示没有等级,这时就会采用最 大的纹理来进行贴图处理。而当4个特塞尔映射到一个像素上的时候,比率为4:1。LOD此 时的值为1。系统就会采用小一号的纹理来进行贴图。当比例不断上升,用来贴图的纹理 就越小,从而保证远近贴图的变化成比例。消除了由双线性过滤造成的深度变化这一错 误。 可见,双线性过滤,Mip mapping和LOD是一起使用的。 Trilinear Filtering (三线性过滤) Mip mapping虽然解决了双线性过滤造成的深度变化错误,但它又带来了一个新的错误, 那就是"组合交叠"现象。组合交叠现象发生在当相临的两个地方使用了LOD级别不同的同 一块纹理来进行贴图。两块不同大小的同一块纹理接合的地方显得非常不平滑以至于人 们很容易就能注意到这一区别。组合交叠错误经常出现在地板或墙壁上,因为它们通常 是采用许多组大小不同的同一纹理贴图而成的,看起来就会出现有的地方很清晰,但有 的地方很模糊的现象。 三线性过滤就是用来减轻或消除不同组合等级纹理过渡时出现的组合交叠现象。它必须 结合双线性过滤和组合式处理映射一并使用。三线性过滤通过使用双线性过滤从两个最 为相近的LOD等级纹理中取样来获得新的像素值,从而使两个不同深度等级的纹理过渡能 够更为平滑。也因为如此,三线性过滤必须使用两次的双线性过滤,也就是必须计算2× 4=8个像素的值。对于许多3D加速开来说,这会需要它们两个时钟周期的计算时间。也就 是说,对于某些3D加速卡来说,使用三线性过滤几乎会使性能下降一半! 各向异性过滤Anisotropic Filtering 各向异性过滤是近来才提出的新型过滤方法。各向异性过滤的实现方法有点"变态",它 需要对映射点周围方形8个特塞尔甚至更多的特塞尔进行取样,然后获得平均值映射到像 素点上。对于许多3D加速卡来说,采用8个以上特塞尔取样的各向异性过滤简直是要了它 们的命。因为它们根本不能提供足够的像素填充率供给各向异性过滤使用。对于3D应用 ,特别是3D游戏来说,各向异性过滤是很重要的一个功能。这是因为,游戏中的物体有 大部分的时间不是与我们平行的。 各向异性过滤到底是做什么的呢?如果有一个多边型,它的一个面刚好与我们的视线垂 直,那么根本就不用各向异性过滤。当视点渐远的时候,Mip mapping就会使用更小的纹 理来进行贴图。但在大多数情况下,我们的视线却与多边型有一定的角度。这些有角度的 多边型就会出现型变,从而引起画面失真,各向异性过滤就提供了解决方案。 每一轮的3D显卡大战的征兆都大同小异:在这段时期内各家显卡芯片研发大厂通常都保 持神秘姿态,半遮半掩地发布一些连名字也没有确定的图形芯片规格。很感谢这次的游 戏开发者年会,我们得以掌握这些次世代显示芯片的详细规格:表1 规格终究是规格,在实际发布的时候,通常会使我们大失所望,不是规格缩了水,就是 性能没有达到期望的等级。我们上表中的G450现在还不能确定它的真实运行频率,而是 根据Matorx早前公布的G450将会使用G400 MAX核心,再加上使用.18微米工艺生产而成, 因此估算其将会运行在200MHz。而S3&Diamond的GX4-C我们是按它没有在Savage2000(V iper II)上增加渲染通道估算出来的性能值。另外我们还预计,在这些新一代的显示卡 中,一种新式的显存即将被广泛采用,例如DDR FCDRAM,但到目前为止它究竟是什么东 西我们还没弄清楚,但我相信在将来的显示卡中它将会被大量采用。 那么现在让我们来详细看一下这些次世代显示卡带来了什么新的东西,3D性能和表现力 将会被提升到一个什么样的新台阶。 |
|