Page 64 - 电力与能源2023年第三期
P. 64
258 王志科,等:大规模城市场景数据在 Unity 3D 中加载及渲染技术的应用
在三维场景的渲染流程中,CPU 与 GPU 间 围体,然后从根节点开始,以递归形式将这个节点
的通信会使用一个命令缓冲区,Draw Call 就是其 插入这棵树中。另一种方法则是以递归形式增大
中命令的一种,提交大量很小的 Draw Call,会造 父节点的包围体,直到这个包围体可以包含这个
成 CPU 的性能瓶颈。因此,在三维场景渲染时, 子节点为止。无论使用哪种方法,随着编辑操作
需要减少 Draw Call 的开销,避免使用大量很小的 的增多,这棵树会变得越来越不平衡,效率也会越
网格,同时避免使用过多的材质,进而提升渲染 来越低。
[4]
效率 。 3.2 二叉空间分割树
在计算机图形学中,BSP 树有两种不同的形
3 海量城市模型三维场景数据管理方法
式:轴对齐(axis-aligned)和多边形对齐(polygon-
要在三维场景中实现高效、稳定地渲染大量 aligned)。要创建 BSP 树,首先用一个平面将空间
的城市建筑、地形地貌等地理信息系统数据,需研 一分为二,然后将几何体按类别划分到这两个空
究一套有效的三维场景数据管理方法。 间中,随后以递归形式反复进行这个过程。这种
在三维场景中渲染大批量数据时,如果只是 树有一个非常有趣的特性,如果按照一定的方式
用 List 将 渲 染 对 象 存 储 ,然 后 送 入 GPU 进 行 渲 对树进行遍历,那么会从某个视点将这棵树包含
染,这种方式虽然简单,但渲染效率很低。目前比 的几何体进行排序(对于轴对齐的方式来说,它是
较好的方法是使用具有层次结构的空间数据结构 粗略的排序;对于多边形对齐方式来说,它是准确
存储待渲染的物体,如包围体层次结构(BVH)、 的排序)。
二叉空间分割(BSP)树、四叉树、八叉树和模糊 3.3 八叉树
K-D 树等,在进行空间查找时将时间复杂度从 O 八叉树类似轴对齐 BSP 树。沿着轴对齐包
[5]
(n)降低到 O(lgn) 。 围盒的 3 条轴对其进行分割,分割点必须位于包
3.1 包围体层次结构 围盒的中心点,以这种方式生成 8 个新的包围盒。
BVH 是包含一组物体的空间体,它要比所包 八叉树通过将整个场景包含在一个最小的轴对齐
含的几何物体形状简单得多,所以在使用包围体 包围盒中进行构造,递归分割,直到达到最大递归
进行碰撞检测等操作时比使用物体本身更快。常 层次或包围盒中包含的图元小于某个阈值。八叉
见的包围体有轴对齐包围盒(AABB),有向包围 树的使用方式与轴对齐 BSP 树一样,可以处理同
盒(OBB),以及离散定向多面体(k-DOP)。 类型的查询,也可以用于遮挡裁剪算法中。八叉
对于三维场景的实时渲染来说,BVH 是最常 树 具 有 规 则 的 结 构 ,有 些 查 询 会 比 BSP 树 更
使用的数据结构,例如 BVH 经常用于视椎体裁 高效。
剪。场景以层次树形结构进行组织,包含一个根 在八叉树结构中,通常将物体保存在叶子节
节点、内部节点和叶子节点。最高节点是根,没有 点中,其中有些物体必须保存在多个叶子节点中。
父节点;叶子节点保存着需要绘制的实际几何体 这种做法的一个最大弊端就是数据量增大,而如
(BVH 只能存储几何体,实际渲染的物体除了几 果使用指针,则会导致八叉树的编辑变得更加困
何属性还有其他属性,一般使用场景图表示)。树 难。松散的八叉树”算法对这个问题进行了改进。
“
中的每个节点,包括叶子节点,都有一个包围体, 海量的城市模型场景,属于大规模的室外场
可以将其子树的所有几何体包围起来。 景,场景中的物体比较分散,而且没有出现太多遮
在场景中的物体移动时,需要对 BVH 进行更 挡的情况,由于不用存储分割平面位置,使用八叉
新。如果物体移动以后仍然在原先的包围体内, 树这种规则的空间结构能够提高效率,因此在进
则不需要更新;若不在原先的包围体内,则需要删 行城市场景管理时经常使用八叉树结构进行数据
除这个物体所在节点,并重新计算其父节点的包 管理。