本文从地图操作和要素可见性入手分析地图简化的影响因素,并基于分析的结果设计相应的缓存结构以加速地图的渲染。研究GPU环境下梯形格网的高效LOD方法,探讨简化前后节点的重组和显存中EBO数据的更新方法,最终提出一种基于三维GIS技术的矢量地图动态LOD渲染方法。
1 简化的影响因素
1.1 地图操作对简化的影响
本文方法依据视点进行简化,当要素与视点的位置发生变化时进行实时简化操作。用户进行地图操作时,当视点与要素的距离发生变化时进行简化,不发生变化时则可以使用缓存数据进行绘制,从而加快渲染。因此,需要讨论地图操作导致的视点与要素的距离变化情况。
(1)平移操作
平移操作可能会导致视点与要素的距离发生变化。在非俯仰状态下,平移操作不会导致视点与要素的距离发生变化;在俯仰状态下,平移操作会导致视点与要素的距离发生变化。
平移操作示意图
(2)旋转
旋转操作可能会导致视点与要素的距离发生变化。非俯仰状态下,旋转操作不会导致视点与要素的距离发生变化;俯仰状态下,旋转操作会导致视点与要素的距离发生变化。
旋转操作示意图
(3)放缩操作
放缩操作会导致视点与要素的距离发生变化。
放缩操作示意图
(4)俯仰
俯仰操作会导致视点与要素的距离发生变化。
俯仰操作示意图
综上分析可知,在非俯仰状态下,地图平移操作和旋转操作不会改变要素距视点的距离,可以使用上一帧的地图缓存进行绘制,加快其渲染速度;针对俯仰角度较低,平移及旋转操作对简化的影响不大,也可以使用上一帧数据进行绘制。而针对俯仰和缩放操作,要素的权重受视点的影响,需要进行简化操作,如下表所示。
1.2要素可见性对简化的影响
静态LOD方法不需要对地图进行实时简化,直接使用简化后的缓存数据进行绘制,极小比例尺下要素被极度简化使得其顶点数据较少,因此要素极小情况下进行绘制对静态LOD方法绘制效率的影响不明显。而动态简化方式需要对视口内的所有要素进行简化,简化操作的效率对要素数量极其敏感,参与简化的要素越多则简化时间越长,当要素极小时会导致不必要的简化操作造成绘制效率低下。因此,在保证绘制结果的基础上应尽可能的减少参与动态简化的要素。
比例尺的变化会导致几何要素的呈现状态发生改变,当比例尺极小时人眼无法在屏幕上识别部分几何要素,这些要素绘制与否对绘制效果不会产生太大影响。依据传统LOD方法的绘制策略,要素只要在视口范围内就需要被展示,本文针对要素呈现状态设定可见性阈值,当要素呈现的像素大小小于阈值时不再进行绘制,从而减少参与动态简化的要素数据,提升地图绘制的效率。
可见性阈值相关的绘制效果图
2基于梯形格网的矢量地图LOD方法
2.1梯形格网的LOD方法
本文依据梯形的剖分顺序采用顺序表存储梯形,依据节点权重采用顺序链表存储原始节点序列。在梯形简化的过程中,链表游标存储了当前的简化状态。若下一次地图操作后,简化容差小于链表游标当前容差,则链表向上查询,进行简化操作;若下一次地图操作后,简化容差大于链表游标当前容差,则链表向下查询,进行还原操作。通过要素简化状态(即链表游标)的存储,避免了全局搜索从而加快了简化速度。如下图所示,当前游标为Pcursor,位于节点权重链表Pn+1处,若Pcursor小于Pn+1容差,则向上搜索基于当前梯形格网进行简化操作;若Pcursor不小于Pn+1容差,则向下搜索基于当前梯形格网进行还原操作。
2.2基于GPU的EBO数据更新方法
基于梯形格网的简化算法可知,图形简化后梯形网中的梯形数目或梯形节点位置会发生变化。本文首先通过空间索引检索范围内的对象,依据梯形格网的简化算法对梯形格网进行简化。通过遍历简化后的梯形格网的梯形,获取梯形的状态和节点的索引编号,从上至下进行梯形格网的重组,最终完成显存中EBO数据的更新。以下,本文从缓存方案和梯形格网的EBO数据更新方法进行介绍。
(1)顶点存储方案设计
GPU中采用顶点缓存对象VBO(Vertex Buffer Object)存储顶点数据,采用索引缓存对象EBO存储索引数据。本文设计了多缓存对象存储和单缓存对象存储两种存储方案用以实现对节点数据和节点索引数据的存储。多缓存对象存储方案针对每一个矢量几何要素创建一个VBO和一个EBO,单缓存对象存储方案将图层的节点数据存储于一个VBO中,将图层的索引数据存储于一个EBO中。
多缓存对象存储方案将单个要素的节点索引数据存储于一个EBO对象,则要素索引编号不受其他要素的影响,从0开始编号。多缓存对象存储,当某些要素不进行简化时易于使用缓存对象,绘制过程中具有大量的缓存对象绑定、解绑与绘制操作,导致整体绘制效率的相对低下,其存储结构如下图所示。
单缓存对象存储方案将同一个图层的所有节点统一存储于一个VBO对象中,将所有的索引统一存储在一个EBO对象中,要素与要素之间的索引需要进行偏移。单缓存对象存储方案当地图不发生简化时增加了缓存可重用性,绘制过程中只存在一次的绑定、解绑和绘制操作,绘制效率较高。但若图层中某些要素发生渐进,EBO数据需要被重构,其存储结构如下图所示。
(2)要素的梯形格网索引更新
当用户进行地图操作时,要素可能由某一状态转换至另一状态。依据梯形格网的简化算法可知,梯形格网的简化通过梯形或梯形之间的合并,调整,退化,消融操作来完成,简化操作的本质是对梯形格网的节点进行重组避免了传统方法中数据的重复剖分,只需对梯形中节点索引数组进行更新从而完成EBO数据的更新,不需要进行顶点数据的传输与缓存对象的创建,降低了显存IO的时间,提高了渲染的效率。
针对线梯形格网,当以斜角连接样式渐进时,直接进行梯形合并;当以平角连接或圆角连接进行渐进时,需要考虑平角连接产生的三角形或圆角连接产生的三角扇,索引的偏移量需要考虑平角连接产生三角形顶点数目或圆角连接产生的扇节点的数目,如下图所示。
针对面梯形格网,如下图一所示:P1至P11为原始节点,Pm至Pm+8为梯形剖分产生节点。如下图一示例梯形格网简化前后部分梯形发生了合并操作,通过遍历梯形顺序表梯形判断其可见性,并获取梯形节点的索引号以重构索引数组,最终进行EBO的更新。简化后的结果下图一所示,简化前后数据变化如下图二所示。
图一 面梯形格网简化示意图
图二 面梯形格网索引更新示意图
可见,本文方法更新前后不需要进行顶点的再次传输,VBO数据不变,只需对EBO数据进行更新即可完成简化前后的梯形格网数据更新,减少了绘制过程中显存IO阶段的时间消耗,加速了渲染。
3基于GPU的矢量地图LOD渲染方法
3.1基于梯形格网的矢量地图LOD绘制流程
针对传统LOD方法,简化与剖分分离的问题,本文设计了基于梯形格网矢量地图LOD绘制流程。数据初次加载时完成数据的剖分、权重的计算、梯形格网的构建和顶点数据的传输。在地图渲染的过程中,依据不同的地图操作判断地图或要素是否需要进行简化,针对部分情况下地图不需要重新绘制或要素无需简化,设计地图或要素的缓存,直接使用上一帧的数据进行绘制,从而加快渲染速度。当地图需要进行简化时使用梯形格网进行快速的简化操作,此过程不进行剖分和顶点传输,只需更新EBO数据及绘制即可完成对地图的渲染,加快了地图的渲染速度。如下图所示。
3.2图层缓存及要素缓存的设计
依据上述的分析可知,针对地图操作,当非俯仰情况和俯仰情况较低下,平移及旋转操作不发生地图的简化,因此可以使用上一帧的缓存数据直接进行绘制,提高其渲染速度。以下,分别设计图层缓存LayerCache结构和要素缓存Segment结构以提高地图的渲染速度。
(1)要素缓存Segment结构设计
要素缓存存储索引数据,包含此要素的顶点起始位置、索引起始位置、顶点数量和索引的数量和索引数组。若此要素不发生简化直接使用要素缓存的索引数据用以重构图层缓存,通过使用要素缓存加快渲染的速度,要素结构如下图所示。
(2)图层缓存结构设计
本文设计图层缓存存储地图图层的节点数据与索引数据。图层缓存包含多个Segment,图层没有被简化时直接使用缓存进行绘制,当部分要素需要被简化只需将简化的要素进行更新,使用缓存可以加快地图渲染速度,图层缓存结构如下图所示。
4结语
本文在梯形格网的基础上,基于GPU环境设计了矢量地图动态LOD渲染方法。首先通过分析地图简化的影响因素探究地图操作对地图简化的影响。之后,选择合适的阈值对要素进行过滤,进而介绍了梯形格网的LOD策略和简化前后EBO数据更新方法。最终,提出了基于梯形格网的矢量地图动态LOD渲染方法。
原文来自:http://www.ztmapinfo.com/blog/index.php/article/37.html