基于图形处理器加速的地形渲染方法

文档序号:6370933阅读:154来源:国知局
专利名称:基于图形处理器加速的地形渲染方法
技术领域
本发明涉及图形学领域,特别是涉及一种基于图形处理器进行三维地形渲染处理的方法。
背景技术
大规模地形渲染是虚拟自然场景中的重要组成部分,目前国内外游戏地形渲染中通常使用了基于中央处理器(CPU)的运算方法计算细节层次,虽然能够大幅降低三角形渲染数量,但缺陷是每一帧都需要更新从CPU到GPU传送的三角形数据,占用宝贵的CPU资源和总线带宽。
·
随着近年来图形算法的改进和计算机显卡性能的提高,充分利用图形处理器(GPU)性能来生成实时地形已成为可能。在图形渲染过程中不同层次过渡处会出现T型裂缝,目前现有技术中消除T型裂缝的做法主要分为跳点法和加点法,都比较繁琐复杂,并且额外增加了不少性能开销。跳点法就是在较高分辨率的分块的边界上跳过一些点不绘制,这样可以保持相邻分块的连续性。加点法就是在较低分辨率的分块边界上新增一些顶点以达到两个分块顶点保持连续的目的。无论是新增点还是去除点都需要对整个地形进行遍历并且对相关分块重新进行三角形剖分,而且丧失了分块的独立性,给我们利用分块的Cache带来了难度,增加了问题的复杂性,进而影响到效率。还有另外一种效率更高的消除裂缝的办法。对每个分块的四条边,在现有的顶点的基础上再延伸出一圈,他们和单个分块的边界共享顶点,只是高度值不同,这种延伸出来的一圈叫做“裙子”(Skirts )。投影之后只要保证顶点的高度值足够大,两个分块的裙子可以把裂缝遮挡住。当然,这种消除裂缝的方式会增加绘制的三角形绘制数量,也会带来性能的的下降。

发明内容
为解决上述问题,本发明公开了一种使用图形处理器(GPU)实现的几何体层次细分(LOD)算法,能够有效消除T型裂缝。为了达到上述目的,本发明提供如下技术方案
一种基于图形处理器加速的地形渲染方法,包括以下步骤
(1)将整个原始地形划分为2Nx2N个面积相等的地形块(Block);每个地形块的的长和宽均相等,地形块被分为2M x2M个面积相等的单元格;其中,M彡0,N彡0,且M和N均为整数;
(2)使用LOD地形绘制算法,创建不同LOD级别的顶点缓冲和索引缓冲;
LOD级别分为0级,I级……M级,共有M+1级,在不同LOD级别下创建相应的顶点缓冲和索引缓冲,所有地形块共享一组顶点缓冲和索弓I缓冲;
(3)用四叉树组织整个原始地形,每个叶子节点对应一个地形块;
(4)渲染地形;
(5)利用GPU进行VertexShader编程,使用顶点纹理采样功能从高度图获取地形块顶点的高度值;
(6 )根据步骤(5 )中获得的高度值修改顶点缓冲中各顶点的高度值,当相邻地形块之间的LOD级别不一样时,对LOD级别较低的地形块边缘顶点坐标进行位移。。所述步骤(2)中创建顶点缓冲的过程包括将不同LOD级下每个顶点的位置写入顶点缓冲中,改写地形块边缘编号为奇数的顶点的Z值,所述编号自边缘末端由0开始。
所述改写地形块边缘Z值的过程具体包括将地形块左边缘编号为奇数的顶点Z值改写为I,地形块上边缘编号为奇数的顶点Z值改写为2,地形块右边缘编号为奇数的顶点Z值改写为3,地形块下边缘编号为奇数的顶点Z值改写为4。所述步骤(6)中的具体操作步骤如下
当顶点的Z值在步骤(2)中未被改写时,将Z值修改为通过顶点纹理采样功能获得的高度值;
当顶点的Z值在步骤(2)中已被改写且该地形块与相邻地形块之间的LOD级别一样时,将Z值修改为通过顶点纹理采样功能获得的高度值;
当顶点的Z值在步骤(2)中已被改写且相邻地形块之间的LOD级别不一样时,对LOD级别较低的地形块边缘编号为奇数的顶点坐标进行位移。所述对LOD级别较低的地形块边缘编号为奇数的顶点坐标进行位移的过程包括将地形块左边缘编号为奇数的顶点坐标值修改为该顶点上方的顶点坐标值;将地形块上边缘编号为奇数的顶点坐标值修改为该顶点左方顶点的坐标值;将地形块右边缘编号为奇数的顶点坐标值修改为该顶点下方的顶点坐标值;将地形块下边缘编号为奇数的顶点坐标值修改为该顶点右方的顶点坐标值。所述步骤(4)中渲染地形的过程包括使用视锥体与四叉树递归计算后快速剔除不可见节点,从而获取一组可视地形块,根据视点到地形块中心的水平距离计算出各地形块的LOD级数;针对每个可视地形块计算出的LOD级数所对应的顶点和索引缓冲,再进行三角形列表图元的渲染。与现有技术相比,本发明提供的地形渲染方法具有以下优点和有益效果
I.算法简单高效,节约资源,有效消除了地形LOD渲染过程中出现的T型裂缝问题。2.基于图形处理器(GPU)进行计算,节省了 CPU的运算资源,提升了 CPU的处理性倉泛。本发明能够在仅支持Direct3D 9的计算机上高质量高性能的渲染大规模地形,可以广泛应用于3D游戏和虚拟现实应用程序中。


图I为原始地形图和地形块的划分 其中图a为原始地形图像划分图,图b为a图中圆圈圈出的地形块的放大 图2为由精细到粗糙依次列出的6种LOD级别;其中图a为33x33个顶点的LOD级,图b为17x17个顶点的LOD级,图c为9x9个顶点的LOD级,图d为5x5个顶点的LOD级,图e为3x3个顶点的LOD级,图f为2x2个顶点的LOD级。图3为实施方式中采用的世界坐标系。图4为LOD级为3的地形块,并列出了边缘上顶点的(X,Y)坐标值。图5为LOD级为3的地形块中Z值改写图。 图6为用四叉树组织的整个原始地形图。图7为地形块在Vertex Shader里进行顶点纹理采样的过程。图8为不同LOD级别的地形块相邻处产生T型裂缝的示意图。 图9为LOD级数为3的地形块四条边缘上的顶点位移图。图10为经过位移后消除了 T型裂缝的不同LOD级别之间地形块相邻示意图。
具体实施例方式以下将结合具体实施例对本发明提供的技术方案进行详细说明,应理解下述具体实施方式
仅用于说明本发明而不用于限制本发明的范围。本地形渲染方法包括以下步骤
(I)首先,获取原始地形图像,原始地形的长和宽相等,将原始地形的长和宽均匀地分为2N个等分,即长和宽上均存在2n +1个顶点,这样能够将整个地形划分为2nx 2n个面积相等的地形块(Block)。本例中如图I中的左侧图所示,N取16,即整个地形被划分为16x16=256个面积相等的地形块(Block)。其中,每个地形块的的长和宽均相等,地形块的长和宽也可被分为2Mf等分,即长和宽上均存在2M +1个顶点;上述M彡0,N彡0,且M和N均为整数。通常情况下M取5,如图I中右侧图所示,该地形块可被分为32x 32个单元格,地形块上存在33x 33个顶点。划分之后,整个原始地形上存在(2N X 2m+1)x (2n X 2m+1)个顶点,在本例中为513x 513个顶点。(2)使用LOD地形绘制算法,创建不同LOD级别的顶点缓冲和索引缓冲。。每个地形块共享一组以不同LOD级创建的顶点和索引缓冲。进行常规地形渲染时,地形块尺寸通常为64mx64m,地形块由精细到粗燥依次可分为如图2所示的33x33,17x17,9x9,5x5,3x3,2x2共计6个LOD级。由精细到粗糙,将LOD级别依次设为0 5级,即33x33个顶点的LOD级为0级,17x17个顶点的LOD级为I级,9x9个顶点的LOD级为2级,5x5个顶点的LOD级为3级,3x3个顶点的LOD级为4级,2x2个顶点的LOD级为5级。当顶点数为33x33时,地形块被分为32x32个单元格,顶点数为2x2时,整个地形块为I个单元格,由于这些地形块大小相等,顶点越多,也就意味着地形块被划分得越精细,因此LOD为0表示最精细的细节层次,级数越大越粗燥。每个LOD级对应一个顶点缓冲和索引缓冲,地形块基于不同的LOD级时相应的顶点坐标被写入该LOD级下的顶点缓冲中。创建顶点缓冲时,要写入每个顶点的位置,定义世界坐标系为如图3所示X轴朝前,Y轴朝右,Z轴朝上的左手坐标系。如图4所示,每个顶点的(X,Y)取值均在(0,0) (1,I)之间,而Z值一般取值为O。一个33x33的地形块,将LOD级为0级时相应的如下顶点的(X,Y,Z)坐标(0,0,0), (1/32,0,0), (2/32,0,0) ...... (1,0,0);
(0,1/32,0),(1/32,1/32,0),(2/32,1/32,0) ...... (I, 1/32, 0);
(0,2/32,0),(1/32,2/32,0),(2/32,2/32,0) ...... (I, 2/32, 0);
(0,1,0), (1/32,1,0), (2/32,1,0) ...... (I, 1,0); 写入该LOD级下的顶点缓冲中;
将LOD级为I级时相应的如下顶点坐标
(0,0,0), (1/16,0,0), (2/16,0,0) ...... (1,0,0);
(0,1/16,0),(1/16,1/16,0),(2/16,1/16,0) ...... (I, 1/16,0);
(0,2/16,0),(1/16,2/16,0), (2/16,2/16,0) ...... (I, 2/16,0);
(0,1,0), (1/16,1,0), (2/16,1,0) ...... (I, 1,0);
写入该LOD级下的顶点缓冲中;
将LOD级为2级时相应的如下顶点坐标
(0,0,0), (1/8,0,0), (2/8,0,0) ...... (1,0,0);
(0,1/8,0), (1/8,1/8,0), (2/8,1/8,0) ...... (I, 1/8,0); (0,2/8,0),( 1/8,2/8,0),(2/8,2/8,0) ...... (I, 2/8, 0);
(0,1,0), (1/8,1,0), (2/8,1,0)……(I, 1,0);
写入该LOD级下的顶点缓冲中;
将LOD级为3级时相应的如下顶点坐标
(0,0,0), (1/4,0,0), (2/4,0,0), (3/4,0,0), (1,0,0);
(0,1/4,0), ( 1/4,1/4,0),(2/4,1/4,0),(3/4,1/4,0),(I, 1/4,0);
(0,2/4,0), (1/4,2/4,0),(2/4,2/4,0),(3/4,2/4,0),(I, 2/4,0);
(0,3/4,0), (1/4,3/4,0),(2/4,3/4,0),(3/4,3/4,0),(I, 3/4,0);
(0,1,0), (1/4,1,0), (2/4,1,0), (3/4,1,0), (I, 1,0);
写入该LOD级下的顶点缓冲中;
将LOD级为4级时相应的如下顶点坐标
(0,0,0), (1/2,0,0), (1,0,0);
(0,1/2,0),(1/2,1/2,0),(1,1/2,0);
(0,1,0), (1/2,1,0), (1,1,0);
写入该LOD级下的顶点缓冲中;
将LOD级为5级时相应的如下顶点坐标
(0,0,0), (1,0,0); (0, 1,0), (I, 1,0);
写入该LOD级下的顶点缓冲中。标记地形块边缘的Z值
改写所有LOD级下顶点缓冲中地形块边缘上的的顶点的Z值,边缘以外的顶点Z值不变。每个地形块有四条边缘,即左边缘、上边缘、右边缘和下边缘。地形块每个边缘上的顶点由O开始编号,编号为奇数的那个索引需要标记出来。以下通过改写LOD级别为3级的地形块顶点为例详述标记过程,各边缘顶点编号如图5所示,具体标记方式为将地形块左边缘编号为奇数的顶点Z值改写为I,地形块上边缘编号为奇数的顶点Z值改写为2,地形块右边缘编号为奇数的顶点Z值改写为3,地形块下边缘编号为奇数的顶点Z值改写为4。即LOD级别为3级时的顶点缓冲坐标变为
(0,0,0), (1/4,0, I), (2/4,0,0), (3/4,0, I), (1,0,0);
(0,1/4,4), ( 1/4,1/4,0),(2/4,1/4,0),(3/4,1/4,0),(I, 1/4,2);
(0,2/4,0), (1/4,2/4,0),(2/4,2/4,0),(3/4,2/4,0),(I, 2/4,0);
(0,3/4,4), ( 1/4,3/4,0),(2/4,3/4,0),(3/4,3/4,0),(I, 3/4,2);
(0,1,0), (1/4,1,3), (2/4,1,0), (3/4,1,3),(I, 1,0);
创建索引缓冲,将地形块中划分的每个单元格分为两个三角形,将组成三角形的各个顶点编号写入索引缓冲中。(3)用四叉树组织整个原始地形,每个叶子节点对应一个地形块,如图6所示,图中圆圈圈出小块为叶子节点,同时代表了实际的一个地形块。(4)渲染地形。使用视锥体与四叉树递归计算后快速剔除不可见节点,从而获取一组可视地形块,即获得一个可视化地形块列表用于渲染,根据视点到地形块中心的水平距离计算出各地形块的LOD级数。视点到地形块中心的水平距离除以一个常规距离常数然后再取整,获得的整数值即为LOD级数,所述常规距离常数通常取400m,该距离常数也可以根据实际需求进行调整。针对每个可视地形块计算出的LOD级数所对应的顶点和索引缓冲,再进行三角形列表图元的渲染。这里的渲染步骤之前,还包括将地形块的每个顶点平移和缩放到世界空间中去的步骤。(5)利用GPU进行Vertex Shader编程,如图7所示,使用顶点纹理采样功能从高度图获取地形块顶点的高度值。(6)根据步骤(5)中获得的高度值修改顶点缓冲中各顶点的高度值
当顶点的Z值在步骤(2)中未被改写,即Z = 0时,将Z值修改为通过顶点纹理采样功能获得的高度值。当顶点的Z值在步骤(2)中已被改写,即Z古0时,且该地形块与相邻地形块之间的LOD级别一样时,将Z值同样修改为通过顶点纹理采样功能获得的高度值。当相邻地形块之间的LOD级别不一样时,由于LOD级别较低的地形块边缘顶点无法与级别较高的地形块边缘重合,不同LOD级别的地形块相邻处由此出现的三角形真空区域即为T型裂缝,图8展示出了 3级地形块与4级地形块之间产生的T型裂缝。由于地形块边长小于常规距离常数,因此采用上述方法计算出的相邻地形块LOD级别之差不会大于1,即可保证只会出现如图这种T型的裂缝。若要消除上述裂缝,需要将不同LOD级别的地形块中,LOD级别较低即精细度较高的地形块边缘编号为奇数的顶点坐标进行位移,具体地说,是将地形块左边缘中编号为奇数的顶点向上移一个,即将左边缘编号为奇数的顶点坐标值修改为该顶点上方的顶点坐标值;将地形块上边缘中编号为奇数的顶点向左移一个,即将上边缘编号为奇数的顶点坐标值修改为该顶点左方顶点的坐标值;将地形块右边缘中编号为奇数的顶点向下移一个,即将右边缘编号为奇数的顶点坐标值修改为该顶点下方的顶点坐标值;将地形块下边缘中编号为奇数的顶点右移一个,即将编号为奇数的顶点坐标值修改为该顶点右方的顶点坐标值。以图9所示的3级LOD地形为例,按照图中箭头所示方向进行位移,具体过程为将3级地形块左边缘中编号为奇数的顶点上移一个,即将编号为I的顶点的坐标值修改为左边缘上编号为0的顶点的坐标值,将编号为3的顶点的坐标值修改为左边缘上编号为2的顶点的坐标值;将3级地形块上边缘中编号为奇数的顶点左移一个,即将编号为I的顶点的坐标值修改为上边缘上编号为0的顶点的坐标值,将编号为3的顶点的坐标值修改为上边缘上编号为2的顶点的坐标值;将3级地形块右边缘中编号为奇数的顶点下移一个,即将编号为I的顶点值修改为右边缘上编号为2的顶点值,将编号为3的顶点值修改为右边缘上编号为4的顶点值;将3级地形块下边缘中编号为奇数的顶点右移一个,即将编号为I 的顶点值修改为下边缘上编号为2的顶点值,将编号为3的顶点值修改为下边缘上编号为4的顶点值。上述改写顶点值的过程中,X值,Y值,Z值都要进行位移改写。经过位移之后由图10可见,原3级地形块边缘编号为奇数的点被“抹平”,3级地形块边缘的顶点可以与4级地形块边缘顶点重合,从而有效地消除了如图8所示LOD过程中出现的T型裂缝。本发明方案所公开的技术手段不仅限于上述技术手段所公开的技术手段,还包括由以上技术特征任意组合所组成的技术方案。
权利要求
1.一种基于图形处理器加速的地形渲染方法,其特征在于包括以下步骤 (1)将整个原始地形划分为2Nx2N个面积相等的地形块(Block);每个地形块的的长和宽均相等,地形块被分为2M x2M个面积相等的单元格;其中,M彡0,N彡0,且M和N均为整数; (2)使用LOD地形绘制算法,创建不同LOD级别的顶点缓冲和索引缓冲; LOD级别分为0级,I级……M级,共有M+1级,在不同LOD级别下创建相应的顶点缓冲和索引缓冲,所有地形块共享一组顶点缓冲和索弓I缓冲; (3)用四叉树组织整个原始地形,每个叶子节点对应一个地形块; (4)渲染地形; (5)利用GPU进行VertexShader编程,使用顶点纹理采样功能从高度图获取地形块顶点的高度值; (6 )根据步骤(5 )中获得的高度值修改顶点缓冲中各顶点的高度值,当相邻地形块之间的LOD级别不一样时,对LOD级别较低的地形块边缘顶点坐标进行位移。
2.根据权利要求I所述的基于图形处理器加速的地形渲染方法,其特征在于所述步骤(2)中创建顶点缓冲的过程包括将不同LOD级下每个顶点的位置写入顶点缓冲中,改写地形块边缘编号为奇数的顶点的Z值,所述编号自边缘末端由0开始。
3.根据权利要求2所述的基于图形处理器加速的地形渲染方法,其特征在于所述改写地形块边缘Z值的过程具体包括将地形块左边缘编号为奇数的顶点Z值改写为1,地形块上边缘编号为奇数的顶点Z值改写为2,地形块右边缘编号为奇数的顶点Z值改写为3,地形块下边缘编号为奇数的顶点Z值改写为4。
4.根据权利要求3所述的基于图形处理器加速的地形渲染方法,其特征在于所述步骤(6)中的具体操作步骤如下 当顶点的Z值在步骤(2)中未被改写时,将Z值修改为通过顶点纹理采样功能获得的高度值; 当顶点的Z值在步骤(2)中已被改写且该地形块与相邻地形块之间的LOD级别一样时,将Z值修改为通过顶点纹理采样功能获得的高度值; 当顶点的Z值在步骤(2)中已被改写且相邻地形块之间的LOD级别不一样时,对LOD级别较低的地形块边缘编号为奇数的顶点坐标进行位移。
5.根据权利要求4所述的基于图形处理器加速的地形渲染方法,其特征在于所述对LOD级别较低的地形块边缘编号为奇数的顶点坐标进行位移的过程包括将地形块左边缘编号为奇数的顶点坐标值修改为该顶点上方的顶点坐标值;将地形块上边缘编号为奇数的顶点坐标值修改为该顶点左方顶点的坐标值;将地形块右边缘编号为奇数的顶点坐标值修改为该顶点下方的顶点坐标值;将地形块下边缘编号为奇数的顶点坐标值修改为该顶点右方的顶点坐标值。
6.根据权利要求I 5中任意一项所述的基于图形处理器加速的地形渲染方法,其特征在于所述步骤(4)中渲染地形的过程包括使用视锥体与四叉树递归计算后快速剔除不可见节点,从而获取一组可视地形块,根据视点到地形块中心的水平距离计算出各地形块的LOD级数;针对每个可视地形块计算出的LOD级数所对应的顶点和索引缓冲,再进行三角形列表图元的渲染。
全文摘要
本发明公开了一种基于图形处理器实现的算法,不仅能够有效消除地形LOD渲染过程中出现的T型裂缝问题,由于基于图形处理器进行计算,节省了CPU的运算资源,提升了CPU的处理性能。本发明能够在仅支持Direct3D9的计算机上高质量高性能的渲染大规模地形,可以广泛应用于3D游戏和虚拟现实应用程序中。本发明包括以下步骤将原始地形图像划分为多个面积相等的地形块;使用LOD地形绘制算法,创建不同LOD级别的顶点缓冲和索引缓冲;用四叉树组织整个原始地形,每个叶子节点对应一个地形块;渲染地形;利用GPU进行VertexShader编程,使用顶点纹理采样功能从高度图获取地形块顶点的高度值;修改顶点的高度值。
文档编号G06T15/00GK102750725SQ20121018214
公开日2012年10月24日 申请日期2012年6月5日 优先权日2012年6月5日
发明者张子龙 申请人:南京安讯网络服务有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1