教程:实时环境映射贴图技术实时环境映射贴图技术(Real-time Evironmnet Mapping)
如果你是个赛车游戏的爱好者,你一定玩过风靡全世界的赛车游戏《极品飞车:地下狂飚2
》 (Need For Speed : UnderGround2)。在这款游戏中,玩家扮演了一个靠赛车为生的地下飚
车手,在永远是夜晚的城市中飞驰。这款游戏大量地运用了环境映射技术(Real-time
Evironmnet Mapping),例如下过雨的公路上看到两旁夜景的倒映、玩家车身上对周围环境的真
实反射等等,这些都是环境映射技术的功劳。这种最酷、最华丽的特效现在已经被应用在大量
实时虚拟显示游戏中,将来它也许会成为游戏中必不可少的元素。
环境映射贴图技术最典型的应用就是车体的“流光”,这种现象在现实中非常普遍。当你
开着车行驶在满是霓虹灯的街道上时,周围的灯光会在车身上投射出一个光斑或光带(前提是车
子洗得非常干净)。当车子在街道上飞驰的时候,就好像一个个五彩的斑点在你的车体上流动,
产生非常炫目的效果。甚至当你和别的车子擦肩而过时,别的车子也会映射在你的车体上。
要实现环境贴图映射首先需要一组环境信息。假设在场景里有一辆车(本文中将一直使用这
个的例子),车的环境信息,即除车以外,你在车的位置上向四周看到的全部画面。你用相机对
六个不同方向拍出六张照片,这样就产生了一组环境信息。车上的每个象素都和这个环境信息
中的一个点有对应关系(也就是所谓的映射)。在最后渲染车时,需要把车身上每个环境对应点
与车体本身的效果做混合处理。
归纳起来要实现环境贴图映射需要执行以下步骤:
A.创建环境贴图
B.把场景中的物体渲染到环境贴图上
C.渲染车体时,把原始贴图和环境贴图经过处理后最终渲染到屏幕上
准备好你的车子了吗?你一定想马上体验一下给自己车子打上环境贴图是什么感觉吧!不
过在动手之前,你还需要对相关知识有所了解,否则是很难找到正确方法的。
一、什么是环境贴图?
在上面我用照相机作过比喻,在这个比喻中,那六张照片就类似一组环境贴图,它们代表
了立方体的六个面。你可以想象一下,当你的眼睛处于这个立方体时,你会看到周围所有的景
物,因此我们将面,每次绘制其中一个面,就要对场景中所有的景物进行一次渲染。这个过程的开销是十分大
的。如果你的场景中某个物体上使用了环境映射,那么原来只需绘制一次的场景,就会增加6倍
的渲染消耗!如果一个游戏原来跑70帧,当绘制一个使用了环境映射的特效时,马上降到了10
帧!这是一个相当可怕的数字!你也许会考虑:那么这项技术会不会因为开销太大而失去使用
的价值?答案是不会的。以目前人类的智慧已经可以非常好的处理好环境映射的效率问题,所
以不必担心,而且在后文中我们还会详细讲解这些方法。
三、如何使用Cube Map?
当你渲染好了贴图坐标,下一步就是如何使用的问题了。要想将一张贴图绘制到屏幕上,
就需要用坐标和模型的顶点进行对应。我们都知道,2D贴图使用u、v两个坐标来表示顶点对应
的贴图坐标。而在Cube Map中,仅有2个量是无法表示一个点在立方体中的位置的,所以,Cube Map的贴图坐标是由3个数的向量来表示的,你可以简单把这个贴图坐标对应的颜色理解为:从
盒子中心向这个3D向量方向前进直至与盒子相交,其交点的象素颜色值。比如你要让场景中的一个球映射出周围的环境,最简单的做法是把球上每个点的它们称为环境贴图。
一般来说我们所使用的环境贴图都是用立方体作参照,因此通常称为立方体贴图(Cube Map)。
每个Cube Map包含六个面,在DirectX中分别用+X、-X、+Y、-Y、+Z、-Z来表示,其每个面都在
水平和垂直平面上都覆盖了90度的视角。
二、我们要如何操作这组Cube Map呢?
在DirectX 9中,分别使用了六个不同的标识来表示Cube Map中的各个面。这组标识叫
D3DCUBEMAP_FACES,其中的D3DCUBEMAP_FACE_POSITIVE_X就代表了Cube Map中以中心点为原点
的正X轴所指向的那个面,依此类推。而Cube Map的每一个面都是一个LPDIRECT3DSURFACE9对象
,当你需要对其中某个面进行某些操作时,就需要先调用GetCubeMapSurface函数来得到你所指
定的那个面(Surface),然后像操作一般面一样操作即可。而本文中将要对其进行的操作就是把
面作为渲染目标(Render Target),把周围环境中的景物全部绘制到这个Cube Map上。因为Cube Map在每个方向上有一个法线做为贴图坐标传给图形处理芯片,这样一来就能让球具有金属质感。不过,仅仅这样简单
对应的话,绘制出的图将会和现实世界的映射有所出入。
我的网站设计 web design home page
http://www.webdesign-cn.com
http://www.webdesign-china.cn