基于gpu的寬度漸變線型地圖符號(hào)繪制方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及GIS領(lǐng)域和電子地圖領(lǐng)域的一種符號(hào)化渲染技術(shù),給出了一種基于GPU(Graphics Processing Unit)可編程流水線Shader語(yǔ)言的寬度漸變線型地圖符號(hào)的繪制方法,實(shí)現(xiàn)了基于該方法的漸寬線狀矢量要素的高質(zhì)量渲染和繪制,能夠平滑的表達(dá)諸如河流、界線等在空間上存在漸變屬性的要素實(shí)體。
【背景技術(shù)】
[0002]地理空間實(shí)體的符號(hào)化方法是地理信息領(lǐng)域和地圖制圖領(lǐng)域的重要研究?jī)?nèi)容。相比于常用的點(diǎn)符號(hào)和面符號(hào),線符號(hào)由于其需要沿著線狀要素的走向來(lái)填充繪制的特點(diǎn),往往更加困難和耗時(shí)。除了常用的實(shí)線和虛線之外,地圖表達(dá)中需要用的線型符號(hào)更為復(fù)雜。如城市主干道的線型符號(hào)是帶有邊框的雙線圖元;鐵路符號(hào)是帶有邊框的黑白相間的圖元;單邊邊界線符號(hào)是齒狀的圖元。這些線型符號(hào)利用不同幾何形狀組合而成一個(gè)帶有語(yǔ)義信息的圖元。傳統(tǒng)的繪制方式是通過(guò)符號(hào)相關(guān)的特定函數(shù),為每一個(gè)線型符號(hào)設(shè)計(jì)相應(yīng)的繪制函數(shù),這種方式應(yīng)用場(chǎng)景固定,可擴(kuò)展性不強(qiáng)。另一種常用的方式是利用組合繪制的方式來(lái)將地圖符號(hào)分解,再根據(jù)分解出來(lái)的圖元多次繪制矢量線;這種方式需要對(duì)原始的矢量線繪制多次,影響了其繪制效率。論文《面向GIS的矢量線狀符號(hào)填充算法研究》(張海泉,潘懋,吳煥萍,等.《地理與地理信息科學(xué)》,2004,20(04): 11-14.)介紹了這些基本方法。
[0003]其中,寬度漸變的線型地圖符號(hào)還需要在沿線繪制的同時(shí)改變其線寬大小。漸寬線符號(hào)常用于表達(dá)空間上存在漸進(jìn)變化和具有方向性的信息,如隨著河流的走向,河流線要素需要被繪制為寬度變窄的線,從而反映河流的整體形態(tài)和流向。對(duì)于這種漸寬的線型符號(hào)的繪制,傳統(tǒng)的方法有臺(tái)階式平行線算法、角平分線漸粗(細(xì))算法和基于分段緩沖區(qū)的方法。但這些方法都需要將原始線要素根據(jù)其長(zhǎng)度進(jìn)行劃分,得到幾段首尾相連的線,再為這些線賦予不同的寬度,最后模擬實(shí)現(xiàn)寬度漸變的效果。論文《一種單線河流漸變符號(hào)的繪制方法》(李麗,王結(jié)臣,沈定濤,陳焱明.《測(cè)繪通報(bào)》,2008,11:64-67)給出了這幾種方法的基本介紹。但是,這些方法仍然集中于純軟件繪制方法,對(duì)矢量線的劃分、根據(jù)不同寬度進(jìn)行緩沖區(qū)構(gòu)建都比較耗時(shí),難以滿足實(shí)時(shí)動(dòng)態(tài)地圖繪制的要求,也難以適應(yīng)硬件加速繪制和GPU計(jì)算的技術(shù)趨勢(shì)。名稱為“基于GPU的地圖線形符號(hào)繪制方法及系統(tǒng)”,申請(qǐng)?zhí)?01310125110.6的中國(guó)專利,在分析地圖線形符號(hào)繪制的難點(diǎn)的基礎(chǔ)上,公開(kāi)了一種在Shader程序里面定制線型地圖符號(hào)的繪制方法。但這種方法嚴(yán)格依賴于Shader編程,不同的線型符號(hào)需要在Shader里面大量的編程才能實(shí)現(xiàn)繪制;對(duì)于如何將各種各樣的復(fù)雜線型地圖符號(hào)映射到GPU像素計(jì)算的方面并沒(méi)有給出方法,對(duì)于如何處理寬度漸變線型地圖符號(hào)的繪制亦沒(méi)有涉及。
[0004]因而,如何繪制寬度漸變的矢量線要素是計(jì)算機(jī)地圖繪制中的一個(gè)亟待解決的問(wèn)題。這種漸寬繪制需要適應(yīng)于多種線型地圖符號(hào),而且不能改變?cè)际噶烤€數(shù)據(jù)。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的是在GPU可編程流水線和著色器技術(shù)的基礎(chǔ)上,針對(duì)矢量線要素的寬度漸變符號(hào)化繪制問(wèn)題,突破傳統(tǒng)用多條不同寬度的線來(lái)模擬漸寬的方式,實(shí)現(xiàn)基于符號(hào)結(jié)構(gòu)的矢量線要素寬度漸變的統(tǒng)一繪制。
[0006]本發(fā)明的技術(shù)方案是:
[0007]基于GPU的寬度漸變線型地圖符號(hào)繪制方法,包括下列步驟:
[0008]步驟I初始化需要繪制的線狀要素的點(diǎn)集序列,根據(jù)最大線寬生成需要繪制的三角形幾何三角網(wǎng):確定需要繪制的漸變線寬的最大線寬和最小線寬參數(shù),遍歷線狀要素中的每一個(gè)頂點(diǎn),按照半個(gè)最大線寬向兩邊擴(kuò)展,同時(shí)生成相應(yīng)的三角形集合,并為每個(gè)三角形的每個(gè)頂點(diǎn)賦予沿線走向的長(zhǎng)度值U值和垂直于線走向的長(zhǎng)度值V值,S卩U-V值,最終得到最后一個(gè)頂點(diǎn)的U值作為整條線最大的U值MaxU;
[0009]步驟2確定需要沿線重復(fù)填充的符號(hào)單元的顏色結(jié)構(gòu)表:將需要填充的符號(hào)單元按照縱向-橫向的結(jié)構(gòu)進(jìn)行分解,用列優(yōu)先的二維數(shù)組和相應(yīng)的符號(hào)單元屬性來(lái)結(jié)構(gòu)化映射一個(gè)符號(hào)單元;
[0010]步驟3在著色器中根據(jù)寬度漸變函數(shù)對(duì)線狀要素進(jìn)行逐像素繪制:基于傳遞到著色器里面的頂點(diǎn)U-V值,動(dòng)態(tài)確定每個(gè)像素的U-V值,即像素在水平方向上到線起點(diǎn)的距離u’值和像素在垂直方向上到線的上邊界的距離V’值,在著色器中利用一個(gè)確定的寬度漸變函數(shù),計(jì)算該像素所處位置的寬度,由此在寬度范圍內(nèi)填充顏色表中的相應(yīng)顏色。
[0011 ]所述步驟I中,將V值從O至最大線寬的范圍內(nèi)歸一化到O至I的范圍內(nèi),U值通過(guò)每個(gè)頂點(diǎn)距離起始點(diǎn)的距離除以最大線寬得到。
[0012]所述步驟2中,A.符號(hào)的顏色結(jié)構(gòu)表:將符號(hào)單元按照其結(jié)構(gòu)分解為幾個(gè)列,每一列都包含其相應(yīng)的行,每一行都包含其相應(yīng)的四個(gè)角的顏色值,由此形成一系列的顏色單元來(lái)映射特定的符號(hào);B.顏色結(jié)構(gòu)表的單元屬性:對(duì)于一個(gè)符號(hào)單元的顏色結(jié)構(gòu)表,其每一列都包含相應(yīng)的寬度屬性和所包含的行數(shù)屬性,每一行都包含相應(yīng)的高度屬性,每一列都包含一個(gè)布爾值來(lái)指明該列是否為背景列,整個(gè)顏色結(jié)構(gòu)表包含總列數(shù)、總寬度和總高度屬性。
[0013]所述步驟3中,A.寬度漸變函數(shù):根據(jù)當(dāng)前像素所在位置的u’值和V’值,用u’值除以最大U值MaxU得到所占的比例,結(jié)合最大寬度和最小寬度屬性,按照公式w’=Width2+(Width 1-Width2) X (MaxU-u’)/MaxU計(jì)算得到每個(gè)像素所在位置的寬度,其中w’表示當(dāng)前寬度,Width2表示最小寬度,Widthl表達(dá)最大寬度,MaxU表示最大U值;B.根據(jù)U-V值獲取在寬度范圍內(nèi)顏色的方法:首先根據(jù)當(dāng)前像素的u’值,計(jì)算其在符號(hào)單元顏色結(jié)構(gòu)表中的位置,利用公式U(p)=U’-SLX[U’/SL],其中U(p)表示在顏色結(jié)構(gòu)表中的U值,SL表達(dá)符號(hào)的總寬度,[u’/SL]表示對(duì)u’/SL的結(jié)果進(jìn)行取整得到小于u’值的SL的整數(shù)倍;接著根據(jù)當(dāng)前像素的V’值,和計(jì)算得到的當(dāng)前線寬w’值,利用公式V(p) = v’XEF-HE計(jì)算得到該像素相應(yīng)的寬度范圍,其中EF=1/V,HE=(EF-l)/2;通過(guò)U(p)和V(p)的值到顏色結(jié)構(gòu)表中遍歷每一列的寬度和每一行的高度來(lái)確定最終需要填充的顏色,如果V(p)值在O和I之間,則按照遍歷得到的列-行索引值確定填充顏色;如果V(p)值小于O或者大于I,則填充透明色,由此繪制出寬度漸變的線要素。
[0014]本發(fā)明的方法可以利用GPU可編程流水線和著色器中像素著色器能夠遍歷每一個(gè)像素的特點(diǎn),按照符號(hào)自身的結(jié)構(gòu)信息,將符號(hào)的映射為二維的顏色結(jié)構(gòu)表;根據(jù)確定的最大線寬和最小線寬動(dòng)態(tài)計(jì)算每個(gè)像素所處位置的線寬值,并在該動(dòng)態(tài)的線寬范圍內(nèi)進(jìn)行顏色表取值,最終實(shí)現(xiàn)矢量線要素的寬度漸變繪制。
【附圖說(shuō)明】
[0015]圖1是本發(fā)明方法的流程示意圖。
[0016]圖2是符號(hào)對(duì)應(yīng)的顏色結(jié)構(gòu)表的組織。
[0017]圖3是對(duì)寬度漸變函數(shù)的說(shuō)明。(a)是是寬度漸變函數(shù)的說(shuō)明,(b)是在Shader中對(duì)寬度漸變函數(shù)的具體實(shí)現(xiàn)說(shuō)明。
[0018]圖4是根據(jù)U-V值獲取在寬度范圍內(nèi)顏色的方法。(a)是V指的拉伸-縮放操作示例,(b)是在Shader中的對(duì)V值具體操作的說(shuō)明。
[0019]圖5是利用本發(fā)明設(shè)計(jì)的方法繪制矢量線要素的幾種典型例圖。(a)是實(shí)線符號(hào)的漸寬繪制效果,(b)是間斷虛線符號(hào)的漸寬繪制效果,(C)是黑白相間的鐵路符號(hào)的漸寬繪制效果,(d)是“柵欄”式的線型符號(hào)的漸寬繪制效果。
【具體實(shí)施方式】
[0020]下面結(jié)合附圖和實(shí)施例做進(jìn)一步說(shuō)明。
[0021]圖1為本發(fā)明方法的流程圖。該方法包括以下步驟:首先確定需要繪制的線要素坐標(biāo)序列,初始化最大和最小線寬,根據(jù)最大線寬構(gòu)造三角化后的線三角網(wǎng),將沿線走向的U參數(shù)和垂直于線走向的V參數(shù)傳遞給三角網(wǎng)中的每個(gè)頂點(diǎn)。根據(jù)需要填充的地圖符號(hào)單元生成相應(yīng)的顏色結(jié)構(gòu)表,并將此顏色結(jié)構(gòu)表、U-V參數(shù)、最大線寬和最小線寬傳遞到著色器程序中。利用Siader語(yǔ)言,根據(jù)每個(gè)頂點(diǎn)上的U-V值和線寬大小,基于指定的寬度漸變函數(shù)進(jìn)行線要素的逐像素繪制,由此實(shí)現(xiàn)寬度漸變的矢量線型地圖符號(hào)繪制。