游戏引擎中的各种剔除算法

阅读数:1528

在引擎中最影响渲染效率的是场景管理,剔除算法又是其中的最主要的内容。这里简单总结一下各种流行的遮挡剔除的算法,只是为了我的游戏引擎而做的一点功课。
1。bsp。Binary space partition。优势在于这种算法的数据结构十分简单(二叉树),而且在效率方面非常好,因为强调了离线计算(即场景保存为bsp的数据格式,在渲染前就加载生成bsp树)。比较麻烦的是它的实现非常的复杂,而且用dx来实现会比gl更麻烦一点,因为bsp的划分平面可能是三角形,矩形,或者其它的多边形,用dx实现的时候往往要把这些平面分割成多个三角形。。。。另外的局限是,用bsp适合于大量的静态物体的场景,否则要在每一祯内计算生成bsp树,失去了离线计算的优势。用作物理的bsp和这里的bsp是有区别的,有些人说的这种算法可以同时用于渲染和作物理中的碰撞检测,达到了计算上一种简化。这种说法是错的。当然指的是具体的实现了(物力上的bsp基本上还是用的包围体,只是用bsp树优化了判断的次数)

2。pvs。Potentially visible set。对于复杂的室内场景,pvs可以进一步的对bsp或者八叉树进行优化,以剔除更多的面,避免大量重绘。这种方法同样比较适合静态场景。
3。portal。比较适合于室内场景。剔除的粒度小于pvs,在视点和入口之后生成一个剪裁体。没有pvs效率好,因为总是要进行实时计算。
4。bhv。Bounding hierarchical volumes。这才是既可以用于渲染剔除,又可以用作物理计算的算法。

!!“BSP过时了!!”??从某种意义上来说,是的。bsp的粒度还是停留在多边形上(特别是三角形),这在没有硬件剔除背面的老显卡上肯定是有用的,但是现在的显卡的硬件已经可以很好的解决这个问题,所以,为什么还有把原本很好一条三角带撕裂成碎片呢?要知道现在的显卡处理一次pass的能力已经很强了,相反在pass和pass之间成了主要的瓶颈,所以减少pass的次数,即在一祯内减少传递数据的次数才是关键。但是,BSP在物理方面的应用还是非常多,应为物理计算的粒度是三角形。
   
现在来看,如果一个引擎需要做到室外和室内场景的无缝切换,最好的做法不是用多个版本的场景管理器,而是用一个,当然这个管理器可以综合几个算法的优点。所以如果像ogre一样把不同的管理器做成不同的插件,在游戏运行时,场景管理器是不能进行切换的。我已经写了包围体的生成,准备Octree来组织结构,也可以用Octree来对外部的地形进行处理;在室内,Octree也比较适合,不过如果能加上pvs和portal会更好一些。。。。
原文地址:https://www.cnblogs.com/decode1234/p/9396569.html