halflife2:Far Cry和Half Life2两种区别的思路方法来实现室内外场景的融合



  当前对于流行人称游戏来说将室内场景渲染和室外场景渲染进行融合是主流趋势本文试图从场景架构入手对当前流行两个游戏引擎Far Cry和Half Le2进行些非常浅显介绍、分析、比较由于本人学识浅薄本文中可能存在的处请大家予以谅解并请高手给予指正

  在过去由于硬件发展限制因此第人称游戏只能在室内场景进行随着硬件技术发展它逐渐由室内向室外场景进行过渡发展到现在已经有大量游戏可以同时对室内和室外场景进行渲染当前这类游戏代表就是Far Cry和Half Le2它们完全使用了两种区别思路方法来实现室内外场景融合

Far Cry:
  Far Cry将场景分为室内和室外两部分对于室内场景它使用了流行BSP思路方法来对场景进行组织BSP思路方法在网上有大量资源可以进行参考这里我不在进行详细阐述在Half Le2部分我再进行些简单介绍这里我将重点介绍下它室外场景部分所使用技术通常对于室外场景部分最重要是地形部分渲染当前对地形渲染存在着大量算法其中比较主流有ROAM、GeoMipmap、Chunk LOD等等Far Cry并没有使用上述算法为什么呢?对于ROAM来说它确实是种非常良好地形渲染解决方案但是它存在个非常大弊端就是它灵敏度非常高它是种连续基于 3角形分割LOD算法因此只要Camera位置发生很小位移整个场景LOD都需要发生变化这非常不适应于当前硬件架构而对于GeoMipmap这种利用当前显卡高渲染速度通过增加填充率来加速地形渲染思路方法其实也不符合当前游戏引擎发展方向正是由于这些思路方法限制Far Cry使用了种比较折中地形渲染思路方法这种思路方法非常类似和Game Programming Gems2中Greg Snook提出Interlocking Tiles思路方法但是还存在着些相差别地方在Far Cry关卡编辑器SandBox中我们可以看到通常它使用是1025*1025大小HeightMap个Tile大小为(32+1)*(32+1)存在4级LOD因此个Tile最简化时大小为(4+1)*(4+1),对于区别LOD级别Tile连接使用了和Interlocking Tiles思路方法使用固定连接模版进行
连接这里两者差异最大地方是对Tile内部 3角形生成方式对于Interlocking Tiles思路方法它使用类似于以前CLOD思路方法分割后形状象是个“米”字形状而Far Cry分割方式是对角分割线方向都是这样做好处是非常容易生成Trigle Strip好了现在我们看看使用这种思路方法有那些优点由于每个Tile只存在4级LOD因此避免了ROAM那种灵敏度过高弊端其 2由于地形是由个个Tile构成因此非常适合使用Quad Tree这样结构来进行管理其 3由于每级LODTile顶点顺序都是固定因此可以对地形顶点数据进行预先优化如提前就可以确定生成Trigle Strip索引缓冲区其 4、可以使用预先计算好LOD查找表思路方法来获得每个TileLOD级别而不需要通过实时计算来获得这种思路方法还有许多其他优点需要实际使用时认真体会我就不再列举了Far Cry在对地形进行渲染时还使用种OC思路方法来对地形中被遮挡住Tile进行剔除相关论文请参考A.James Stewart发表于Eurographics Rendering Workshop论文Hierarchical Visibility in Terrains,june 1997我不再进行介绍当Far Cry需要同时对室内外场景进行渲染时它使用portal来对场景进行渲染如果从整体上来说Far Cry做法是对室内外场景渲染分别进行处理它们完全是两个部分当这两个部分需要发生联系时通过portal来进行处理这样Far Cry场景架构就显得非常简单明了至于portal工作过程我后面再进行介绍下面来看看Half Le2做法

Half Le2:
  在介绍Half Le2架构的前我需要先解释下surface概念Half Le2场景都是由surface所组成它是场景中最基本图元surface是由共处于个平面上多个顶点所组成物体例如面墙我们可以称它为surface组成墙所有顶点位于同个平面内通常在Half Le2中把surface分为 4类:水面、水面的上、水面的下、横跨水面了解了surface基本概念下面看下如何进行场景处理在Half Le2中场景被分为 3部分:cluster,area,displacement其中cluster对应于室内场景处理area对应于类似于城市这样建筑物众多室外场景displacement对应于地形这样室外场景必须注意是在Half Le2中对所有场景都使用BSP来进行场景管理而不是象Far Cry那样分别进行处理它是如何实现下面我们根据区别场景分别进行介绍 

  对于cluster这样室内场景使用最基本BSP思路方法来对场景进行管理也就是基于多边形对齐BSP算法什么是cluster呢?实际上个房间就可以看作是个cluster个cluster是有严格定义它必须保证组成cluster多边形形成个“凸”物体也就是组成cluster任意两个顶点的间直线不能位于cluster外面个室内场景完全由cluster所组成cluster的间通过portal进行连接房间中门、窗户都可以看作是个protal它是由处于同个平面上多个顶点组成闭合多边形通过使用portal可以对每个cluster做光线跟踪处理获得在每个cluster上可见cluster列表这就是PVS数据了室内场景在实际运行时可以通过PVS数据快速进行可见性检查剔除不可见cluster来加速场景渲染室内场景中portal通常是由自动生成相关算法非常多篇非常好参考文章是位于GameDev.net上由国人胡灵和李振霄所写Automatic Portal Generation非常佩服这是我在gamedev.net上看到篇由中国人所写技术文章当获得了场景cluster信息后就可以将它和BSP节点信息相连了由于portal必然处于节点分割面上因此这步非常简单

  下面看看如何处理城市这样室外场景这类场景由于拥有大量建筑物并将场景分割成区域因此也可以使用上面处理室内场景思路方法来对它进行处理这方面论文也有很多比较好篇是由Alon Lerner等人写Breaking the Walls: Scene Partitioning and Portal Creation我这里只是简单介绍这类场景可以看作是由个个area组成area概念非常类似cluster条街道栋楼房都可以看作是个area这里必须提醒下组成areasurface法线必须指向其内部cluster也是这样因此街道这样area是由楼房外表面所组成而楼房这样area是由其内表面所组成个area也是通过portal进行连接对于这样场景不能再使用预计算PVS思路方法进行可见性检查而需要通过使用portal对场景进行实时剪切剔除运算必须注意这里对portal记录方式在室内场景中portal通常需要记录它所连接两个cluster而这里area portal只记录个和其相连area也就是这里portal都是单向这样做原因是为了方便进行area可见性检查只要知道portal可见那么和其相连area定可见area和cluster存在个非常大差异地方是area不再必须是个“凸”物体它可以是任意由surface组成个空间因此如果对这样场景进行BSP分割后个area可能只包含个叶节点也可能是包含多个叶节点完整BSP子树对于area进行处理时还有种特殊情况就是area和cluster发生连接时通常这个时候cluster被包含在area内部例如对于场景中栋建筑物可以看作是个area通向外部门、窗可以看作是此areaportal这个建筑物内部可以看作是个完整室内场景形成个BSP子树这样通过portal可以巧妙将两种场景融合到下面具体看看如何通过portal来对area进行可见性检查需要注意点area没有AABB而只有portal和叶节点才拥有AABB思路方法如下:



  1、由摄象机所位于area出发递归遍历场景中所有area portal检查哪些portal是可见(使用简单frustum culling)通过这些portal我们可以获得个当前可见area列表
  2、对于所有可见portal将其顶点投影到屏幕上获得它在屏幕上个包围框
  3、对portal在屏幕上包围框使用视口包围框进行剪切获得portal包围框在当前视口完全可见部分
  4、通过使用这个包围框可以获得个frustum这样每个可见portal都可以对其相连area所包含叶节点AABB进行frustum culling运算从而最终获得个当前可见叶节点列表(当然对当前所在area所包含叶节点也需要进行frustum culling)

  最后来看看HL2是如何来处理地形这样大动态场景HL2处理地形使用种非常特殊displacement系统现在heightmap是记录地形信息最流行做法但是HL2并没有使用这种思路方法他使用了种称为displacement map物体来记录地形信息为什么这样做呢?根据我看法主要有以下原因:首先使用heightmap记录地形信息其实有个非常大弊端它不能处理非常复杂地形用它生成地形都是连续这是在每个位置它只能记录个高度值当同个位置发生高度重叠时它无能为力其次我前面介绍过HL2场景完全是由surface所组成使用heightmap你无法将地形信息和surface相连而通过使用displacement map可以简单将地形信息和surface连接起来下面我们具体来看看它是如何工作通常个displacement map对应块地形它最大可以表示(16+1)*(16+1)这样地形块它非常类似heightmap不过heightmap只记录每个位置上高度值而displacement map不仅记录高度值而且记录每法线由于法线存在它就可以记录非常复杂地形不过displacement map存在个限制 4角顶点必须位于同个平面上正是这个限制存在从而使displacement map和surface巧妙联系在surface上所有顶点必须位于同平面上个displacement map不仅记录高度信息还记录了邻边和邻角displacement map信息通过这些信息可以对片地形快速建立个Quad tree通过它来对地形进行有效管理个displacement map都拥有 4级LOD从(2+1)*(2+1)到(16+1)*(16+1)下面来看看HL2是如何将地形和BSP相联系对于片地形我们可以把它看作是个area这样和其它场景可以通过portal相连接起来而每个displacement map你可以把它看作个BSP叶节点通过前面建立Quad tree你可以快速将它转换为BSP tree(其实这步不是必须你只需要知道displacement map和叶节点连接关系即可)当进行地形可见性检查时使用Quad tree进行最终还是可以获得个可见叶节点列表

  通过上面介绍可以看出Far Cry和HL2场景架构差异是非常大Far Cry各个场景的间是完全独立而HL2则巧妙将其融合到BSP格式中形成了架构正是如此使HL2对付任意场景都应付自如而Far Cry却只能限制游戏场景形式因此HL2游戏架构明显优于Far Cry成为了3D引擎发展主流趋势不过Far Cry在些场景细节上处理确实非常优秀如海岸边潮起潮落这是HL2需要明显改进地方不过HL2在光源处理上确实是技术超群全lightmap光照架构将lightmap应用到极至bumped lightmap技术只能是令人叹服这里不再列举我只能说HL2是当前商业引擎中NO.1

  由于行文仓促难免存在许多尤其是HL2地形部分由于我还没有完全研究透彻因此避免不了会出现请研究HL2高手给予指正我这里表示感谢如果你有什么有关HL2技术问题希望和我进行交流我非常欢迎你发送邮件到我邮箱[email protected]也欢迎你在我blog流言
Tags:  farcry2 farcry halflife2spx halflife2

延伸阅读

最新评论

发表评论