翻译引擎:一个实用的3-D游戏引擎实现思路方法(翻译)



3D游戏引擎实用执行思路方法
(APracticalImplementationofa3-DGameEngine)

摘要:
制作个3-D游戏引擎并不是件很简单任务现在游戏玩家常常要求在游戏中有着高性能和高质量输出在这篇文章中我们向大家展示了多种实时渲染算法如何用来在个实际3-D游戏引擎中提高性能我们探究了个通用3-D游戏引擎结构并且讨论了在3-D游戏引擎中视景图像任务我们将从软件Software工程角度来研究视景图像我们将向你展示种面向对象和可以方便通过区别渲染引擎来设计视景图像接下来我们解释了在我们3-D游戏引擎中用来提高引擎性能算法我们在视景图像和物体几何层面上对我们3-D游戏引擎进行了优化我们提出算法在静态和动态场景中表现都是相当最后我们用多处理器在视景图像方面用并行处理方式来建立个3-D游戏引擎方面作了下简单展望

、介绍:

在过去十年里面计算机游戏行业经历了巨大增长黄金时期在过去几年里随着3-D加速硬件设备飞快进步游戏制造行业都将焦点集中在用创新思想来生产交互式3-D游戏3-D游戏引擎是驱动这些游戏核心技术简单来讲个3-D擎获得游戏中3-D物体几何数据并将这些数据展示在显示设备上典型显示设备就是显示器这个过程就是我们通常所知渲染3-D物体几何数据通常通过系列顶点来定义物体具体特性(象漫射颜色镜面反射以及发射出颜色等)纹理图纹理匹配以及些常用向量所有这些数据在3-D游戏引擎处理途径中经历区别阶段来决定着这些3-D物体最终显示效果

图1个完整3-D引擎处理过程高层视景图像给用户种直觉方式来模拟个场景优化场景保证了场景对于渲染高效率
高层视景图像规定了在游戏中物体的间关系它对于游戏开发者来讲也是在游戏中操纵这些物体个应用接口(API)个场景被渲染的前视景图像必须为了渲染而被优化这种优化处理就是典型将高层视景图像转变成(编译成)优化视景图像这种被优化视景图像就是用了种非常适用于渲染数据结构这就要求开发者去详细确定每个物体“线索”:比如这个物体是静止还是移动物体结构是否随着时间变化而变化等等视景物体剔除就是将观察者不能看到物体丢弃掉处理过程尽管细节层次控制可以将相对于观察着者比较远些无关紧要物体给删除掉所有这些思想背后就是减少渲染那些你看不见东西以及减少远端物体几何数据为了是将送往最终渲染管线数据减到最少这些将会明显提高渲染性能这些就是个3-D游戏引擎为了提高它性能而所要完成主要任务
后续任务诸如灯光视角转换裁减投影变换以及光栅化都是渲染引擎为了完成渲染流程所需要承担任务渲染引擎就是经常提及立即模式渲染引擎往往都可以被3-D加速硬件支持两种主要适用于PC机渲染引擎就是微软Direct3D和SiliconGraphics公司OpenGL在这种渲染引擎上开发游戏往往是枯燥和耗费时间这些引擎所给接口都是些和面向硬件在接下来部分我们将在集中在建立3-D游戏引擎 3个主要模块:(1)为我们3-D引擎建立高层场景图像;(2)为了建立优化场景图像算法;(3)如何丢弃不在观察者视野范围内物体并且适当控制细节层次控制物体
2.在3-D引擎中设计问题
视景图像设计由于它直接牵扯到整个3-D引擎性能所以显得非常重要它定义了种让员来模拟视景方式个好视景图像设计应该允许员将更多视景(诸如物体和它们排列)包含在视景中并且想到用最好方式来展现它们并且可以忽略掉渲染管线复杂控制员将通过视景图像API来设计3-D引擎
视景图像设计
在视景图像设计中个问题就是要考虑物体表现就像我们上面提到象Direct3D和OpenGl这样立即模式渲染引擎均倾向于拥有自己面向图形硬件渲染功能很显然这种面向渲染设计并不适合于完成我们视景图像设计目标个面向对象视景图像设计明显种比较好模式在这种模式中允许员在视景中用对象概念来设计3-D游戏我们将所有游戏对象都当作视景中3-D对象来对待Strauss和Carey已经介绍了完全面向对象视景图像框架这个框架基本思想就是将3-D视景描述为物体图像这种图像成为节点有很多种类型节点并且每个节点都有区别相关属性比如说圆柱形状节点包含两个参数:半径和高度但是球状物体仅仅包含个参数那就是半径些特定节点可以包含属于它们子节点些参数例如在图2中描绘了个汽车部分视景图像节点组命名为“Body”它拥有4个子节点来组成汽车车身纹理节点包含了定义汽车车身纹理图像参数这些参数同样会被命名为“门”组节点继承这些节点用来组成汽车车身车门因此汽车车门将会拥有和车身纹理通过应用这种方式我们不仅可以增加资源可重复利用度而且也是简单模拟场景方式尤其当我们处理些视景物体相对位置时这种方式显得更有效变换节点用来描述在父节点下对象位置和方向变换这些都是相对于父节点变换为了得到这些节点绝对变换(相对于整个场景变换)当前这些节点将和它们父节点变换相结合(通过矩阵相乘)起来这样就可以很轻松和简单个对象相对和父节点位置和方向了这种模型就是通常我们所说等级场景模型并且是骨骼动画基础这种模型通常用来在游戏中动画运动部分

2.2可移植视景图形
为了保证我们游戏能满足尽可能多玩家要求我们必须保证我们3-D游戏引擎可以在区别平台和区别操作系统上运行因此可移植性是我们设计视景图形另外个问题个视景图形必须能够在各种目标平台上运行渲染引擎而且游戏代码还不能做任何改动个可移植视景图形必须设计成为不依赖于特殊渲染引擎才能运行D鰈lnerandHinrichs已经讨论了些实用思路方法来归纳区别渲染引擎特性并且提议种可以支持这些系统通用视景图形结构他们确信通过应用种通用视景图形大多数实时渲染设备都能被整合为单不会被凌驾于或是受到些特殊渲染引擎视景图形表示思路方法可移植性通过分离渲染对象和渲染引擎来共同完成图3就是个用来证明这种观点简化了原始视景图形结构和前面我们讨论StraussandCarey工作相类似个渲染对象就是在视景图形中个节点多个渲染对象在视景中组织起来就形成了个完整视景D鰈lnerandHinrichs将渲染对象扩展到包括不被任何渲染支持2-D和3-D几何对象除了它们几何描述;属性包括外观属性(颜色材质纹理)变换属性(方向和位置)以及光照属性(区别光源)这些都是要渲染细节在渲染过程中渲染引擎将会研究和解释视景图形内容计算每个被渲染对象属性并且将它们转换为和目标渲染引擎相匹配算法因此渲染引擎是唯能包含细化个可移植渲染系统代码地方这些渲染引擎特殊算法在整个执行过程中被称为句柄即每个属性特例在渲染时候渲染引擎将会这些句柄思路方法特殊渲染引擎可以提供优化引擎执行思路方法用来扩展底层渲染引擎特殊功能张大图片、些视景图形被描述为可以满足特定规范标准参数化视景个视景结构紧紧能为给定渲染引擎而计算内容可以被区别渲染引擎解释为区别


3.在3-D引擎中优化技术
在这章中优化专门是指用来加速我们3-D引擎渲染速度加速技术优化技术获得视景图形中对象并且构建种特别有利于渲染数据结构来存储物体几何数据这个过程就是通常所说视景图形编辑个完整优化视景图形应该能够提供对于感光输出结果SudarskyandGotsman定义了个在每运行时间为O(n+f(N))条件下感光输出算法在这里N是在场景里所有对象n是所有可见物体而且f(N)远远小于N举个简单例子也就是说个光敏感输出算法运行时间和可见物体数量成线性正比关系而不是和场景中所有物体成正比目前共有两种技术能达到这个目在物体几何层次细节层次控制试图在越远物体上渲染越少数据(也就是物体包含越少数据)然而越靠近观察者物体越会清晰呈现它们完整特性反的越远物体看起来越粗糙很多精细细节数据被移除掉了在场景结构层次可见性删除技术可以避免渲染观察着看不见部分这些物体在渲染的前就被丢弃掉了以便于不把这些数据送到渲染硬件中去可见性删除技术可以更深层次分成背面剔除法视锥体剔除法和遮挡剔除法简单背面剔除法就是将背对于观察者物体表面被丢弃;视锥体剔除法就是将观察者视角外物体忽略掉;遮挡剔除法就是试图将从观察者视线内被其他物体完全遮挡物体丢弃掉(如图4)
图4(a)视锥体剔除法将观察者视线外物体丢弃掉
(b)遮挡剔除法将被其他物体挡住物体丢弃掉

3.1场景结构优化

为了实现在可见性剔除算法光敏感输出它们不能简单重复计算整个场景中物体并且决定哪个是可见我们应用种特定数据结构来将场景中物体分组这样个简单查询算法就可以下子决定是接受还是丢弃组物体我们还可以建议使用分等级数据结构来根据物体位置来将场景中物体归成几个区域通过这种方式如果个特定区域被发现是相对于观察者来讲是不可见或是隐藏那么大部分物体将不会被渲染为了得到这些分级数据结构场景必须要被预处理假设这个预处理是非常耗费时间那么它必须在化阶段被完成
我们应用混合式 8叉树作为空间数据结构来存储3-D引擎中物体我们选择 8叉树主要原因是基于我们回顾其他优化技术我们优化场景结构可适应性可以扩展到区别算法 8叉树模型用个立方体顺着 3个纬度来次性划分空间物体在每个阶段用 8个相等立方体沿着 3个轴面上均匀划分整个场景(xz,xy和yz面)图5证明在2维视角上验证了这个过程

图5个 2维版本 8叉树 4方块构建每个面上再递归划分为 4个相等相等 4方块直到里面物体为空或是整个物体
这样就可以创建个每个节点都包含有 8个字节点通过划分每个物体都会和它所嵌套子节点相应立方体相关联如果个物体恰好被个面所划分(图5c),那么这个物体就可以用几种思路方法来处理种思路方法就是根据和划分面关系来划分物体根据物体在他子节点所关联立方体空间尺度来关联部分物体分裂算法有点复杂并且这种思路方法同时也会增加场景中物体数量另外种思路方法就是将原始物体既可以和它父节点相关联也可以和它装入子节点相关联当立方体为空时或是整个物体都包含在立方体时就停止向下划分(图5d)当算法结束时实际物体都会包含在 8叉树叶节点内每个叶节点会包含少于或是等于指定物体数量

3.2物体可见性剔除

视锥体剔除法是通过执行观察者视角和装入最大立方体系列物体交集测试来运行如果测试失败则将这些物体在最初阶段裁减掉否则进行和最小立方体进行次最终测试 8叉树不仅可以很好应用在静态场景同时它也可以方便应用于动态场景中遮挡剔除法算法可以紧接着应用于丢弃掉其他大部分不在观察者视线内物体尤其对于场景内物体密度比较大情况更加有效张提出了种比较新颖应用分级空间图形遮挡地图遮挡剔除算法这个算法有两部分测试组成:个在Z轴方向上维度深度测试和两维度空间图形交迭测试来共同决定个物体是否被遮挡住
对于两维度交迭测试个遮挡表示就是被渲染系列潜在很好遮光板而构建这个遮挡在场景结构完成时就被确定了张还建议些大或比较靠近观察者物体当作比较好遮光板这些遮光板被渲染成没有纹理灯光和开启Z-buffering块在黑背景下块白颜色脱离屏幕图形缓冲这些操作允许将些列小遮光板拼成块大遮光板这个被渲染过图像就是最高分辨率遮挡地图这个方案是基于分级遮挡地图这个层级是通过从最高分辨率向下到最小分辨率层层递归取样形成象图6所示图形硬件可以用缩小倍率过滤双线性插补纹理映射来加速这个过程

图6a接近建立个遮挡图遮光板
(b)在区别级别分层次遮挡图
交集测试是通过测试物体是否投影在屏幕空间范围内点和分层次遮挡图形同尺寸像素对应于相同尺度边框内尺寸是不如果边框内所有元素和映射交集为不透明(全白)那么这个算法就认为这个物体是被遮挡然而这个算法会递归检查比它低层次不透明像素这个算法独特点是比较接近可见性剔除也就是忽略掉对那些仅通过小洞或是透过遮光物体才能见到物体渲染对于这点在遮挡映射里像素并不完全等同于全部透明而是相对于个透明阈值(灰度)这个值越小那么这个算法就越接近于剔除场景内物体会由于被忽略渲染而导致部分可见张已经得出了个计算在层次中区别等级阈值公式这个特征就好像是增加剔除率当场景不需要物体被看见事可以通过些遮挡物些小些不是特别清醒图来代替这个物体
维度Z-depth是用来检查个物体是否在遮挡物体后面张提议用深度估计缓冲来将屏幕分成系列矩形区域对于每个区域所有遮挡物体视线内最远顶点z-value被加入缓冲深度估计缓冲在每帧祯都需要建立在渲染是如果个物体所占体积最近顶点Z-value要比这个物体所能覆盖区域所存储Z-value都大这个物体才会通过深度测试为了使个物体被遮挡这个物体必须同时能通过用分级遮挡映射交集测试和用深度估计缓冲深度测试才行



3.3动态物体优化
为了处理 8叉树内动态物体最直接思路方法就是每次当物体运动是就在 8叉树内把它删除掉接下来通过插入它新位置这并不是最佳处理思路方法这样会使我们陷入到频繁修改 8叉树结构举个例子来说删除 8叉树节点有时会合并刚刚分开节点就像图7所示另外它还经常需要个很长路径来寻找物体相对于根节点插入新节点为了避免删除和建立节点而频繁更新 8叉树Sudarsky建议仅更新那些具有最少共同祖先子树物体新老位置(图8)对于个 8叉树很深大场景这种思路方法会很明显减少更新 8叉树时间LCA要比根节点更加接近叶节点
为了避免对每个动态物体帧都要更新 8叉树结构Sudarsky用了个懒惰计算技术即我们在个物体是绝对需要的前不计算任何事情这就需要个和每个动态物体相关联临时边界体(TBV)这个TBV是个保证在某些特定时间内能包含个动态物体边界体这段时间就是指TBV有效时间失效其就是这个时间最后时刻现在比较流行TBV构建思路方法往往基于些物体运动和行为前期知识举个例子sweep曲面可以用作TBV物体上边界;如果最大速度和加速度已知球形也是可以用应用这种技术动态物体TBV可以用在上述视锥体剔除法交集测试中在下列情况下个运动物体可以被认为是个隐藏或是不可见:(1)它TBV是可见也就意味着物体本身可能是可见;(2)它TBV过期了,意味着这个TBV不再保证包含个物体了个优先队列用来存储所有TBV过期数据为了得到更适宜性能我们所关心有效期必须被关闭个适当算法在大多数环境下都能很好应对这种情况如果个物体在确实被看见的前它TBV就过期了也就意味着它有效期太短并且在下个TBV中将赋予它更长有效期相比的下如果个TBV在它过期的前就被看见了那么在下个TBV中将赋予它更短有效期


图8)当动态物体被更新是 8叉树节点经常被删掉和建立
(a)最初有两个物体 8叉树
(b)个动态物体从 8叉树内被删除
(c)动态物体又被重新插入到新位置

3.4物体几何优化
场景物体几何数据可以通过试图产生代表从区别观察者距离物体区别层次细节(LOD)进优化这种情况背后原因是我们不需要展现所有完整物体数据物体距离我们比较远并且在图形上看起来很小我们只需要展现那些距离观察者比较近物体完整数据这些物体精细数据都可以被展现出来这样就可以明显减少物体数据我们只需要发送那些最需要物体到渲染引擎里去图9证明了个Stanford兔子在LOD控制下在两个相对于观察者区别距离下显示情况

图9(a)最高细节原始兔子模型(35947个顶点69451个 3角形)
(b)相对于观察者比较远距离情况下同样减少了LOD兔子模型
(c)个扩大(b)版本展示给我们个粗糟兔子模型(359个顶点508个 3角形)
通过简化物体LOD控制是种为了提高我们3-D引擎性能必须技术LOD两个比较出名简化技术是分数倍采样和聚类思路方法分数被采样是在分类基础上减少顶点、边或是 3角形那些对于整个显示贡献比较少顶点将被标注为候选顶点个最不重要顶点被刈除后剩下漏洞将被补上这个过程直到达到预期后才会结束在聚类思路方法中组高权重顶点将被预决定了靠近这些顶点周围些顶点将被聚类只有那些权重高顶点被送到渲染引擎中去这些顶点都关联着网格形成这种思路方法非常快但是这种简化思路方法质量比较差
简化算法保真度可以通过在简化过程中瞄准那些小共面网格来得以提高为了得到这些网格可以用长度面积体积角度等来测量每个顶点其他临近顶点当这些共面顶点被刈除或是被大 3角形代替多边形数量减少了但是物体形状仍和原来物体相差不多这样原来物体将被尽可能多保留下来

4.将来3-D游戏引擎

上面我们讨论所有算法都是串行都是设计运行在个处理器计算机上尽管今天主流游戏者都在用这种配置多处理器计算机是未来工业种趋势现在在多处理器上3-D引擎算法方面作了很多研究工作RohlfandHelman解释了3-D引擎区别构件的间如何用区别并行散发进行优化他们研究3-D引擎用多处理技术来划分多个处理器的间工作并且用管道来管理数据他们同时也证明了处理器如何同步在区别环境下它们的间操作
Igehy介绍了个感兴趣方向将OpenGL接口扩展到并行处理上扩展允许多个绘图设备同时来画张图最初所包括同步化是允许并行横行个明确有序场景个24处理器系统上应用这个接口运行证明了它有效性

5.整理总结
我们已经介绍了些主要方面来执行个实际3-D游戏引擎这个引擎设计是轻便和有效它允许游戏有效构建和控制场景对象我们也强调了很多3-D引擎应用优化技术光敏感输出是我们在3-D引擎中所用算法必要部分在场景和物体层面为了将对静态和动态物体渲染性能提高到最大优化是必须要做最后简单讨论了些额外用来提高并行处理3-D引擎性能源码
\" border=0>相关档案:\" border=0>sf_200692422043.pdf (247842s)

Tags:  实用翻译教程

延伸阅读

最新评论

发表评论