一、场景管理有很多种方法,如四叉树、八叉树、BSP、模糊K-D树、包围球层次结构等。室内环境主要是BSP为主,从quake3一直延续到现在主流的引擎都是以BSP为基础,BSP使用并不难,关键是数据的生成,这就牵涉到场景编辑器。
Quake3、Unreal:BSP,有自己的编辑器。
FarCry:场景分为室内和室外两部分,室内场景使用BSP, 室外不清楚但应该跟地形有很大关系,同时为了支持超远距离视距使用了地形Occlusion Culling,另外也可以手动放置OcclusionArea。
三、目前我的做法,主要介绍下室外四叉树,室内及室内室外衔接做完了再做介绍。
场景元素:
1.地形,由Tile 组成。3.动态实体,指WorldBound变化的实体,如烟雾特效、天生飞翔的老鹰。
场景层次结构:
1.场景实体全部处于同一级;
场景更新:
静态物体:
1. 当添加实体的时候,根据实体的世界坐标及AABB,可确定实体处在哪些Tile,并更新相应Tile的实体列表索引。
2. 当删除实体的时候,遍历所有的地形Tile,更新实体列表索引。
3. 当移动、旋转、缩放即WorldBound变化的时候,马上更新相应Tile实体列表索引。编辑器、游戏内都一样。
对于动态物体,没有特殊处理,进行最简单也是低效的视椎体裁剪。
剔除及次序:
1.地形四叉树剔除,确定可视VisTileList
场景渲染及次序:
1.先绘制ui。
2.绘制VisEntityList的非透明实体,被渲染的实体更新当前帧数避免重复渲染。
3.绘制地形。
4.绘制VisEntityList的透明实体,被渲染的实体更新当前帧数避免重复渲染。
5.最后绘制天空盒