引擎中影响渲染效率的最重要因素是场景管理,而剔除算法是最重要的内容。这里简单总结一下各种流行的遮挡剔除算法,只是我游戏引擎的一点功课。
1. bsp。二进制空间分区。优点是这个算法的数据结构非常简单(二叉树),从效率上来说非常高效,因为强调离线计算(即场景以bsp数据格式保存,bsp树在渲染之前加载)。更麻烦的是它的实现非常复杂,用dx实现比gl更麻烦,因为bsp的划分平面可能是三角形、矩形,或者其他多边形。使用 dx 实现时,这些平面通常是分开的。成多个三角形。. . . 另一个限制是使用bsp适用于静态物体较多的场景,否则需要在每一帧计算bsp树,失去离线计算的优势。用于物理的 bsp 和这里的 bsp 是有区别的。有人说这个算法在物理上既可以用于渲染,也可以用于碰撞检测最简单的游戏引擎,实现了计算上的简化。这种说法是错误的。当然是指具体实现(bsp在素材资源方面基本还是使用bounding volume,但是判断次数是用bsp树优化的)
2.光伏。潜在可见集。对于复杂的室内场景,pvs可以进一步优化bsp或者octree来剔除更多的人脸,避免大量的重绘。这种方法也比较适合静态场景。
3.门户。更适合室内场景。culling的粒度小于pvs,在视点和入口之后产生一个裁剪量。不如 pvs 效率高游戏动态,因为总是实时计算。
4. bv。边界分层卷。这是可用于渲染剔除和物理计算的算法。
!!“BSP 已经过时了!!”?? 从某种意义上说游戏角色,是的。bsp的粒度还是停留在多边形(尤其是三角形)上,在没有硬件剔除的老显卡上肯定有用,但是现在显卡的硬件可以很好的解决这个问题,那为什么还要放原来好的V带撕成碎片?要知道,目前的显卡处理一次pass的能力很强。反而成为了传球与传球之间的主要瓶颈。因此,减少传递次数,即减少一帧内传递数据的次数是关键。不过BSP在物理上的应用还是很多的,物理计算的粒度应该是三角形。
现在,如果一个引擎需要在室外和室内场景之间无缝切换,最好的办法不是使用多个版本的场景管理器,而是使用一个最简单的游戏引擎,当然,这个管理器可以综合多种算法的优点。所以如果将不同的管理器制作成Ogre这样的不同插件,游戏运行时场景管理器是无法切换的。我已经写好了包围体的生成,准备用八叉树来组织结构,八叉树也可以用来处理外部地形;在内部,八叉树也比较适合,不过如果能加上pv和传送门就更好了。. . .