—ROW—NUM];//每一行的高度
[0064]uniform vec4uf4CellColorl[MAX_C0L—NUM*MAX—ROW—NUM];//顏色表
[0065]uniform float ufMaxULength;//最大的U值
[0066]uniform int UiUseScaleV;//是否進(jìn)行沿線走向的漸寬繪制,0表示否,I表示是
[0067]uniform float ufScaleVl;//最大線寬系數(shù)
[0068]uniform float ufScaleV2;//最小線寬系數(shù)
[0069](3)在Shader中定義函數(shù)getColByU和函數(shù)getRowByV獲取當(dāng)前所在CelI: voidgetColByU(f1at u,out int col,out float colU){
[0070]對(duì)u除以整個(gè)符號(hào)的寬度值得到的結(jié)果進(jìn)行取整;
[0071]獲取當(dāng)前像素在符號(hào)中的相對(duì)U值;
[0072]遍歷符號(hào)顏色結(jié)構(gòu)表中的每一列,判斷U值是否在該列;
[0073]找到所在的列,返回結(jié)果;
[0074]}
[0075]void getRowByV(int col,float v,out int row,out float rowV){
[0076]遍歷符號(hào)顏色結(jié)構(gòu)表中的每一行,判斷當(dāng)前像素所在的行;
[0077]找到所在的行,返回結(jié)果;
[0078]}
[0079](4)在Shader中定義函數(shù)getCel IColorByUV進(jìn)行根據(jù)U-V取得到某一個(gè)Cel I中顏色的計(jì)算:
[0080]vec4getCellColorByUV(f1at u,float v){
[0081]……
[0082]調(diào)用函數(shù)getC0lByU(U,C0l,C0lU)獲取當(dāng)前像素所在的列;
[0083 ]調(diào)用函數(shù)ge tRowBy V (col ,v, row,rowV)獲取當(dāng)前所在的行;
[0084]根據(jù)計(jì)算得到的行和列,得到當(dāng)前像素在符號(hào)顏色結(jié)構(gòu)表中的位置;
[0085]返回顏色結(jié)構(gòu)表中該位置的顏色值;
[0086]}
[0087 ](5)在Shader中定義函數(shù)ge tCo I orByUV進(jìn)行寬度漸變函數(shù)的處理:
[0088]vec4getColorByUV(float u,float v){
[0089]……
[0090]判斷當(dāng)前線要素的繪制模式是否漸寬繪制;
[0091 ]如果不是漸寬繪制,直接調(diào)用getCellColorByUV(u,v)函數(shù),并返回結(jié)果;
[0092]如果是漸寬繪制,首先獲取最小縮放系數(shù)和最大縮放系數(shù);
[0093]根據(jù)最大和最小縮放系數(shù),利用傳遞到此函數(shù)的u值,計(jì)算當(dāng)前的縮放系數(shù);
[0094]對(duì)當(dāng)前的縮放系數(shù)取倒數(shù),得到反向的擴(kuò)張系數(shù);
[0095]按照半個(gè)擴(kuò)張系數(shù),對(duì)傳遞到此函數(shù)的V值進(jìn)行擴(kuò)張的到V’;
[0096]如果V’大于I,則使其等于I;
[0097]如果V’小于O,則使其等于0;
[0098]調(diào)用86比611&310池7群(11,¥’)函數(shù),并返回結(jié)果;
[0099]}
[0?00]在確定像素顏色的Shader ma in函數(shù)中,首先調(diào)用ge tCo I orByUV函數(shù),在getColorByUV中利用寬度漸變函數(shù),對(duì)原始V值進(jìn)行拉伸-縮放調(diào)整,得到新的V值。將新的V值和傳到getCe I ICo 1rByUV中,再依次調(diào)用getCo IByU和getRowBy V獲取當(dāng)前像素位于哪個(gè)Cell,用Cell的顏色值賦予當(dāng)前像素。最終實(shí)現(xiàn)整個(gè)矢量線要素的漸寬繪制。
【主權(quán)項(xiàng)】
1.基于GRJ的寬度漸變線型地圖符號(hào)繪制方法,其特征是,該方法包括下列步驟: 步驟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; 步驟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)單元; 步驟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)顏色。2.根據(jù)權(quán)利要求1所述的基于GPU的寬度漸變線型地圖符號(hào)繪制方法,其特征是,所述步驟I中,將V值從O至最大線寬的范圍內(nèi)歸一化到O至I的范圍內(nèi),U值通過每個(gè)頂點(diǎn)距離起始點(diǎn)的距離除以最大線寬得到。3.根據(jù)權(quán)利要求1所述的基于GPU的寬度漸變線型地圖符號(hào)繪制方法,其特征是,所述步驟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ù)、總寬度和總高度屬性。4.根據(jù)權(quán)利要求1所述的基于GPU的寬度漸變線型地圖符號(hào)繪制方法,其特征是,所述步驟3中, A.寬度漸變函數(shù):根據(jù)當(dāng)前像素所在位置的u’值和V’值,用u’值除以最大U值MaxU得到所占的比例,結(jié)合最大寬度和最小寬度屬性,按照公式w’=Width2+(Widthl-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)前線寬值,利用公式V(p)=v’XEF-HE計(jì)算得到該像素相應(yīng)的寬度范圍,其中EF = 1/V,HE=(EF-l)/2;通過U(p)和V(p)的值到顏色結(jié)構(gòu)表中遍歷每一列的寬度和每一行的高度來(lái)確定最終需要填充的顏色,如果V(p)值在O和I之間,則按照遍歷得到的列-行索引值確定填充顏色;如果V(p)值小于O或者大于I,則填充透明色,由此繪制出寬度漸變的線要素。
【專利摘要】本發(fā)明涉及GIS領(lǐng)域和數(shù)字地圖制圖領(lǐng)域的一種符號(hào)化渲染技術(shù),給出了一種基于GPU的寬度漸變線型地圖符號(hào)繪制方法,實(shí)現(xiàn)了基于該方法的線狀矢量要素在寬度上漸變的高效渲染和繪制。該方法包括以下步驟:首先確定需要繪制的線要素坐標(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ù)、最大線寬和最小線寬傳遞到著色器程序中。利用Shader語(yǔ)言,根據(jù)每個(gè)頂點(diǎn)上的U-V值和線寬大小,基于指定的寬度漸變函數(shù)進(jìn)行線要素的逐像素繪制,由此實(shí)現(xiàn)寬度漸變的矢量線型地圖符號(hào)繪制。
【IPC分類】G06T11/40
【公開號(hào)】CN105513110
【申請(qǐng)?zhí)枴緾N201610015703
【發(fā)明人】溫永寧, 樂松山, 陳旻, 閭國(guó)年
【申請(qǐng)人】南京師范大學(xué)
【公開日】2016年4月20日
【申請(qǐng)日】2016年1月11日