基于gpu的顏色漸變線型地圖符號(hào)繪制方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及GIS領(lǐng)域和數(shù)字地圖領(lǐng)域的一種符號(hào)化渲染技術(shù),給出了一種基于GPU(Graphics Processing Unit)可編程流水線Shader語言的顏色漸變線型地圖符號(hào)的繪制方法,實(shí)現(xiàn)了基于該方法的線狀矢量要素的高質(zhì)量渲染和繪制,并在保證顏色平滑漸變的基礎(chǔ)上,提升繪制效率,進(jìn)行可擴(kuò)展的、配置式的顏色漸變效果。
【背景技術(shù)】
[0002]地理空間實(shí)體的符號(hào)化方法是地理信息領(lǐng)域和地圖制圖領(lǐng)域的重要研究?jī)?nèi)容。相比于常用的點(diǎn)符號(hào)和面符號(hào),線符號(hào)由于其需要沿著線狀要素的走向來填充繪制的特點(diǎn),往往更加困難和耗時(shí)。除了常用的實(shí)線和虛線之外,地圖表達(dá)中需要用的線型符號(hào)更為復(fù)雜。如城市主干道的線型符號(hào)是帶有邊框的雙線圖元;鐵路符號(hào)是帶有邊框的黑白相間的圖元;單邊邊界線符號(hào)是齒狀的圖元。這些線型符號(hào)利用不同幾何形狀組合而成一個(gè)帶有語義信息的圖元。傳統(tǒng)的繪制方式是通過符號(hào)相關(guān)的特定函數(shù),為每一個(gè)線型符號(hào)設(shè)計(jì)相應(yīng)的繪制函數(shù),這種方式應(yīng)用場(chǎng)景固定,可擴(kuò)展性不強(qiáng)。另一種常用的方式是利用組合繪制的方式來將地圖符號(hào)分解,再根據(jù)分解出來的圖元多次繪制矢量線;這種方式需要對(duì)原始的矢量線繪制多次,影響了其繪制效率。論文《面向GIS的矢量線狀符號(hào)填充算法研究》(張海泉,潘懋,吳煥萍,等.《地理與地理信息科學(xué)》,2004,20(04): 11-14.)介紹了這些基本方法。
[0003]在不同圖元符號(hào)表達(dá)的基礎(chǔ)上,漸變色常用于表達(dá)在空間上存在漸進(jìn)變化和具有方向性的信息,如河流的流向,境界線的內(nèi)外等。對(duì)于顏色漸變的線型地圖符號(hào)的繪制,傳統(tǒng)的方法往往也采用組合繪制的思路。對(duì)于沿線走向的顏色漸變,將矢量線要素按照長(zhǎng)度分為幾段,再為每一段繪制不同的顏色;對(duì)于沿線走向的垂直漸變,對(duì)矢量線要素做平行線,再用不同顏色的平行線來模擬顏色的漸變。論文《沿境界線繪制暈帶的方法》(杜道生.《武測(cè)資料》,1983,3:44-50)給出了這種方法的介紹。然而,在當(dāng)前數(shù)據(jù)更新頻率加快、數(shù)據(jù)獲取精度不斷提高、大數(shù)據(jù)的背景下,其繪制效率受到了極大的制約,也難以適應(yīng)硬件加速繪制和GHJ計(jì)算的技術(shù)趨勢(shì)。名稱為“基于GHJ的地圖線形符號(hào)繪制方法及系統(tǒng)”,申請(qǐng)?zhí)?01310125110.6的中國(guó)專利,在分析地圖線形符號(hào)繪制的難點(diǎn)的基礎(chǔ)上,公開了一種在Shader程序里面定制線型地圖符號(hào)的繪制方法。但這種方法嚴(yán)格依賴于Shader編程,不同的線型符號(hào)需要在Shader里面大量的編程才能實(shí)現(xiàn)繪制;對(duì)于如何將各種各樣的復(fù)雜線型地圖符號(hào)映射到GPU像素計(jì)算的方面并沒有給出方法,對(duì)于如何處理顏色漸變線型地圖符號(hào)的繪制亦沒有涉及。
[0004]因而,如何繪制顏色漸變的矢量線要素是計(jì)算機(jī)地圖繪制中的一個(gè)亟待解決的問題。這種漸變色繪制需要適應(yīng)于多種線型地圖符號(hào),要能夠支持沿線走向的漸變和垂直于線走向的漸變兩種基本的漸變模式。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的是在在GPU可編程流水線和著色器技術(shù)的基礎(chǔ)上,針對(duì)矢量線要素的顏色漸變符號(hào)化繪制問題,突破傳統(tǒng)用多條不同顏色的線來模擬漸變色的方式,實(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)單元屬性來結(jié)構(gòu)化映射一個(gè)符號(hào)單元,對(duì)這個(gè)二維數(shù)組中的每一個(gè)單元確定漸變的模式,并對(duì)單元的四個(gè)角分別設(shè)置漸變的起始顏色和終止顏色;
[0010]步驟3在著色器中根據(jù)顏色漸變函數(shù)對(duì)線狀要素進(jìn)行逐像素繪制:在著色器中基于傳遞到著色器里面的頂點(diǎn)U-V值,動(dòng)態(tài)確定每個(gè)像素的U-V值,即像素在水平方向上到線起點(diǎn)的距離u’值和像素在垂直方向上到線的上邊界的距離V’值,由此確定每一個(gè)像素在符號(hào)顏色結(jié)構(gòu)表中屬于哪一個(gè)單元,并根據(jù)所屬單元的漸變模式以及初始顏色和終止顏色,利用一個(gè)確定的顏色漸變函數(shù),確定繪制的顏色。
[0011 ]所述步驟I中,將V值從O至最大線寬的范圍內(nèi)歸一化到O至I的范圍內(nèi),U值通過每個(gè)頂點(diǎn)距離起始點(diǎn)的距離除以最大線寬得到。
[0012]所述步驟2中,A.符號(hào)的顏色結(jié)構(gòu)表:將符號(hào)單元按照其結(jié)構(gòu)分解為幾個(gè)列,每一列都包含其相應(yīng)的行,每一行都包含其相應(yīng)的四個(gè)角的顏色值,由此形成一系列的顏色單元來映射特定的符號(hào);B.顏色結(jié)構(gòu)表的單元屬性:對(duì)于一個(gè)符號(hào)單元的顏色結(jié)構(gòu)表,其每一列都包含相應(yīng)的寬度屬性和所包含的行數(shù)屬性,每一行都包含相應(yīng)的高度屬性,每一列都包含一個(gè)布爾值來指明該列是否為背景列,每個(gè)單元都包含其對(duì)應(yīng)的顏色漸變模式,整個(gè)顏色結(jié)構(gòu)表包含總列數(shù)、總寬度和總高度屬性。
[0013]所述步驟3中,A.根據(jù)U-V值獲取當(dāng)前像素所處的單元:在著色器中根據(jù)當(dāng)前像素的u’值,利用公式U(p)=U’-SLX[U’/SL],計(jì)算其在符號(hào)顏色結(jié)構(gòu)表中的位置,其中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’值,迭代判斷其在顏色結(jié)構(gòu)表中所處的具體行,并結(jié)合U(p)值確定該像素在符號(hào)顏色結(jié)構(gòu)表中所處的具體列;根據(jù)得到的具體行和列即可確定當(dāng)前像素所處的單元;
[0014]B.顏色漸變模式和顏色漸變函數(shù):根據(jù)當(dāng)前像素所處的單元,獲取填充該像素顏色的相關(guān)信息,包括單元的漸變模式和顏色漸變函數(shù);
[0015]B1.對(duì)于沿線走向的水平漸變,利用公式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:表示當(dāng)前像素在符號(hào)顏色結(jié)構(gòu)表中的U(P)值所占單元寬度Co IumnWidth的比例,即u_Percent = U (p ) /Columnffidth;
[0016]B2.對(duì)于沿線走向的垂直漸變,利用公式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:表示當(dāng)前像素在符號(hào)顏色結(jié)構(gòu)表中的V ’值所占單元高度Ro wHe i gh t的比例,即v_Percent = v VRowHeight0
[0017]本發(fā)明的方法可以利用GPU可編程流水線和著色器中像素著色器能夠遍歷每一個(gè)像素的特點(diǎn),按照符號(hào)自身的結(jié)構(gòu)信息,將符號(hào)的映射為二維的顏色結(jié)構(gòu)表,并依據(jù)顏色結(jié)構(gòu)表中每個(gè)單元的顏色漸變模式和漸變起始顏色-漸變終止顏色,實(shí)現(xiàn)矢量線要素的漸變顏色填充繪制。
【附圖說明】
[0018]圖1是本發(fā)明方法的流程示意圖。
[0019]圖2是實(shí)現(xiàn)垂直于線走向的漸變的方法。
[0020]圖3是實(shí)現(xiàn)沿線走向的漸變的方法。
[0021]圖4是帶有間斷邊線的符號(hào)的漸變方法。
[0022]圖5是利用本發(fā)明設(shè)計(jì)的方法繪制矢量線要素的幾種典型例圖。(a)是中央向邊界漸變效果;(b)是垂直于線走向的漸變;(C)是帶有間斷邊線的漸變。
【具體實(shí)施方式】
[0023]下面結(jié)合附圖和實(shí)施例做進(jìn)一步說明。
[0024]圖1為本發(fā)明方法的流程圖。該方法包括以下步驟:首先確定需要繪制的線要素坐標(biāo)序列,初始化線寬大小,根據(jù)線寬構(gòu)造三角化后的線Mesh,將沿線走向的U參數(shù)和垂直于線走向的V參數(shù)傳遞給Mesh中的每個(gè)頂點(diǎn)。根據(jù)需要填充的地圖符號(hào)單元生成相應(yīng)的顏色結(jié)構(gòu)表,并將此結(jié)構(gòu)顏色表和U-V參數(shù)傳遞到Shader程序中。利用Shader語言,根據(jù)每個(gè)頂點(diǎn)上的