首页 / 专利库 / 电脑图像 / 视锥体裁剪 / 面向GPU的大规模地形快速绘制方法

面向GPU的大规模地形快速绘制方法

阅读:154发布:2020-06-21

专利汇可以提供面向GPU的大规模地形快速绘制方法专利检索,专利查询,专利分析的服务。并且本 发明 提供一种面向GPU的大规模地形快速绘制方法,包括:生成原始地形的外存文件;其中,外存文件中存储有包含原始地形数据的多个地形 块 、每个地形块的索引编号以及与地形块相对应的压缩纹理块,地形数据包括纹理数据和高程数据;根据预设视点参数确定地形的LOD层次分布,建立地形四叉树结构,遍历地形四叉树结构为不同的LOD层次细节选择相应的四叉树 节点 ,将选中的四叉树节点添加到 渲染 调度队列;其中,地形四叉树结构的各个节点对应于外存文件中的相应压缩地形块,用于存储相应压缩地形块的LOD层次及高程数据;从渲染调度队列获取将被调度的节点,并对将被高度的节点进行渲染,完成对原始地形的绘制。,下面是面向GPU的大规模地形快速绘制方法专利的具体信息内容。

1.一种面向GPU的大规模地形快速绘制方法,其特征在于包括以下步骤:
S1、生成原始地形的外存文件;其中,所述外存文件中存储有包含原始地形数据的多个地形、每个所述地形块的索引编号以及与所述地形块相对应的压缩纹理块,所述地形数据包括纹理数据和高程数据;
S2、根据预设视点参数确定地形的LOD层次分布,建立地形四叉树结构,遍历所述地形四叉树结构为不同的LOD层次细节选择相应的四叉树节点,将选中的四叉树节点添加到渲染调度队列;其中,所述地形四叉树结构的各个节点对应于所述外存文件中的相应压缩地形块,用于存储相应压缩地形块的LOD层次及高程数据;
S3、从所述渲染调度队列获取将被调度的节点,并对所述将被高度的节点进行渲染,完成对原始地形的绘制。
2.根据权利要求1所述的面向GPU的大规模地形快速绘制方法,其特征在于所述S1包括以下步骤:
获取原始地形的高程数据和纹理数据,并将所述原始地形的高程数据和纹理数据进行分层分块处理,得到多个大小相同的地形块及与所述地形块相对应的纹理块;
对所述纹理块进行压缩,得到压缩纹理块,并为所述地形块构建相应的索引编号;
将所有所述地形块及与每个地形块相应的索引编号、压缩纹理块存储于一文件中,得到外存文件。
3.根据权利要求1或2所述的面向GPU的大规模地形快速绘制方法,其特征在于所述S3中对所述将被调度的节点进行渲染,完成对原始地形的绘制的步骤包括以下步骤:
根据所述将被调度的节点获取相应地形块的地形数据;
将所述地形块的高程数据作为顶点纹理载入显存,由固定的顶点缓存和索引缓存建立地形的平面网格模型
利用顶点着色器的顶点纹理拾取功能获取地形网格的高程值,设置消除裂缝、跳跃现象的过渡带,并进行顶点变换和片元处理,最终实现绘制。
4.根据权利要求2所述的面向GPU的大规模地形快速绘制方法,其特征在于所述S1采用的分层方法为:采用隔行隔列法对所述原始地形的高程数据进行重采样、采用双线性插值法对所述原始地形的纹理数据进行重采样。
5.根据权利要求2或4所述的面向GPU的大规模地形快速绘制方法,其特征在于:所述S1压缩所述初始地形块的纹理数据时采用的压缩算法为采用DXT算法。
6.根据权利要求1所述的面向GPU的大规模地形快速绘制方法,其特征在于在所述S2的LOD层次分布中:当视距增加一倍时,LOD级别降低一级。
7.根据权利要求1所述的面向GPU的大规模地形快速绘制方法,其特征在于所述S2在遍历所述地形四叉树结构为不同的LOD层次细节选择相应的四叉树节点的同时还执行下述步骤:对所述地形四叉树结构进行视锥体裁剪。
8.根据权利要求7所述的面向GPU的大规模地形快速绘制方法,其特征在于所述对所述地形四叉树结构进行视锥体裁剪具体为:对当前四叉树节点的包围盒与视锥体进行相交测试,完成快速视锥体裁剪。

说明书全文

面向GPU的大规模地形快速绘制方法

技术领域

[0001] 本发明涉及计算机图形学领域,尤其涉及一种面向GPU的大规模地形快速绘制方法。

背景技术

[0002] 地形是自然界中最常见的景物,它与人们的生活密切相关。三维地形绘制技术一直都是计算机图形学的研究热点,近年来,它的发展与进步对国民经济的各个方面产生了重大影响,推动着信息时代的不断向前发展。
[0003] 随着摄影测量和卫星遥感技术的快速发展,人们可以得到的地形数据精度越来越高,随之而来的是急剧增加的地形数据量,而对于计算机硬件来说,虽然在同一时期也经历了快速发展的阶段,但是与无限增长的地形数据量相比,硬件的发展总是显得比较滞后,在一定的频下,计算机硬件每秒只能绘制有限数量的三形面片,这便造成了有限的计算机硬件平同海量地形数据之间的矛盾,因此对大规模地形进行高精度的绘制往往难以获得令人满意的绘制效率。
[0004] 一种有效提升地形绘制效率的方法是降低地形模型的精度,即采用一种精度较低的模型表示同一区域的地形进而实现绘制,层次细节(LOD)技术正是出于这样的考虑,通过简化整个场景的复杂度,减少参与绘制的数据量,缓解绘制精度和绘制效率之间的矛盾。另一种提高绘制效率的方法是外存(out-of-core)技术,由于地形数据规模很大,无法一次性将其载入内存,考虑对外存数据重新组织存于硬盘,在绘制时根据需要,将其部分载入,当然这就要求找到一种数据调度策略,目前主要采用的调度策略是通过建立索引来快速定位所需的数据,然后将它载入内存的。国内外学者在大规模地形绘制的研究上,取得了大量的研究成果,同时也提出了许多优秀的解决方案,但是由于人们对绘制精度和绘制效率二者的要求都很高,现有的解决方案都不能完美地二者兼顾。

发明内容

[0005] 本发明主要解决的技术问题是提供一种面向GPU的大规模地形快速绘制方法。用以解决现有技术的诸多不足。
[0006] 为解决上述问题,本发明采用的一种技术方案是:提供一种面向GPU的大规模地形快速绘制方法,包括以下步骤:
[0007] S1、生成原始地形的外存文件;其中,所述外存文件中存储有包含原始地形数据的多个地形块、每个所述地形块的索引编号以及与所述地形块相对应的压缩纹理块,所述地形数据包括纹理数据和高程数据;
[0008] S2、根据预设视点参数确定地形的LOD层次分布,建立地形四叉树结构,遍历所述地形四叉树结构为不同的LOD层次细节选择相应的四叉树节点,将选中的四叉树节点添加到渲染调度队列;其中,所述地形四叉树结构的各个节点对应于所述外存文件中的相应压缩地形块,用于存储相应压缩地形块的LOD层次及高程数据;
[0009] S3、从所述渲染调度队列获取将被调度的节点,并对所述将被高度的节点进行渲染,完成对原始地形的绘制。
[0010] 其中,所述S1包括以下步骤:
[0011] 获取原始地形的高程数据和纹理数据,并将所述原始地形的高程数据和纹理数据进行分层分块处理,得到多个大小相同的地形块及与所述地形块相对应的纹理块;
[0012] 对所述纹理块进行压缩,得到压缩纹理块,并为所述地形块构建相应的索引编号;
[0013] 将所有所述地形块及与每个地形块相应的索引编号、压缩纹理块存储于一文件中,得到外存文件。
[0014] 其中,所述S3中对所述将被调度的节点进行渲染,,完成对原始地形的绘制的步骤包括以下步骤:
[0015] 根据所述将被调度的节点获取相应地形块的地形数据;
[0016] 将所述地形块的高程数据作为顶点纹理载入显存,由固定的顶点缓存和索引缓存建立地形的平面网格模型
[0017] 利用顶点着色器的顶点纹理拾取功能获取地形网格的高程值,设置消除裂缝、跳跃现象的过渡带,并进行顶点变换和片元处理,最终实现绘制。
[0018] 进一步的,所述S1采用的分层方法为:采用隔行隔列法对所述原始地形的高程数据进行重采样、采用双线性插值法对所述原始地形的纹理数据进行重采样。
[0019] 在上述实施方式中,所述S1压缩所述初始地形块的纹理数据时采用的压缩算法为采用DXT算法。
[0020] 在本技术方案中,在所述S2的LOD层次分布中:当视距增加一倍时,LOD级别降低一级。
[0021] 进一步的,所述S2在遍历所述地形四叉树结构为不同的LOD层次细节选择相应的四叉树节点的同时还执行下述步骤:对所述地形四叉树结构进行视锥体裁剪。
[0022] 在上述具体的实施方式中,所述对所述地形四叉树结构进行视锥体裁剪具体为:对当前四叉树节点的包围盒与视锥体进行相交测试,完成快速视锥体裁剪。
[0023] 本发明的有益效果是:区别于现有技术不能够有效提升地形绘制效率,本发明提供一种面向GPU的大规模地形快速绘制方法,通过结合out-of-core技术、LOD技术、可见性裁剪技术以及GPU加速技术,能够有效地提高数据调度的效率,充分地发挥GPU的可编程性和加速能,减轻CPU运算负担,增加每秒可绘制三角形的数量,同时获得很高的帧率,提高大规模地形绘制的效率。附图说明
[0024] 图1是一实施方式中面向GPU的大规模地形快速绘制方法的流程图
[0025] 图2是另一实施方式中面向GPU的大规模地形快速绘制方法的流程图;
[0026] 图3是一实施方式中文件存储结构示意图;
[0027] 图4是一实施方式中三角形条带化方式;
[0028] 图5是一实施方式中顶点几何过渡原理图;
[0029] 图6是一实施方式中地形块过渡带设置示意图。

具体实施方式

[0030] 为详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。
[0031] 请参阅图1,本实施方式提供一种面向GPU的大规模地形快速绘制方法,包括以下步骤:
[0032] S1、生成原始地形的外存文件;其中,所述外存文件中存储有包含原始地形数据的多个地形块、每个所述地形块的索引编号以及与所述地形块相对应的压缩纹理块,所述地形数据包括纹理数据和高程数据;
[0033] S2、根据预设视点参数确定地形的LOD层次分布,建立地形四叉树结构,遍历所述地形四叉树结构为不同的LOD层次细节选择相应的四叉树节点,将选中的四叉树节点添加到渲染调度队列;其中,所述地形四叉树结构的各个节点对应于所述外存文件中的相应压缩地形块,用于存储相应压缩地形块的LOD层次及高程数据;
[0034] S3、从所述渲染调度队列获取将被调度的节点,并对所述将被高度的节点进行渲染,完成对原始地形的绘制。
[0035] 在如图2所示的实施方式中,所述S1包括步骤S110、S120以及S130,具体如下文所述。
[0036] S110、获取原始地形的高程数据和纹理数据,并将所述原始地形的高程数据和纹理数据进行分层分块处理,得到多个大小相同的地形块及与所述地形块相对应的纹理块。
[0037] 在本实施方式中,对于分层处理过程,本方法采用隔行隔列法对所述原始地形的高程数据进行重采样,这样可以保证在相同地理位置的点的高程值保持不变,且可以重复使用高程值;采用双线性插值法对所述原始地形的纹理数据进行重采样,这样对局部细节保存较好。在本领域中,对于分块处理过程,分块的规则主要有两种:等间距分块和等面积分块,由于等间距划分方法简单,检索速度快,本方法采用等间距分块。在本发明中,分块的大小没有具体的计算公式,需要根据绘制需要和硬件条件综合考虑。在本实施方式中,分块操作是从原始数据的左下角开始,按从左到右,从下到上的顺序进行,对于最右侧和顶部的边缘数据块,由于它们不能构成一个正方形块,就以空数据补齐。在其他实施方式中,分块操作的顺序可从原始数据的左上角开始,按从左到右、从上到下的顺序进行。在另外的实施方式中,分块操作的顺序可根据实际情况具体设定。
[0038] S120、对所述纹理块进行压缩,得到压缩纹理块,并为所述地形块构建相应的索引编号。
[0039] 与高程数据相比,纹理数据量相对较大,在分层分块处理后会占用较多的外存空间,且纹理越精细,所占用的存储空间就越大,在纹理数据传输时,还会占用较多带宽,因此本方法对纹理进行合理地压缩。纹理压缩的方法有很多种,在本实施方式中,纹理压缩时采用的压缩算法为DXT(DirectX Texture Compress)。DXT分为五种压缩格式:DXT1、DXT2、DXT3、DXT4和DXT5,其中DXT1格式的压缩比为6:1,适用于不带Alpha分量的纹理。在本实施方式中,选用DXT1作为纹理压缩的最终格式,应用于Direct3D生成压缩纹理块。
[0040] 由于每一个地形块可以由LOD级别、行编号和列编号唯一表示,所以对数据的编码也只需要考虑这三个因素。在本实施方式中,本方法采用UINT32型整数来构建地形块的索引编码,其形式为(DataType(1),BlockLevel(5),BlockX(13),BlockY(13)),即第1位记录数据类型(高程数据或纹理数据),第2位到第6位记录LOD级别,第7位到第19位记录行编号,最后13位记录列编号。
[0041] S130、将所有所述地形块及与每个地形块相应的索引编号、压缩纹理块存储于一文件中,得到外存文件。
[0042] 在本实施方式中,以文件形式存储所有的地形块数据,如图3所示,文件分为文件头区、块索引区和块数据区。其中文件头区包含了对原始地形的地理信息描述、地形分层数、每层的纵横向地形块个数等信息。块索引区包含所有地形块的索引信息,记录了每个地形块在文件中的偏移量(以字节为单位)、数据块的大小(以字节为单位),即该块在地形文件中的起始位置和长度。在块数据区中,地形块的元数据包括地形块编码、地形块表示地理范围等信息。
[0043] 在上述实施方式中,S2步骤主要包括步骤S210、S220、S230,具体如下文所述。
[0044] S210、根据预设视点参数确定地形的LOD层次分布。
[0045] 其具体过程如下:将视点与节点间的距离作为确定LOD分布的标准,设地形LOD层次数为n,第0层为最精细层,第n-1层为最粗糙层,构造地形的连续多分辨率模型时,以视点为中心,离视点较近的区域选用较精细层的节点表示,而离视点较远的区域选用较粗糙层的节点表示。具体地,视距在l0以内的区域选择第0层节点表示,视距在l0和l之间的区域选择第1层节点表示,以此类推,视距在li-1和li之间的区域选择第i层节点表示,且满足li=2·li-1(l≤i≤n-1),其中ln-1为最大可视距离,是一个可调节参数,它的大小直接影响到整个地形总体的层次分布情况。进一步的,当视距增加一倍时,LOD级别降低一级。
[0046] S220、建立地形四叉树结构。
[0047] 其具体过程如下:四叉树结构由地形高程图信息生成,树的深度由地形的精度确定,它同地形的LOD层次数相对应。在本实施方式中,四叉树结构的节点只保存每个节点的最大和最小高程值,用于计算节点的AABB包围盒,节点的其他数据可以在遍历四叉树结构时动态获取。四叉树结构一旦建立,绘制期间便常驻内存,如果原始地形数据没有发生变化它就不会改变。
[0048] S230、遍历所述地形四叉树结构为不同的LOD层次细节选择相应的四叉树节点,将选中的四叉树节点添加到渲染调度队列。
[0049] 上述过程具体如下:从四叉树结构的根节点开始,也就是最低细节层次的节点,遍历四叉树为不同的细节层次选择相应的四叉树节点。对于第i层的节点,判断其包围盒与以视点为中心,li为半径的球体与之间的位置关系,如果包围体完全在球体之外,则退出对此节点的判断,用其父节点代替它,将父节点加入到渲染调度队列中,并继续对其父节点的其他子节点进行判断;如果球体和包围体相交或包含,再进一步判断以视点为中心,li-1为半径的球体与包围体之间的位置关系,如果包围体完全在球体之外,则将此节点加入到渲染调度队列中,否则对其子节点作判断,递归重复此过程。
[0050] 进一步的,在上述实施方式的某些实施例中,在遍历四叉树结构的同时,还会执行对所述地形四叉树结构进行视锥体裁剪的步骤。具体的实施过程如下:通过确定包围盒与视锥体的位置关系即可确定节点的可见性,也就是对当前四叉树节点的包围盒与视锥体进行相交测试,进而完成视锥体裁剪。在一实施例中,通过判断包围盒的八个顶点同视锥体的六个裁剪平面之间的位置关系来实现视锥体裁剪。
[0051] 在上述实施方式中,所述S3中对所述将被调度的节点进行渲染,完成对原始地形的绘制的步骤包括步骤S310、S320、S330,具体如下文所述。
[0052] S310、根据所述将被调度的节点获取相应地形块的地形数据。
[0053] 此为对上述选中节点的调度过程,具体如下:以地形块为单位进行数据调度,预先开辟一个缓冲区用于接收地形块的数据信息,并设置一个渲染队列和一个缓冲区队列,采用LRU(Least Recently Used)方式管理缓冲区中的地形数据,具体描述如下:
[0054] (1)把文件头区的部分信息、地形块索引区和地形块元数据读入内存,同时建立映射std::map BlockMap,以地形块编码作为键值,以地形块对象作为映射数据类型;
[0055] (2)将确定需要渲染的地形块加入到渲染队列中;
[0056] (3)遍历渲染队列,提取队列中的每一个地形块编码,对每一个地形块查找其编码是否存在于缓冲区队列中,如果缓冲区队列中存在其编码,通过编码值在BlockMap映射中获取相对应的地形块对象,并将地形块的引用次数状态量加1,同时将该地形块的编码置为-1;如果在缓冲区队列未找到其编码,则执行下面的步骤以载入地形块数据:
[0057] (3a)根据地形块的编码,解算出该地形块对应的LOD级别,行编号,列编号;
[0058] (3b)计算地形块索引在索引文件中的具体位置,通过地形块的索引获得地形块在文件中的偏移量和地形块的大小;
[0059] (3c)利用地形块的编码、高程数据和纹理数据等信息构建地形块对象Block,并将Block对象加入到映射BlockMap中。
[0060] 在渲染队列遍历完成之后,执行下面的步骤以更新缓冲区:
[0061] (A)遍历缓冲区队列,在缓冲区队列中,如果地形块编码值大于0,则将其删除,释放地形块对象内存空间,并在映射中删除键值为该编码的元素,最后删除在缓冲区队列中的该编码元素。对于缓冲区队列中编码值小于0的地形块,根据其引用次数,决定是否将其删除,对于引用次数最少的地形块优先考虑将其释放;
[0062] (B)将渲染队列中存在而缓冲区队列中不存在的地形块编码插入到缓冲区队列中,这些编码将作为下一帧的缓冲区队列的一部分。
[0063] S320、将所述地形块的高程数据作为顶点纹理载入显存,由固定的顶点缓存和索引缓存建立地形的平面网格模型。
[0064] 将地形高程数据载入显存的纹理缓冲区作为顶点纹理,在本方法中调用IDirect3DDevice9::CreateTexture方法生成顶点纹理。进一步的,为了减少绘制函数调用的次数,我们将模型的网格转化为三角形条带,以叶子节点大小的规则块为单位按三角形条带的形式实现渲染,如图4所示为5×5大小的地形块三角形条带遍历方式和对应的顺序索引列表。
[0065] 由于所有地形块具有相同的拓扑结构和相同数量的顶点,且顶点的位置是在GPU中进行计算,为了进一步提高GPU的数据传输效率,所有地形块可以使用一个固定的顶点和索引缓存,每个地形块对应一组缩放和偏移参数,用于确定地形块所表示的实际范围以及在整个地形区域中的具体位置。同时,地形块的内部也可以采用同样的顶点连接方式,于是任意地形块网格均可通过固定的索引序列生成具有规定顶点连接关系的三角形网,进而实现地形块的渲染。
[0066] S330、利用顶点着色器的顶点纹理拾取功能获取地形网格的高程值,设置消除裂缝、跳跃现象的过渡带,并进行顶点变换和片元处理,最终实现绘制。如图5所示,V1和V0分别为在两个相邻层次中对应于相同平面坐标的顶点,在两个层次切换过程中,利用过渡权值α使顶点在V1和V0间插值过渡,过渡过程中任意时刻的顶点位置V可表示为:V=V1-α·(V1-V0)。
[0067] 在地形块中,处于不同区域内的顶点,其过渡权值α的作用也是不相同的,处于地形块边界处的顶点,其α用来保证地形块间的无缝连接,而处于地形块内部的顶点,其α用来保证LOD层次间的平滑过渡。
[0068] 在地形块的边界处设置一个过渡带H,如图6所示,平面坐标v处的顶点在某一时刻t的过渡权值α(t,v)可以由下式确定:
[0069]
[0070] 式中h为过渡带的宽度,dist为平面坐标v到过渡带内边界的距离,αt为时间过渡权值,αs为外边界处的空间过渡权值。
[0071] 对于时间过渡权值αt,以整个地形块为单位进行计算,为了简化运算,忽略时间参数对αt的影响,仅选取地形块与视点间的距离参数来求取αt,则
[0072] αt=min(max((D-Dmin)/(Dmax-Dmin),0),1)
[0073] 式中D为地形块包围盒与视点之间的最近距离,Dmin和Dmax为该细节层次的地形块参与构网的两个极限距离。
[0074] 对于空间过渡权值αs,首先考察四个相邻地形块的层次级别,如果层次级别相同,则设置对应外边界的空间过渡权值αs为0,即当前块的在外边界处的顶点位置不变,如果相邻地形块的级别小于当前块的级别,则设置对应外边界的空间过渡权值αs为1,保证此边界处的顶点位置和相邻较粗糙层相同,从而有效地避免了裂缝现象。
[0075] 综上所述,区别于现有技术不能够有效提升地形绘制效率,本发明提供一种面向GPU的大规模地形快速绘制方法,通过结合out-of-core技术、LOD技术、可见性裁剪技术以及GPU加速技术,能够有效地提高数据调度的效率,充分地发挥GPU的可编程性和加速能力,减轻CPU运算负担,增加每秒可绘制三角形的数量,同时获得很高的帧率,提高大规模地形绘制的效率。
[0076] 以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈