“真实”的谎言 解析游戏中的贴图技术

技术空间

最近一段时期,游戏大作一个接一个的发售,让游戏玩家感到前所未有的幸福。无论是略早的《黑手党2》、《F1 2010》,还是新鲜出炉的《FIFA11》、《文明5》,这些游戏都以精彩绝伦的画面,将玩家带入一个又一个的3D世界。或许不少玩家正坐在电脑前面惊叹于这些游戏如此逼真的画面效果,但是你知道为什么这些游戏的画面看上去如此接近真实么?实际上,除了诸如真实光照、动态模糊、实时阴影等各种3D特效外,让3D物体(包括建筑、场景和人物)看上去更真实的最大功臣是纹理贴图技术。经过了多年发展,3D贴图目前已经达到了非常成熟的地步,下面我们就一起来看看这些让游戏越来越真实的贴图技术。

为显卡减压的纹理贴图

如果你是一个老资格玩家,那么想必玩过世嘉SS游戏机上的《VR战士1》。这款被称为世界上第一款3D对战游戏的大作曾经风靡全世界,但是从现在的眼光来看,这款老得掉牙的游戏在技术上实在是没有任何亮点,特别是人物的构造,完全是由简单的多边形搭建而成,整个就是方块,一点都不真实。而过了不久,世嘉又推出了《VR战士2》,尽管两者间隔的时间不长,但是画面却差异巨大,《VR战士2》的画面更加逼真,不但人物不再是方块构建而成,就连身体上的一些边缘部分也不会出现明显的缝合处了。为什么《VR战士2》的画面会高出《VR战士1》这么多?其实答案很简单:《VR战士2》采用了《VR战士1》未曾采用的3D技术——纹理贴图!

什么是纹理贴图?说穿了很简单,就是在建好的3D模型上“贴”上一些二维的画面,让模型显得更真实,比如常见的砖墙、凹凸不平的地面等。以《VR战士2》为例子,如果全部采用多边形来计算,那么对于当时的图形核心而言,这种性能是无法达到的,整个系统工作起来也会不堪重负,但如果是将一些“画好的图片”贴在模型上的话,那么渲染起来就简单得多了。所以从根本意义上来讲,纹理贴图的目的是在营造真实的前提下,尽量为图形核心减压。

当然,既然是贴上去的图,那么图片自然就是2D的。在早期,为了尽量保证3D物体在各个角度的真实度,做得越真实的物体,纹理贴图量也越大。但贴图始终要消耗图形核心的资源,不可能以无限的贴图来让不同角度的3D模型看上去更加真实,所以很多时候,我们会发现一些老游戏,只要换一个角度,要么就出现3D物体撕裂的情况,要么就会发现一些场景完全没有3D效果,看上去非常假。所以为了让纹理贴图更加完善,以更少的工作量来达到最好的3D效果,纹理贴图逐渐衍生出了很多种技术,如凹凸贴图、法线贴图、视差贴图以及位移贴图等。

40-d15-1.jpg
40-d15-2.jpg
《VR战士1》(上)和《VR战士2》的画面对比,有贴图和没贴图的区别啊!

贴图技术,让假的更真

凹凸贴图(BumpMapping)

代表游戏:《CS进化》

显卡支持:GeForce 2系列显卡及以上

凹凸贴图技术简单说起来是一种在3D场景中模拟粗糙表面的技术,将带有深度变化的凹凸材质贴图赋予3D物体,经过光线渲染处理后,这个物体的表面就会呈现出凹凸不平的感觉。当然,使用凹凸贴图产生的凹凸效果其光影的方向角度是不会改变的,而且不可能产生物理上的起伏效果。凹凸贴图是一种灰度图,用表面上灰度的变化来描述目标表面的凹凸,因此这种贴图是黑白的,如果节省空间的话,甚至可以把贴图的Alpha通道征用来用作Bump。值得注意的是,这种贴图表面上存储的东西是高度域。因此,对这个贴图做任何的操作都会影响到这个物体3D的外观质感。

凹凸贴图经常被称为Fake bump mapping,也就是假凹凸贴图。因为在游戏中这种贴图技术并没有改变物体的表面,而只是影响光照的结果,实际上是欺骗眼睛而已。凹凸贴图技术的资历比较老,从GeForce 2系列显卡就开始硬件支持这个技术了。尽管如此,凹凸贴图依然是目前主流3D游戏中应用较为广泛的纹理贴图之一,基本上不会过时。

40-d15-3.jpg
较为典型的凹凸贴图应用

法线贴图(NormalMapping)

代表游戏:《战争机器》

显卡支持:GeForce 3系列显卡及以上

法线贴图是目前各种游戏中必用到的贴图技术,可以说这项技术将纹理贴图提升到了一个新的高度。实际上,法线贴图技术诞生的日子不算短,自GPU概念诞生——也就是GeForce 3显卡上市后,硬件可编程流水线(即Shader)催生了这项技术,法线贴图也属于凹凸贴图的一种,它的另外一个名称叫做:Dot3 bump mapping。

法线贴图技术通过计算高细节模型的法线信息并将其保存在一张高压缩比的法线贴图之中,然后将这张法线贴图用于低细节模型上代替原型的多边形曲面的光照计算,从而生成一个低多边形、高细节的3D模型。这样做就能在保证模型细节的情况下,大幅度降低多边形数目。法线贴图改变了物体表面上的光照结果,并没有改变表面上的形状,但是由于法线贴图不能实现自身内部的遮挡,因此不能表现平面上凹凸起伏比较大的物体。也就是说,只有在垂直于平面的时候,法线贴图才会发挥最好的作用。

40-d15-4.jpg
“虚幻3”引擎大量使用了法线贴图

视差贴图(Parallax mapping)

代表游戏:《西部狂野》

显卡支持:DX8显卡及以上

视差贴图技术其实应该称之为视差遮蔽贴图技术,因为这一技术会对纹理的坐标做变换,一些凸出的纹理会遮蔽到其他的纹理,这样看起来就会具备更好的凹凸的感觉了。视差贴图是一种凹凸贴图技术的增强算法,其本质上和凹凸贴图没有区别。这种技术的优势是只需要增加一些编程语句和一个控制纹理通道,就可以显著的增加物体表面的深度。视差贴图可以提供更好的视觉效果,而且也能在保证模型细节的情况下,大幅度降低场景的多边形数目。

视差贴图是如何达到增加凹凸不平效果的呢?实际上,视差贴图技术的目的是为了让“不该看到的东西”看不见,视差贴图技术会将不该让玩家看见的图素(Texel)跳过去。根据高度图提供的数据,把位置较低那个纹理后面的纹理向前拉,这样那个不该被玩家看见的像素就会因为图素的消失而不见了。虽然这并不算是一种精确的计算,但是对于纹理贴图所需要表现的微小细节来说,这样的改进已经不错,而且这种技术所消耗的代价极为有限,因此也受到了游戏公司的青睐。

40-d15-5.jpg
大部分游戏引擎都支持视差贴图

位移贴图(Displacement mapping)

代表游戏:《孤岛危机》

支持显卡:DX9显卡及以上

前面所介绍的几种纹理贴图技术实际上都没有改变3D模型本身的物理表面,而现在最新的贴图技术——位移贴图,则能真正改变3D物体的物理表面。位移贴图实现这一目的的方式也很简单——tessellate(镶嵌),它和DX11的tessellation细分曲面技术有一定的关联,tessellate这种技术很早之前就可以实现了,只不过到了DX11,tessellation细分曲面可以将这种技术更加完善地表现出来。

位移技术的实现方式并不算复杂,首先,根据屏幕的分辨率,在模型的可见面上镶嵌和最终像素尺寸相同的微多边形。这个过程叫做镶嵌。然后读取一张凹凸贴图。根据表面的灰度确定高度。然后根据镶嵌所得到的多边形,沿着原先的表面法线方向移动微多边形。接着再为新的多边形确定好新的法线方向。此时,物体的表面确实已经真的增加了细节。这种技术对硬件的要求很高,而且tessellate的过程也会对GPU产生较大的负担。位移贴图即使在DX10游戏中使用也不多,在最新的游戏中,这种技术往往会用于户外的大面积地形。

40-d15-6.jpg
采用位移贴图的人物设计

写在最后>>

实际上就如我们所说,纹理贴图技术基本上算是一种“真实的谎言”,大多数纹理贴图技术的原理就是欺骗玩家的眼睛,让3D图形看上去更逼真而已。从理论而言,如果GPU性能足够强悍,采用足够多的三角形,再辅以目前的各种光照技术,那么游戏即使无需纹理贴图技术也应该足够逼真,而且没有纹理贴图的各种破绽。只不过这只是理论而已,试想一下,如果要达到《文明5》或者《孤岛危机》那样的效果,只使用多边形运算,而不采用纹理贴图技术,那需要什么样的图形核心以及多大的显存……这种暴力堆叠的形式既不符合图形核心的发展,也没有任何技术含量以及执行效率,所以在未来很长一段时间里,我们还将看到纹理贴图技术不停地发展。

从现在的纹理贴图技术来看,最新的浮雕纹理贴图、视差阻塞贴图和圆锥跟踪贴图这些技术还没有大量使用在游戏中,由于对硬件要求更高,而且实现起来更复杂,更多只是在一些渲染作图上出现而不是在游戏中。这也意味着在图形核心进一步发展后,我们将有机会看到更多出色的贴图技术在游戏中应用,那个时候游戏画面将会更逼真。■