杨秋月 张 侃 王江峰
(上海航空电器有限公司,上海 201101)
近年来,随着科学技术的发展,大规模三维地形场景逐渐进入大众的视野,其清晰直观的表现形式为用户提供了一种身临其境的感知体验,因此在虚拟座舱、合成视景、战场环境仿真等领域得到广泛应用。但由于该技术所涉及的数据量极其庞大,如何在保证图像质量的同时兼顾实时性依然是一个技术瓶颈。对此,国内外做了大量的相关研究,包括如何构建大规模三维地形场景模型,数据以何种形式进行组织和存储更利于数据的管理、调度;如何在不影响绘制效果的同时尽量减少绘制图元的数量以提高绘制效率;如何使用真实的纹理对地形表面进行贴图;如何设计渲染算法使显示画面满足流畅、实时的要求等,文章将对这些关键技术进行重点分析与探究。
如何构建大规模三维地形场景模型是实时绘制技术的基础,其具体的构建环节需要通过以下流程实现:首先,将海量的地形高程数据库和影像数据库进行分块、分层预处理,并把每层数据按照一定的组织形式存储在文件中;然后,采用层次细节技术为目标场景建立基于不同精度与距离的几何模型;在实际应用中,由于地形的大部分区域都在视域范围之外,这时可利用可见性剔除技术,在数据预取阶段剔除掉不可见的绘制元素,进而减少绘制的图元数量:为了获得具有高度真实感的地形场景,一般采用纹理映射技术将真实的影像数据叠加在相应的地形表面上;在场景渲染阶段,通常采用CPU/GPU 协同处理技术来提高渲染速率。
大规模三维地形场景实时绘制技术所涉及的地形数据动辄以GB 为单位,若不能科学合理地组织和存储数据,将很难达到实时绘制的水平。
对于海量三维地形数据,包括地形高程和纹理数据,目前使用最广泛的是采用地形分块结合多分辨率金字塔模型的处理方式。因为地形数据覆盖范围极大,将整块地形作为调度单位进行处理显然不现实,故在数据调度之前首先需要对地形数据进行分块。地形分块一般将原始数据按照经纬度从左到右、从下到上进行均匀分割,形成大小相等的数据子块。然后每个数据子块按照不同的分辨率进行均匀的分层,即构建多分辨率金字塔模型[1]。该模型的构建原则是:首先将原始数据,即全分辨率的地形数据作为金字塔模型的最底层,然后从下到上分辨率逐层降低,但各层所表示的地形范围大小不变,直至达到最顶层,此时分辨率达到最低,即一个数据代表一整块地形。分块建模后的地形数据按照一定的命名规则以文件形式保存,在地形绘制的过程中,根据视点的移动按需调取相应层级的地形数据块。
三维地形表面的绘制主要是通过对数据节点构建三角形面片来实现的,对于大规模的地形场景而言,构建地形表面的三角形面片数量以千万计,这对于资源有限的计算机来说负担极大,若能在不影响场景画面质量的前提下减少三角形面片的数量,将会极大地减轻计算机硬件尤其是GPU 的负担。
层次细节技术也称为LOD( Level of Detail),该技术根据地形数据节点与视点的位置关系,动态地调取不同细节层次的地形数据[2]。当视点远离数据节点时,调用细节层次较低的数据模型,模型中的三角形面片数量相对较少,画面细节较为粗糙;而当视点距离数据节点较近时,调用细节层次较高的数据模型,模型中的三角形面片数量相对较多,画面细节较为精细。
在大规模三维地形场景的绘制过程中,应用LOD 技术可提升模型数据库中三角形的利用效率,在有限的技术条件下可获得最佳的视觉效果,保证地形场景描述的科学性与有效性。
在绘制三维地形场景时,若把所有绘制元素直接提交给渲染器,将会极大增加GPU 的负担,极可能达不到实时绘制所需的渲染帧数,造成显示画面杂乱或卡滞。因此,只将可见范围内的地形块调入内存进行绘制是加快地形渲染速率的有效途径。可见性剔除技术就是通过评估一个绘制元素的可见性来快速剔除不可见元素,减少进入渲染管线的元素数量,以提高地形场景绘制速率的一种技术。
可见性剔除算法通常分为三类:视域剔除、背面剔除和遮挡剔除[3]。
视域剔除法,其核心思想是判断绘制目标是否位于视域平头四棱锥之外,倘若在四棱锥之外,则不可见而剔除。实际应用中,为简化运算通常采用场景绘制元素的包围体作为替代进行可见性评估。
背面剔除法,其核心思想是判断绘制目标是否位于与视线背离,若与视线背离,则不可见而剔除。在实际应用中,一般根据视线方向和绘制元素(主要是三角形)法向量的夹角来进行判断,若夹角大于90°,则剔除掉该元素,否则进行绘制。背面剔除法剔除掉了与视线方向背离的绘制元素,只绘制面向视点的元素,从而减少了绘制量。
遮挡剔除法,其核心思想是判断绘制元素是否被其他绘制元素遮挡,若被遮挡,则不可见而剔除。在实际应用中,一般根据视点的位置和视线的方向从前往后遍历地形场景中的所有地形,若节点包围盒完全在遮挡水平线之下,则认为该地形节点被遮挡而被剔除;否则认为可见而进行绘制。
在绘制三维地形场景时,为了获得真实感更强的视觉效果,一般采用真实的遥感影像数据作为纹理贴图。如何将平面的二维纹理图像映射到三维地形场景中是一个关键性的问题,解决该问题的技术就是纹理映射技术。
纹理映射技术的实质就是,实时地从该模型中选取分辨率与对应高程数据层次细节程度相匹配的纹理图像,即在离视点近的区域采用较高分辨率的纹理,而在离视点远的区域采用较低分辨率的纹理[4]。一般来说,分辨率的选择是与视点、地形块的位置大小和纹理的原始分辨率相关的。如果和LOD 地形简化模型中一样给纹理映射定义一个纹理误差,就能有效地实现纹理层次的选择。在大规模场景绘制中采用多分辨率纹理映射技术,既符合人眼观察事物的特征,又节约了资源,提高了绘制速度。
一般情况下,CPU 因其复杂计算方面的优势而用于处理计算任务,GPU 则因其强大的图形处理能力而用于处理图形绘制与渲染任务。但对于大规模地形场景而言,虽然对数据采取了分层分块预处理、可见性剔除及层次细节等策略,每一帧的计算量依然很大,这让CPU 不堪重负。随着GPU 硬件的发展,其高带宽和并行处理的优势使得GPU 参与计算任务成为可能[5]。采用GPU/CPU 协同处理计算任务可以大大加速场景绘制效率。具体来说,由CPU 完成将外存中的数据块调入内存的工作,并将该数据块送至GPU 显存;由GPU 完成多分辨率金字塔模型的构建,构建完成之后进行消除地形突变及裂缝等优化处理的工作;最后,由GPU 完成对地形场景的绘制和渲染。
综上所述,基于地形数据的组织与存储技术、层次细节技术、可见性剔除、纹理映射以及CPU/GPU 协同处理技术的应用,可实现大规模地形场景的高质量绘制,为研究工作提供可靠参考。相关实践经验表明,为保证地形绘制工作中远景与近景具有较高的清晰度,需要对实时绘制技术进行不断地完善与升级,这也是满足大规模地形场景模型构建有效性的关键。