基于gpu的颜色渐变线型地图符号绘制方法

文档序号:9930045阅读:980来源:国知局
基于gpu的颜色渐变线型地图符号绘制方法
【技术领域】
[0001]本发明涉及GIS领域和数字地图领域的一种符号化渲染技术,给出了一种基于GPU(Graphics Processing Unit)可编程流水线Shader语言的颜色渐变线型地图符号的绘制方法,实现了基于该方法的线状矢量要素的高质量渲染和绘制,并在保证颜色平滑渐变的基础上,提升绘制效率,进行可扩展的、配置式的颜色渐变效果。
【背景技术】
[0002]地理空间实体的符号化方法是地理信息领域和地图制图领域的重要研究内容。相比于常用的点符号和面符号,线符号由于其需要沿着线状要素的走向来填充绘制的特点,往往更加困难和耗时。除了常用的实线和虚线之外,地图表达中需要用的线型符号更为复杂。如城市主干道的线型符号是带有边框的双线图元;铁路符号是带有边框的黑白相间的图元;单边边界线符号是齿状的图元。这些线型符号利用不同几何形状组合而成一个带有语义信息的图元。传统的绘制方式是通过符号相关的特定函数,为每一个线型符号设计相应的绘制函数,这种方式应用场景固定,可扩展性不强。另一种常用的方式是利用组合绘制的方式来将地图符号分解,再根据分解出来的图元多次绘制矢量线;这种方式需要对原始的矢量线绘制多次,影响了其绘制效率。论文《面向GIS的矢量线状符号填充算法研究》(张海泉,潘懋,吴焕萍,等.《地理与地理信息科学》,2004,20(04): 11-14.)介绍了这些基本方法。
[0003]在不同图元符号表达的基础上,渐变色常用于表达在空间上存在渐进变化和具有方向性的信息,如河流的流向,境界线的内外等。对于颜色渐变的线型地图符号的绘制,传统的方法往往也采用组合绘制的思路。对于沿线走向的颜色渐变,将矢量线要素按照长度分为几段,再为每一段绘制不同的颜色;对于沿线走向的垂直渐变,对矢量线要素做平行线,再用不同颜色的平行线来模拟颜色的渐变。论文《沿境界线绘制晕带的方法》(杜道生.《武测资料》,1983,3:44-50)给出了这种方法的介绍。然而,在当前数据更新频率加快、数据获取精度不断提高、大数据的背景下,其绘制效率受到了极大的制约,也难以适应硬件加速绘制和GHJ计算的技术趋势。名称为“基于GHJ的地图线形符号绘制方法及系统”,申请号201310125110.6的中国专利,在分析地图线形符号绘制的难点的基础上,公开了一种在Shader程序里面定制线型地图符号的绘制方法。但这种方法严格依赖于Shader编程,不同的线型符号需要在Shader里面大量的编程才能实现绘制;对于如何将各种各样的复杂线型地图符号映射到GPU像素计算的方面并没有给出方法,对于如何处理颜色渐变线型地图符号的绘制亦没有涉及。
[0004]因而,如何绘制颜色渐变的矢量线要素是计算机地图绘制中的一个亟待解决的问题。这种渐变色绘制需要适应于多种线型地图符号,要能够支持沿线走向的渐变和垂直于线走向的渐变两种基本的渐变模式。

【发明内容】

[0005]本发明的目的是在在GPU可编程流水线和着色器技术的基础上,针对矢量线要素的颜色渐变符号化绘制问题,突破传统用多条不同颜色的线来模拟渐变色的方式,实现基于符号结构的不同颜色渐变模式的统一绘制。
[0006]本发明的技术方案是:
[0007]基于GPU的颜色渐变线型地图符号绘制方法,包括下列步骤:
[0008]步骤I初始化需要绘制的线状要素的点集序列,根据线宽生成需要绘制的三角形几何三角网:确定需要绘制的渐变颜色线的线宽参数,遍历线状要素中的每一个顶点,按照半个最大线宽向两边扩展,同时生成相应的三角形集合,并为每个三角形的每个顶点赋予沿线走向的长度值U值和垂直于线走向的长度值V值,S卩U-V值,最终得到最后一个顶点的U值作为整条线最大的U值MaxU;
[0009]步骤2确定需要沿线重复填充的符号单元的颜色结构表:将需要填充的符号单元按照纵向-横向的结构进行分解,用列优先的二维数组和相应的符号单元属性来结构化映射一个符号单元,对这个二维数组中的每一个单元确定渐变的模式,并对单元的四个角分别设置渐变的起始颜色和终止颜色;
[0010]步骤3在着色器中根据颜色渐变函数对线状要素进行逐像素绘制:在着色器中基于传递到着色器里面的顶点U-V值,动态确定每个像素的U-V值,即像素在水平方向上到线起点的距离u’值和像素在垂直方向上到线的上边界的距离V’值,由此确定每一个像素在符号颜色结构表中属于哪一个单元,并根据所属单元的渐变模式以及初始颜色和终止颜色,利用一个确定的颜色渐变函数,确定绘制的颜色。
[0011 ]所述步骤I中,将V值从O至最大线宽的范围内归一化到O至I的范围内,U值通过每个顶点距离起始点的距离除以最大线宽得到。
[0012]所述步骤2中,A.符号的颜色结构表:将符号单元按照其结构分解为几个列,每一列都包含其相应的行,每一行都包含其相应的四个角的颜色值,由此形成一系列的颜色单元来映射特定的符号;B.颜色结构表的单元属性:对于一个符号单元的颜色结构表,其每一列都包含相应的宽度属性和所包含的行数属性,每一行都包含相应的高度属性,每一列都包含一个布尔值来指明该列是否为背景列,每个单元都包含其对应的颜色渐变模式,整个颜色结构表包含总列数、总宽度和总高度属性。
[0013]所述步骤3中,A.根据U-V值获取当前像素所处的单元:在着色器中根据当前像素的u’值,利用公式U(p)=U’-SLX[U’/SL],计算其在符号颜色结构表中的位置,其中U(p)表示在颜色结构表中的U值,SL表达符号的总宽度,[u’/SL]表示对u’/SL的结果进行取整得到小于u’值的SL的整数倍;然后根据当前像素的V’值,迭代判断其在颜色结构表中所处的具体行,并结合U(p)值确定该像素在符号颜色结构表中所处的具体列;根据得到的具体行和列即可确定当前像素所处的单元;
[0014]B.颜色渐变模式和颜色渐变函数:根据当前像素所处的单元,获取填充该像素颜色的相关信息,包括单元的渐变模式和颜色渐变函数;
[0015]B1.对于沿线走向的水平渐变,利用公式Color = ColorTablel [cell_p] + ( I_u_Percent) X Co 1rTabl e2[ cel l_p]获得渐变颜色,其中Co 1rTab I el [cel l_p]表不单元左上角的颜色,(>3101^313162[0611_?]表示单元右上角的颜色,11_?61^6111:表示当前像素在符号颜色结构表中的U(P)值所占单元宽度Co IumnWidth的比例,即u_Percent = U (p ) /Columnffidth;
[0016]B2.对于沿线走向的垂直渐变,利用公式Color = ColorTabIeI [cell_p] + ( I_v_Percent) X Co 1rTabl e3[ cel l_p]获得渐变颜色,其中Co 1rTab I el [cel l_p]表不单元左上角的颜色,(^0101^313163[0611_?]表示单元右下角的颜色,¥_?61^6111:表示当前像素在符号颜色结构表中的V ’值所占单元高度Ro wHe i gh t的比例,即v_Percent = v VRowHeight0
[0017]本发明的方法可以利用GPU可编程流水线和着色器中像素着色器能够遍历每一个像素的特点,按照符号自身的结构信息,将符号的映射为二维的颜色结构表,并依据颜色结构表中每个单元的颜色渐变模式和渐变起始颜色-渐变终止颜色,实现矢量线要素的渐变颜色填充绘制。
【附图说明】
[0018]图1是本发明方法的流程示意图。
[0019]图2是实现垂直于线走向的渐变的方法。
[0020]图3是实现沿线走向的渐变的方法。
[0021]图4是带有间断边线的符号的渐变方法。
[0022]图5是利用本发明设计的方法绘制矢量线要素的几种典型例图。(a)是中央向边界渐变效果;(b)是垂直于线走向的渐变;(C)是带有间断边线的渐变。
【具体实施方式】
[0023]下面结合附图和实施例做进一步说明。
[0024]图1为本发明方法的流程图。该方法包括以下步骤:首先确定需要绘制的线要素坐标序列,初始化线宽大小,根据线宽构造三角化后的线Mesh,将沿线走向的U参数和垂直于线走向的V参数传递给Mesh中的每个顶点。根据需要填充的地图符号单元生成相应的颜色结构表,并将此结构颜色表和U-V参数传递到Shader程序中。利用Shader语言,根据每个顶点上的
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1