场景管理技术:KDTREE+遮挡剔除

来源:互联网 发布:plc编程工具 编辑:程序博客网 时间:2024/05/01 15:22

一.场景加速算法分类

当前主流的场景加速算法主要有这样几个大类:

1.视域剔除:指的是将场景中在观察区域以外的多边形或物体在提交到渲染管线之前就剔除掉,从而可以大幅减少渲染他们的开销。

2.遮挡剔除:指的是将场景中完全被别的物体遮挡住的多边形或物体在提交到渲染管线之前就剔除掉,从而可以大幅减少渲染他们的开销。

3.LOD:为某个物体建立一系列不同精度的模型,在实际渲染的时候根据一定的规则选择合适精度的模型去渲染。从而降低整个系统的多边形数,而不会对视觉效果产生太大影响。
二.KDTREE-场景二叉分割
1.KDTREE(Adaptive Binary Tree)的好处:
相对与QuadTree / OCTree:更能适应不同密度的模型。 QuadTree / OCTree使用固定大小的格子分割空间,这样会使树的深度增加。对于一些没有模型的空间同样占用结点,造成浪费。
相对于BSP:区别仅在于分割的方式和结束条件,分割后的使用和BSP完全相同。由于分割结束的条件不要求形成凸多边形,能够自由确定用于渲染的叶节点的多边形数量。能够生成适合新一代图形硬件的场景组织结构。BSP的非叶结点保存分割面,该面用于渲染。这样就无法使用BSP做动态场景。使用模型中的面作为分割面,这样会给算法带来一定的不确定性。
 2.算法描述:

1.在模型最长轴的中点处建立分割面。对场景模型进行空间分割,根据分割后的叶子节点大小判断是否停止分割。当叶子节点的多边形数大于一个给定的阀值之后则停止分割,否则继续分割直到叶子大小过小或树的深度过大时停止。最后根据分割的次序组织成二叉树结构。
2.自上而下进行视阈剔除。若父节点被剔除则其子节点全部被剔除。
下面各图显示了场景分割前后的对比,以及分割情况描述:

分割之前,平均侦速率为11fps
场景分割之后的块分布:在模型密度高的地方分快密集,模型密度低的地方分块较稀疏。(注意此时的fps值没有参考价值,因为涉及到大量线框的绘制)
密集区域的划分情况
分割后,场景的渲染效率得到了明显提升,某些情况下可达120fps。提升幅度和当前视域范围有关。
三.基于硬件遮挡查询(HardWare_Occlusion_Query)的遮挡剔除算法
1.各种遮挡剔除算法优缺点分析
适合室内场景使用的遮挡剔除技术:
Cell-based occlusion culling :
1.Portals:All portals in the viewing cell are tested against the view frustum planes and accepted, discarded, or clipped as necessary.
优点:无预处理,动态场景
缺点:实时的入口运算耗费大量CPU
2.BSP+PVS:For every cell in the world, the engine finds all the other cells that are potentially visible from the cell, from any point in the cell
优点:高效的入口运算,可靠的计算结果
缺点:复杂的预处理过程可能需要人工干涉,计算结果相对保守,静态场景
3.基于硬件遮挡查询的算法:
Hardware Occlusion Queries
优点:基于硬件—快,直接交给GPU计算得出物体的像素是否在场景中,可以实现快速且健壮的算法
缺点:即便是通过GPU完成相关运算,开销仍然十分可观。需要进行优化。
本节将详细介绍硬件遮挡查询的使用以及优化策略。
如同上面提到的,通过硬件遮挡查询,我们能够直接获得所提交的物体是否被绘制到场景中。从而得知物体是否被遮挡(被遮挡的物体是不会出现在场景中的)。如果直接提交整个物体mesh,遮挡查询的开销显然太大了。我们只要提交物体的AABB(轴向包围盒)即可,这样仍然可以保证算法是“保守”的。包围盒越接近于物体效率就会越高。另外,使用一个小的渲染目标(如320*240)可以明显加快速度,同时基本不会产生任何副面效果。但是,仅仅是使用AABB和小渲染目标,遮挡查询的开销仍然十分巨大。为此我们还需要进一步对遮挡查询的执行序列进行优化:
下图是优化前CPU和GPU的执行情况:
从上图我们可以看出:虽然硬件遮挡查询操作本身十分耗时,但是进行遮挡查询时只有GPU在高负荷工作,CPU在提交查询之后就处于闲置状态。因此需要将提交查询和获得查询结果之间的时间间隔尽可能的充分利用。
下图是经过优化后的执行序列:

 
从上图我们可以看出:
原先用于等待查询结果的时间被用于提交其他查询,在GPU进行遮挡运算的同时CPU并没有空闲等待,而是进行其他工作。
为了进一步提高遮挡查询效率,还可以在提交查询之后进行各类其他运算,如AI,物理等等。
原创粉丝点击