面向GPU的多LOD因子的大规模场景可视化策略
张嘉华 梁成 陈利强 陈春华
newzjh@msn.com aliceliang@163.net sailmer@hotmail.com musalan@msn.com
华南理工大学计算机科学与工程学院(510640)
图 1. 多LOD因子控制的大规模地形渲染(C1=1.03,C2=19.55,C3=0.868 下山脉地区三维漫游)
摘要
伴随着计算机图形处理器,真实感图形学,虚拟现实等领域的快速发展,主流的NV30等GPU渲染吞吐量已经达到每秒渲染1.5亿个三角形,如何在地形渲染中充分地利用GPU能力呢?本文提出了一套面向GPU基于层迭四叉树下的多尺度LOD超大规模场景可视化策略。我们的策略能够提供稳定的视觉,高度的漫游流畅感和沉浸感,对于16K×16K grid Puget Sound和16K×8K grid Great canyon等场景,能够以每秒100帧以上速度漫游整个场景
关键字:
大规模场景 LOD GPU 四叉树 三角列
图 4. 澳洲大宝礁三维可视化漫游
(70400×54400 grid高分辨率Terra卫星影像)
引言
随着 “数字地球”构想的提出以及海量空间数据可视化等研究的开展,超大规模地形可视化在国家安全,高分辨率卫星、航拍、遥感影像空间数据可视化,大规模人工植物群、视景仿真、虚拟军事环境,电子沙盘等领域有着其广泛的发展空间,一直以来是计算机真实感图形学、虚拟现实、地学仿真等领域的研究热点,吸引了大量国内外学者的研究兴趣。
主要贡献:在本文中,我们提出了两级层迭泛型四叉树下的多LOD因子的超大规模场景可视化策略,它能够充分利用了GPU能力,对于Puget Sound等具有代表性的场景能够以100FPS稳定漫游,我们独立开发的World Builder 2005、World Explorer 2005、World Solution 2005展现了本文策略的效果,有效论证了我们策略的正确性,完成了多个领域的应用案例展示。下面是我们贡献的分点阐述:
l 在节点评价方面探讨了全局的LOD评价因子——摄像机移动速度,探讨了符合节点形状的静态误差评价方法 (Part4,Page11-12)
l 实验测定了每次调用渲染函数渲染的最佳三角形数目,论证了三角形带累积渲染的优势, 充分地通过Direct3D / OpenGL图形接口利用GPU (Part5,Page13-14)
l 在多分辨率地形组织方面,提出层迭泛型四叉树地形组织方法和泛型哈希表节点标记策略 (Part3,Page7-11)
l 在裂缝处理方面提出了边界样式和顶点位移的方法 (Part5,Page13-16)
C1=0.2 C1=0.4
C1=0.8 C1=1.6
本文是在我们过往对大规模场景的研究的基础上进行的,主要围绕大规模场景可视化流程组织的,伴随着论文的撰写同时我们独立开发了一整套分布式的大规模场景漫游、协同仿真平台,我们的灵感主要来源于寻找一种能够充分利用GPU的地形可视化策略,能够快速查询节点状态和属性,进行空间的拓扑索引;设计一种LOD策略,能够尽可能简化地形渲染,使地形屏幕贡献度大,人们视觉比较敏感的区域能够得到更高精度显示,减少动态细节层次改变带来的地形节点几何形状变化程度,保持视觉稳定性和漫游的流畅感和沉浸感。
我们的这套面向GPU的多LOD 评价因子的超大规模场景可视化策略具有下面这些优点:
l 多LOD评价因子
摒弃过往缺乏考虑节点几何形状的静态因子评价方法,提出适合四叉树能够通过地形起伏程度阈值控制的静态因子评价,同时引入摄像机移动速度作为评价因子,充分考虑更种因素在节点渲染过程中的屏幕贡献度和人的视觉敏感区域
l 稳定的视觉
双重帧约束(自适应的LOD帧约束和图形接口层上的帧约束),保持平滑流畅的漫游视觉
l 高的渲染吞吐量
Triangle Lists累积渲染大大降低调用渲染函数的次数,保持渲染流水线操作的尽可能连续,充分利用GPU
l 连续的索引缓冲和顶点缓冲
不同LOD级别差异的节点预定义的边界样式和顶点插值高程代替实际高程的裂缝消除方法能够有效地增加顶点缓冲和索引缓冲中连续的数据部分,加速图形渲染
l 多级地形组织
多级四叉树地形模型,既具有分块地形更新灵活的特点,又具有多分辨率LOD地形模型的多LOD因子控制的特点
l 丰富的无限级别地形细节
无限级别分形非线性自相似内插,能够提供无限的更丰富的地形细节
l 内存消耗和时间消耗动态平衡的节点标记
泛型哈希表节点标记策略,能够动态地调节哈希表控制因子,改变哈希表存储桶的大小,在节点状态标记内存消耗和时间消耗之间达到最佳平衡,
除前面引言部分外,本文由五部分组成,第一部分介绍在这个领域的过往相关工作,第二部分介绍探讨了我们的地形数据组织策略,第三部分介绍我们探讨的各种LOD评价因子,第四部分介绍我们提出的面向GPU的多分辨率LOD地形下的裂缝消除和顶点跃动消除的方法。最后介绍了我们的实验后的结论,并探讨了我们策略的应用前景。
1、相关工作
在大规模地形场景可视化和地形LOD模型问题上,过去已经有不少的工作。从网格特征考虑可分为基于非规则三角网格(Tin)和基于均匀网格(Grid)两种生成方法。从地形分层细分上考虑可以分为二叉树,四叉树,八叉树等,下面介绍几个主要的相关工作:
96年,Lindstrom等提出了连续的实时的LOD高度场方法,该方法使用规则格网,通过一个用户可以控制的屏幕空间误差阙值控制细节简化程度,使用层次四叉树从最高精度的底层自底向上(bottom-up)对整个场景地形逐步简化三角形直到达到指定控制量。该方法通过维持地形块的活动分割和只访问能够在连续的帧间改变的顶点实现帧约束,通过维持顶点拓扑关系的二叉树消除裂缝。
97年,Duchaineau等提出了ROAM实时自适应网格方法,该方法使用带有二元三角形树(BBT,binary triangle tree)基于优先级产生连续的地形网格。该方法通过两个优先级队列进行分割和合并三角形操作。一个队列负责维持具有优先级顺序的待分割三角形的列表,该队列中优先级最高的三角形首先细分,另一个队列包含具有优先级顺序的待合并的三角形列表。这使得ROAM方法具有帧约束的特点,分割和合并操作可以通过顶点渐变平滑进行。
98年,rottger等人在[Lindstrom96]的基础上,与Lindstrom等自底而上的方法不同,提出了一种基于四叉树的自顶而下的策略,该策略每帧只访问整个地形的一部分,但该方法需要分析整个地形数据[rottger 98]。该方法在裂缝处理上,通过忽略高分辨率节点边上中点顶点来消除裂缝。他们还探讨了LOD误差评价方法,具有两个评价因子,动态因子以节点到观察者的距离评价,静态因子以地形在世界空间的起伏程度来评价。对于静态因子,他们通过计算四叉树节点四条边的中点和两条斜边的中点误差最大值来计算。但是,这种取6个节点的误差最大值作为评价并没有充分考虑到节点的几何形状,缺乏理论依据,其误差评价因子只有两种,并不能充分准确地反映节点误差及其屏幕贡献度。
98年Hugues Hoppe等人在他们过往提供一种可以从任意网格增减三角形的方法[Hoppe96]的基础上通过提出了基于视向的渐进网格(VDPMs)。VDPMs提供了一个基于非规则格网(tin)的框架,能够提供更多渐进格网优化,具有处理凹陷等更为复杂的地形特征的能力,通过实时生成几何变形产生平滑的顶点分割和边折叠,通过屏幕误差来反映几何细分渐变,通过强制分块地形边界顶点不分割来处理裂缝。但是该方法具有难以支持随着地形动态改变而实时变化的网格的缺陷,需要跟踪网格的拓扑结构,难于生成和裁减。
2001年,Lindstrom和Pascucci提出了一种新的简单的容易实现的,易于内存管理和可靠的误差分析的地形LOD方法,该工作在过往许多地形可视化工作的基础上提供一个规则格网的自顶而下的框架,能够out-of-core的基于视向的大规模地形细化,支持快速的视锥剔除,三角带渲染,可选择的细化。该方法在磁盘上组织数据,通过操作系统内存映射,能够动态加载分块地形数据到物理内存。
随着近年来GPU的迅速发展,GPU的Vertex Shader和Pixel Shader图形芯片可编程能力已经日益受到重视,过往的工作诸如视锥剔除、分块映射内存等通用计算和海量数据管理在一定层面上已经可以部分移到GPU中,因此本文探讨了面向GPU的大规模场景可视化策略,提出了一些新的方法。
2、层迭泛型多分辨率LOD四叉树地形
四叉树结构可以直接地表示规则网格的数字地面模型。树中的每一个节点覆盖场景中一个2n×2n的地形区域,树的根节点表示整个地形。节点扩展时将地形沿平面上的两轴平分成四个子块,分别对应它的四个子节点依次逐层细分。
一个传统的四叉树结构可定义如下:
struct QuadtreeNode
{
QuadtreeNode *pSon[4] ; ∥4 个子结点指针
QuadtreeNode *pParent ; ∥父结点指针
∥消除拼接缝标志
Bool bCent ,bLeft ,bRight ,bTop ,bBottom;
float Error ; ∥结点覆盖区域最大误差
}
传统的四叉树模型生成时,每个节点都采样一次,从而不同的层对应不同的分辨率。建立全分辨率的四叉树对于超大规模场景来说会消耗大量内存。
2.1 两级四叉树地形组织
考虑到场景是超大规模的,本文把整个场景划分成三个层次,最顶层是World,中间是分块的Block,底层是QuadtreeNode结点。每个分块的Block是一可变的动态四叉树,每个结点类型为QuadtreeNode,而所有的Block又组成整个场景的静态全分辨率四叉树,也就是说,Block的数量跟场景大小成正比,LOD渐进简化是以Block为单位。因此,对整个超大规模场景,四叉树的设计可以分两种情况考虑:对于整个场景而言,整个场景所管理的各层Block是一棵全分辨率四叉树,以Block为单位;而对于每一个Block而言,是一个组织着大量QuadtreeNode的动态可变四叉树,以QuadtreeNode为单位。
本文提出的上述组织方式有如下优点:
1. 与过去全分辨率四叉树方法相比,可以解决了过去整个场景中大量节点的问题,在我们的整个场景中,只存在一棵管理Block的全分辨率四叉树,以及当前活动的处于视锥范围内的Block里的动态可变四叉树。那些非活动Block里的大量节点不在生成,节省了大量的内存空间。
2. 与纯动态四叉树组织方法相比,地形数据的载入更新均以Block(块)为单位,避免了每帧都需要对整棵四叉树进行更新,只对当前处于视锥范围内活动的Block分别构建可变动态四叉树。同时方便本文后面部分能够实现后台异步的块的读入和更新。
3. 对于每个Block里的动态可变四叉树,我们把采样与四叉树模型分开,在建立四叉树模型时并没有采样的操作,得到的四叉树也不存在底层限制,当四叉树节点大小比Grid格网还要小的时候,不中止节点细分,而对节点内顶点进行分形内插高程,这对于距离屏幕相当近的节点,我们仍然能够达到一定精度,不存在约束四叉树由于约束带来的局部C2- LOD因素调整失效。
2.2 上层全分辨率分块地形四叉树
对于整个场景的以Block为单位的全分辨率四叉树,我们利用.net framework 2.0新提供的泛型直接构建一泛型类Quadtree<Block>,该类实现了IEnumerable<T>接口的GetEnumerator方法,使我们能够以for each方式快速地以根-左上-右上-左下-右下的顺序遍历整棵树,隐藏了具体迭代遍历的细节,对类外而言具有非常可观的面向接口优点。每个Block没有固定的大小,只有最底层的节点负责载入和释放数据,其他节点只负责记录有关的信息。