版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3d游戏图形引擎的设计与实现
随着扎克盗贼的性能和速度的提高,网络游戏在中国的开发日益激烈。3D游戏因其逼真、虚幻的场景画面和人物造型,以及灯光照明效果和爆炸烟火等特效,已取代了2D游戏的地位,成为市场上的主流。从内部技术的角度讲,这主要归功于3D图形渲染器(嵌在客户端)。即如果一款网络游戏没有一个高效的3D图形渲染器,那么它很难吸引玩家的目光。渲染器是3D游戏引擎中最重要的部分之一。现在业界和学术界对于渲染器的架构没有形成统一的标准,在大量阅读文献和编程的基础上,本文提出了一个渲染器的构架。首先介绍渲染器的构架和实现其中每个子模块的算法,之后重点讲解场景管理、光照模型和纹理系统两个重要的子系统,最后介绍了渲染房间和地形这两种特殊场景的高效算法。13瞳石机底层次设计按照不同的功能和任务,如图1所示,可以把渲染器整个底层次细分为三维模型、场景管理和特效三个子系统。一般由Direct3D或者OpenGL来实现它们。1.1光照和表面性质子模块三维模型子系统负责游戏场景中三维物体的创建和渲染,它包含如图2所示的三维建模、光照和表面性质、镜头控制、房间和地形渲染四个子模块。三维建模子模块是制作3D游戏模型的基础,3D游戏场景中的模型往往是3DMAX或是MAYA做出来的3D模型,模型中存储了顶点的位置、面的组成、顶点的纹理坐标、材质和贴图等需要的信息。光照和表面性质子模块主要负责物体真实感的绘制。3D游戏中,必须在三维空间设置光源,照射到三维物体上,才能使得物体表面有明暗的效果。表面性质也是物体一类重要的参数,比如颜色、反光度、凹凸性等,在游戏引擎中,一般采用材质贴图来模拟物体的表面性质。镜头控制子模块定义了游戏世界中视点的位置和方向等参数。在3D射击和飞行模拟游戏中,镜头要随着玩家的操纵而不断地变化。如何简单有效地定义并控制镜头,对三维游戏的总体效果起到很大的作用。除了镜头的拉近拉远之外,最重要的效果就是镜头的旋转。在3D游戏中,一般采用Euler角或四元数法控制镜头的旋转。房间和地形渲染子模块是为了加快房间和地形两种特殊场景的绘制而独立出来的渲染子模块。对于房间和地形采取与其他场景物体不同的渲染方法会大大提高游戏画面绘制的速度和效果。1.2块、拉拔面的空间划分与排序模块3D引擎最核心的部分是场景管理。场景管理负责空间的划分和排序、可见性判断和裁剪、碰撞检测与反馈,与这三个功能相对应,场景管理子系统可划分为三个模块,即空间划分与排序模块、可见性判断与裁剪模块、碰撞检测与反馈模块(图3)。空间划分与排序模块的目的是为可见性判断和碰撞检测模块提供支持。这个模块最终会构建出场景树,使可视性问题和碰撞检测问题都最终归结为场景树的遍历与下溯。可见性判断与裁剪模块利用场景树判断物体是否在视野中可见,剔除被遮挡或者视野外的物体,再对局部物体采用Z-缓存算法进行排序和隐藏面消除工作。碰撞检测与反馈模块负责3D游戏中各物体之间的碰撞检测以及物体与场景之间的碰撞检测。碰撞检测的过程是重要的。如果没有它,游戏中的人物就会毫无遮拦地移动——如果考虑重力的话,则会一直不停地往下掉,直到符点数溢出(或受不了这一漫长的过程而离开游戏)为止。1.3游戏中的自然体验特效子系统(图4)包括粒子系统、公告牌、雾效等模块,负责在游戏世界中实时模拟各类自然现象,通过特效子系统处理的场景将会变得十分逼真和生动。粒子系统模块模拟大量的自然现象,如火焰、喷泉、爆炸、鱼群、气体、星空等,它们的原理相似。一个粒子系统由带有不同属性的物体对象与其必须遵守的行为规则组成,确切地说这些属性和规则依赖于想模拟的现象。一些粒子系统可能需要大量的属性和复杂的规则,然而有些可能极为简单。公告牌,在3D游戏中有着广泛的应用。它的本质就是用预先做好的几幅位图来代替3D物体,极大地节省了资源和提高了速度。仔细观察“魔法门”系列游戏,它的精灵,树木,物品都是二维图像,但由于它始终朝向观察者,你根本看不到它“扁”的一面,所以给人一种立体的感觉。雾是一种自然现象,在大部分地方并不算常见,但是在现在的3D游戏中,却是必不可少的一个元素。使用雾除了增加天气系统的效果外,主要原因是受限于硬件的能力,3D游戏并不能把游戏中的整个场景渲染出来,只能绘制到一定的距离。在这个距离之外,即裁剪空间的后平面之后是一片空白。为了弥补这个空白,很多游戏就使用雾的效果来掩盖。2渲染内核的主要模块和技术上节中我们分析3D游戏引擎渲染内核的构架,对其中的子系统进行了介绍。下面,我们将详细剖析其中的几个模块和实现它们的常用技术。2.1多重纹理映射光影贴图技术是游戏引擎中最流行的光照处理方法,尤其在第一人称射击游戏中。光影贴图是一种简单而非常有效的光照处理方式。简单来说,在每个多边形上贴两个纹理,第一个是常规的纹理,第二个是光照图,第二纹理用来表达光强度的分布。图5显示了纹理与光影贴图的结合,使其多边形看起来具有阴影效果。在程序实现上,可以采用多重纹理或多通道渲染来实现光影贴图。多重纹理通过采用两个纹理进行乘法纹理混合一次渲染多边形;而多通道渲染通过两次渲染多边形,每次贴上一个纹理可以达到与多重纹理相近的效果。在游戏引擎的设计中,通常采用多重纹理映射。因为它较之多通道渲染有两个好处:①速度快,多边形无须进行两次光栅化,而且现今大多的3D加速卡都可对多重纹理渲染进行硬件优化,一些加速卡甚至可在单通道里应用四个纹理甚至更多。②效果更好。图6(a)是不支持多重纹理映射的显卡渲染出来的Quake场景,而图6(b)是支持多重纹理映射的显卡绘制出来的场景。值得注意的是,光影贴图技术多重纹理映射本质上是在渲染之前预先生成的一种罐装效果。在游戏的场景中灯光或物体都是运动的,必须在每一帧渲染之前生成相应的光照贴图(光照纹理),按照动态灯光或物体运动的方式修改光照纹理。虽然光影贴图可以快速地渲染,但是存储这些灯光纹理所需的内存消耗非常昂贵。而且如果场景中有多个灯光,对所有的物体重新生成光照纹理将极为耗费CPU时间。许多游戏使用混合照明方式。以QuakeIII为例,场景使用光影贴图,动画模型使用顶点照明。预先处理的灯光不会对动画模型产生正确的效果——整个多边形模型得到灯光的全部光照值,而动态照明将被用来产生正确的效果。2.2图像旋转的控制镜头的位置和方向定义在世界坐标系里面。在投影时,先要用一个矩阵把三维模型从本地空间转换到世界空间,这个矩阵叫本地空间到世界空间转换矩阵。然后再根据镜头的位置和方向,形成另外一个矩阵,称为投影矩阵。因此,镜头的旋转,体现在投影矩阵上,而物体在三维空间的内旋转体现在本地空间到世界空间转换矩阵上。矩阵运算很难直接表达与空间镜头的变换。如果要算出中间位置,需要插值计算,但对矩阵进行插值是非常困难的。在3D游戏中,一般采用Euler角或四元数法控制镜头的旋转。Euler角表达旋转比矩阵直观,但是Euler角在插值方面的效果不是很好,会出现很生硬的效果,更为严重的是,它会导致万向节锁定。而四元数法被大量地使用在第三视角的游戏中,通过四元数法可以避免矩阵相乘,易于插值,并且插值的效果好,形成的动画效果非常平滑柔和。《极品飞车》系列中的镜头控制便采用了四元数法,如图7所示。2.3房间和地形2.3.1小区、入口和物品对象入口技术对于解决游戏中室内场景的生成问题提供了一个较好的解决途径,主要优点是快速并且易于实现。所谓入口,实际上就是引擎中连接小区的一类特殊多边形。通常它不需要纹理映射(除非它是半透明的),而是将小区中其他部分映射到该入口上。小区则用来描述游戏世界中房间的概念。从理论上来说,利用入口和小区可以描述游戏虚拟世界中任意不包含绝对曲面的三维世界。然而入口技术要求三维对象的剖分多边形是凸的,这样入口才可以正确进行。同时,由于入口本身是用于解决多边形排序并进一步进行隐藏面消除问题的,因而对于相互重叠的多边形渲染它将无能为力。小区、入口和物体对象是引擎中构造游戏世界空间的基本对象,引擎中分别定义了Sector、Portal和Thing类来对应于以上三个概念。下面将分别加以说明:(1)sector(2)接受额定义(3)幕尺寸大小的二维矩形定义好空间后,在渲染之前,需要对视图进行裁剪。初始视图是一个屏幕尺寸大小的二维矩形。每次进入一个入口递归产生新的视图时,需要将经过透视矫正处理后的入口和初始视图进行求交,它们的交将构成新的视图。现在PDA上的3D游戏也大量采用了入口技术,如图8所示。2.3.2lod技术的应用目前的地形渲染技术主要有Voxel和LOD两种。体素(Voxel)也就是VolumetricPixel。它是相对于像素来说的,如果像素是一个二维矩形,那么Voxel就是一个三维的立方体。三角洲部队游戏就是使用了Voxel技术。关于Voxel的细节技术不是本文的重点,不进行深入的介绍。Voxel有一个天生的优点就是渲染的时候它和场景的大小没有关系,而且绝对不会渲染多余的东西(自带裁剪功能)。它的复杂度只与我们需要的视野以及分辨率有关,而且可以在不使用硬件加速的情况下达到比较理想的速度(三角洲部队I就没有使用硬件加速),生成的图像也比较细腻。它的缺点就是不够灵活。LOD(LevelofDetail)即层次细节,它不同于体素技术,它是一种使用多边形的,真正的3D渲染技术。其根据一定的规则来简化物体的细节,可以根据需要来选择不同细节程度的物体表达方式。如离观察者近的选择较高的细节程度、反之选择较低的细节程度。用在地形渲染中,有时我们也称它为多分辨率地形(MultiresolutionTerrain)渲染技术。地形作为一种特殊的几何物体,在运用LOD法则的时候有一些特殊的技巧。因为地形通常是一个规则的矩形网格,其简化模式可以有规则的简化和非规则的简化。规则的简化通常是对这个矩形网格采用自顶向下(Up-to-Down)、分而治之的策略,典型的有四叉树和二叉树,它们从场景的最低细节层度开始,按需要不断地提高细节;非规则的简化通常是采用自底向上(Down-to-Up)的方法来处理,它的实现通常较少。现在的3D多采用基于ROAM实时动态LOD地形渲染,如图9所示。2.4游戏中的场景树对于由多个物体组成的3D场景,最简单的组织方法是把其中的物体用一个链表连接起来,然后在绘制每一帧的时候依次送入渲染器进行处理。显然用链表管理不是一个很有效的方法,因为其处理一个普通的游戏场景都会显得非常慢。因此可以采用基于空间排序的方法把游戏引擎中的渲染内核设计成树状结构(图10)。在游戏中,场景管理树被动态构造。在图10中的场景管理树中,没有加入摄像机(视点)。值得注意的是,每一棵场景树的根节点都会挂载一个摄像机。在有些情况下,把摄像机加入到场景管理树中会简化游戏的编程,如导弹飞行的场景中,视点应随着导弹的轨迹而运动。场景树是一个复合的数据结构,包括声音处理、包围体、坐标变换、属性和显示的表面。在一次场景树的遍历中,声音和图形渲染同时被处理。而几何变换和碰撞检测等功能,通过局部遍历实现。二叉空间分割树(BSP)是最基本的空间排序方法,DOOM是第一个使用了二叉树的商业游戏。它基于这样一个事实,即空间中的任何平面都将整个空间分割成两个半空间,所有位于该平面某一侧的点定义了一个半空间,位于另一侧的点定义了另一个半空间,如图11所示。在游戏中,可视性问题和碰撞检测问题都最终归结为树的遍历和下溯。而这些操作都是O(N)或O(logN)的,效率比较高,这对于游戏的实时画面处理非常重要。2.5基于场景的bsp和z-存储算法如果使用BSP树进行三维空间的排序和裁剪,再对局部物体采用Z-缓存算法进行排序和隐藏面消除工作,就会大大优化显示的速度。具体操作如下:首先根据场景生成BSP树,只需要细化到物体级,不一定是细化到多边形级。这样BSP的树叶就是物体或物体的一部分。然后根据镜头的位置,迅速决定哪些物体是在可视空间之外,将它们忽略不处理。然后对剩下的物体的多边形使用Z-缓存算法。这种方法是目前游戏中最常用的管理场景和渲染场景的方法。图12所示的《反恐精英》游戏中,场景的处理采用了BSP树对场景排序和裁剪。2.6两个bsp树的合并碰撞检测是与空间划分息息相关的,有了高效的空间排序,才有高效的碰撞检测。在设计3D游戏引擎时,两者要统筹考虑。游戏引擎中,如图13所示的《铁拳5》中,常采用空间剖分法。这个算法主要是使用BSP来进行碰撞检测,不需要额外的包容体(在层次包围体树算法中需要使用包围体)。对两个三维物体来说,如果各有其单独的BSP树(即所谓的本地BSP树,或物体BSP树),则碰撞检测就变成了两个BSP树的合并,其操作如图14所示。物体1和2,各由三个表面组成,这三个表面就是三个BSP分割平面,形成的本地BSP树如第二行所示。特别值得注意的是本地BSP树中包含了物体内部外部的空间信息。以物体1的BSP树为例,从树的根部A分割平面起,左边子树代表A分割平面的内向方面,即物体1的内部。而右边子树代表A分割平面的外部。当考虑两个物体之间的相对关系时,以物体1的BSP树为基础,考查物体2的三个表面,看他们是否有部分插入了物体1的内部。如果是,则碰撞。首先看分割平面A,物体2在A向内的方向,所以要分割到A左边的子树。然后考查分割平面B,发现D和F被B分割平面分割。其中D1,E1,E2,F1位于B分割平面向外的部分。而D2,D3,F2位于其向内的部分。最后考查C分割平面,也就是到了物体1的BSP树的树叶。D2位于C分割平面的向内部分。这样,得出了D2位于物体1内部的结论,也就是说物体2和物体1发生了碰撞。这种方法的优越性在于BSP树既比较精确,实时性能又很好。作为一种空间划分和场景管理的方法,如果已经在隐藏面消除中使用(能够在隐藏面消除中使用本身就说明了其较好的实时性能),再用到碰撞检测中可以节省资源。2.7粒子系统每个粒子需要一些属性来和其他粒子区别。通常在一个系统中的所有粒子有一个相同的属性集。下面是适用于粒子的典型属性:(1)哪里,物体(2)速度包括速度和方向(3)加速度与速度一样,加速度影响速度(4)生命周期通常由计算机计算限制,因此颗粒被指定为有限的生命周期即时战术模拟《中途岛海战》游戏中的水波、云特效均采用了粒子系统(图15)。2.8雾化表和纹理雾在游戏中,使用较多的方法之一是顶点雾效法。把3D物体进行投影变换之后,用每个物体顶点的Z值代表雾的浓度,用类似上面公式的式子计算并修改该顶点的颜色。这样就得到了一个充满雾的场景。但如果3D模型的顶点不是很多,就会出现不精确的情况。另外一种方法是雾化表。所谓雾化表,就是建立一张浓度和距离对应的关系表。在绘制场景时,对每一个像素,用其Z值在雾化表中查找对应的浓度,再进行雾的计算。这种方法的优点在于:①速度很快,因为在使用Z-缓存时,每一个点的Z值已经算出,查表的速度也是很快的;②对每一个像素进行计算,所以无论模型的顶点多少都不会影响绘制效果。但是并不是所有的硬件都支持雾化表,因此这种方法的使用受到了限制。无论硬件是否支持雾化表,它总会支持纹理映射的。我们可以用纹理来模拟雾化表的效果,这就是纹理雾。用纹理来模拟雾化表有很多好处:①几乎所有的硬件都支持透视校正纹理(在透视空间中正确作插值,需要双线性插值,如果不支持,纹理将会有明显的错误),但是很少有硬件支持透视校正颜色,所以顶点雾效的效果常常不正确。②材质坐标产生可以有很多种变形,不用Z值作为雾的浓度,可以制作许多有趣的雾效果。图16是PS2上的《GT赛车4》中的两个雾效截图。3不同场景的应当使用营造一种新的即速度/效果,这也是开发新的方式方法在设计游戏引擎渲染器时,应先确定要实现的模块有哪些,否则中途增加新特性是非常困难的。即使最后能得以实现,对效率也会
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 茶文化与茶艺鉴赏 教案 项目二 得茶益-茶与健康
- 光的折射(教案)
- 2024-2025学年重庆市八中高三上学期适应性月考卷(二)地理试题及答案
- 载体桩自动化施工技术规范编制说明
- 上海市市辖区(2024年-2025年小学五年级语文)统编版能力评测(上学期)试卷及答案
- 九年级化学上册全套教案
- DB11T 1095-2014 旅行社服务网点服务要求
- 山东省济南市莱芜区2024-2025学年九年级上学期期中考试化学试题(含答案)
- 河北省张家口市桥西区2024-2025学年九年级上学期11月期中化学试题(含答案)
- 2024-2025学年湖北省高中名校联盟高三(上)月考物理试卷(11月)(含答案)
- 习题课一 动量与能量的综合问题
- 婴幼儿保教实训与指导中职全套教学课件
- 安装发光字验收单
- 低压柜试验报告
- 小学校本课程-【传统文化】三皇五帝教学课件设计
- 中职英语新高教版基础模块1unit4school-life
- 俄语商务迎接对话
- 无线网络规划流程及方法
- 河道修防工高级技师技能操作试题
- 天津高考英语词汇3500
- 扑克牌搭高塔 课件(16张PPT) 小学班会活动
评论
0/150
提交评论