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 进行更                       挡的情况,由于不用存储分割平面位置,使用八叉
                新。如果物体移动以后仍然在原先的包围体内,                            树这种规则的空间结构能够提高效率,因此在进
                则不需要更新;若不在原先的包围体内,则需要删                           行城市场景管理时经常使用八叉树结构进行数据
                除这个物体所在节点,并重新计算其父节点的包                            管理。
   59   60   61   62   63   64   65   66   67   68   69