羅童心,仇建偉,王家潤
(華北計算技術(shù)研究所,北京 100083)
對于三維標(biāo)圖軟件,線面標(biāo)號繪制是其基本的功能。為使圖形符號表達(dá)更多含義,尤其在涵蓋顏色信息外還需要更直觀形象地體現(xiàn)某種趨勢和程度時,通常會對線面標(biāo)號進行漸變填充處理,即利用兩種不同顏色的混合效果,展現(xiàn)諸如污染程度、進攻方向和顏色權(quán)重等信息。這種繪制效果在軌跡繪制等場合也發(fā)揮著重要作用。此外,相比于單一色彩的填充,漸變填充通常有更好的視覺效果[1-2]。
目前的三維標(biāo)圖應(yīng)用廣泛采用的是基于傳統(tǒng)圖形流水線的繪制方法,即使用固定功能的圖形流水線。該方法需要對曲面上的每個頂點綁定其對應(yīng)的顏色屬性等數(shù)據(jù),再交由圖形流水線完成余下渲染過程,其數(shù)據(jù)計算主要由CPU執(zhí)行。如將該方法應(yīng)用到三維場景的線面標(biāo)號漸變填充中,則可能無法發(fā)揮較高的性能。這是由于為使線面標(biāo)號的繪制貼合球面,通常需要填充的是細(xì)分程度較高的光滑弧面,這意味著有數(shù)量較多的頂點和三角面片數(shù)據(jù),而在漸變填充中每個頂點的顏色不盡相同,使得CPU串行計算每個頂點的顏色值將耗費大量時間,此外為每個頂點存儲其對應(yīng)的顏色屬性也需要占用大量空間[3-4]。這些問題使得圖形繪制效率較低,在復(fù)雜態(tài)勢標(biāo)繪應(yīng)用中無法滿足實時快速顯示的要求。
為提高三維線面標(biāo)號的繪制速度,文中在固定管線渲染的基礎(chǔ)上使用能夠替代原有功能模塊的可編程模塊,即頂點和片元著色器,將部分原本在CPU中串行計算的大量頂點操作轉(zhuǎn)移到GPU中進行并行計算[5]。當(dāng)應(yīng)用于三維弧面漸變填充的場合時,該方法只需傳遞少量參數(shù),在頂點著色器內(nèi)部利用頂點位置等信息計算頂點對應(yīng)顏色值,同時省去顏色屬性數(shù)組的構(gòu)建和傳輸,在空間和時間性能上都有大幅度的提升。
經(jīng)緯映射是將球面上的三維笛卡爾坐標(biāo)系下的點轉(zhuǎn)換為經(jīng)緯度坐標(biāo)的映射方式,在三維地球的標(biāo)繪中通常用該映射方式取代由三維坐標(biāo)系到二維坐標(biāo)系的正投影或透視投影變換。
對于球心位置為原點(0,0,0)的球,球面上坐標(biāo)為(x,y,z)的三維空間點轉(zhuǎn)換到經(jīng)緯度坐標(biāo)系的公式如下[6]:
(1)
(2)
為使弧面的漸變填充效果均勻平滑地貼合球面弧度,算法需利用球面的經(jīng)緯映射將在三維地球上弧面的各頂點從三維空間坐標(biāo)系映射到二維坐標(biāo)系下。
1.2.1 關(guān)鍵參數(shù)及含義
(1)顏色混合參數(shù):對于弧面上每個點,都對應(yīng)一個顏色混合參數(shù)值,表示該位置上參與漸變的兩種顏色的混合比例,其取值范圍為0.0~1.0。根據(jù)每個頂點的顏色混合參數(shù)para,利用式(3)可以求得該位置應(yīng)該被填充的顏色值。
VertexColor=(1-para)*MainColor+para*
SubColor
(3)
(2)漸變基準(zhǔn):可指定為弧面上任意位置,其對應(yīng)的顏色混合參數(shù)為某個固定值,被作為弧面上其他點計算顏色混合參數(shù)的參照,通過弧面各個頂點到漸變基準(zhǔn)的距離可以計算出其他位置對應(yīng)的顏色混合參數(shù)。
(3)漸變半徑:即漸變基準(zhǔn)到弧面包圍體邊界的距離,用于計算顏色混合參數(shù)。
(4)
1.2.2 輻射漸變
如圖1(a)所示,輻射漸變的漸變基準(zhǔn)為一個點,該點的顏色混合參數(shù)為固定值0;輻射漸變的漸變半徑即為指定圓心為漸變基準(zhǔn)的包圍圓半徑;位于包圍圓圓周上的點,其顏色混合參數(shù)均為1,其他位置的顏色混合參數(shù)則在其與漸變基準(zhǔn)之間按距離遠(yuǎn)近插值。輻射漸變可以直觀表達(dá)弧面上各點距離漸變基準(zhǔn)的位置遠(yuǎn)近,通常應(yīng)用于對區(qū)域內(nèi)輻射強度等信息的表達(dá)。
1.2.3 線性漸變
如圖1(b)所示,線性漸變的漸變基準(zhǔn)是一條垂直于漸變方向的直線,該直線上所有位置的顏色混合參數(shù)均為固定值0.5;線性漸變的漸變基準(zhǔn)到沿漸變方向的方向包圍盒兩端距離不一定相等,因此線性漸變的漸變半徑有兩個取值;在沿漸變方向包圍盒邊界,顏色混合參數(shù)為1,在與漸變方向相反的包圍盒邊界,顏色混合參數(shù)為0,其他位置的顏色混合參數(shù)則在二者與漸變基準(zhǔn)之間按距離進行插值。線性漸變可以直觀表達(dá)弧面的方向趨勢信息以及兩種顏色參與漸變的權(quán)重,權(quán)重較大的顏色,在漸變過程中衰減得較慢,即該顏色在整個面的填充效果上占的份額較多,通常應(yīng)用于行進方向等信息的表達(dá)。
圖1 兩種漸變模型及參數(shù)示意
1.3.1 包圍圓
對象的包圍圓定義為包含該對象的最小的圓周。在輻射漸變的漸變半徑計算中,需計算指定圓心位置的圖形對象包圍圓,即包圍圓的圓心需為漸變基準(zhǔn)點。在確定漸變基準(zhǔn)位置后,將所有頂點遍歷一次,計算并比較各頂點到中心位置的距離,其最長距離為指定圓心的包圍圓半徑,即輻射漸變的漸變半徑。
1.3.2 方向包圍盒
方向包圍盒(OBB)是較為常用的包圍體類型。它是包含指定繪制對象且相對于坐標(biāo)軸方向任意的最小的長方體[7]。對于線性漸變的漸變半徑計算,則只需求出該圖形沿指定方向(線性漸變方向)的方向包圍盒。遍歷所有頂點,利用向量投影計算并比較各頂點到漸變基準(zhǔn)的距離,同時運用向量的點積判斷頂點相對于漸變基準(zhǔn)的位置,在沿兩個相反方向上的最大距離則分別為方向包圍盒的上下邊界到漸變基準(zhǔn)的距離[8],即為線性漸變的漸變半徑。
實驗使用GLSL語言編輯著色程序,實現(xiàn)著色器繪制,以提高渲染過程中GPU的利用率。頂點著色程序是被GPU內(nèi)可編程頂點處理器執(zhí)行的程序,應(yīng)用程序設(shè)定的圖元信息,如頂點坐標(biāo)、顏色值、法向量、紋理坐標(biāo)等頂點屬性,傳入到頂點著色器中進行并行處理。存在片元著色程序時,頂點著色器的輸出會作為片元著色器的輸入,再由片元著色器的輸出決定屏幕上像素顯示的顏色,在單一使用頂點著色時,則只對輸入的頂點進行操作,頂點之間的部分則按照硬件默認(rèn)的方式進行自動插值[9-11]。
GLSL是基于OpenGL的著色語言,在各顯卡上均有較好的支持,相較于僅在NVIDA顯卡上得到支持的Cg等著色語言,具有良好的可移植性[12]。GLSL語言提供了少量的內(nèi)置變量和部分內(nèi)置函數(shù)。
實驗中用內(nèi)置變量gl_Vertex獲取頂點的三維坐標(biāo),使用transform()內(nèi)置函數(shù)對頂點進行MVP矩陣變換,以及使用dot()、length()函數(shù)計算向量點積和長度等。
考慮到圖形流水線的結(jié)構(gòu)和著色器的并行計算能力,實驗選擇將計算每個頂點各自顏色的過程放到頂點著色器中進行,無需再額外構(gòu)建和綁定頂點顏色數(shù)組。由于著色器中每個頂點的計算都是獨立在各個GPU單元間進行的,無法在獨立單元之間進行數(shù)據(jù)交換,因此涉及其他頂點的計算需要在外部程序中預(yù)先求出,再作為常量參數(shù)Uniform或頂點的屬性參數(shù)Attribute傳給著色器。
其中Uniform參數(shù)是綁定到整個著色器、用于所有頂點的參數(shù),而Attribute參數(shù)則是綁定到每個獨立頂點的參數(shù),通常為與頂點數(shù)組等大的數(shù)組[13-15]。為保證著色器的效率,應(yīng)盡量使用Uniform傳參。
根據(jù)該算法的基本思想,對于中心漸變填充,選擇將漸變半徑和漸變基準(zhǔn)點坐標(biāo)作為Uniform常量參數(shù)傳遞給著色器;對于線性漸變填充,則將漸變半徑、中心點坐標(biāo),以及漸變方向向量作為常量參數(shù)傳遞給著色器,其中線性漸變半徑使用二維向量vec2類型以承載漸變基準(zhǔn)兩側(cè)的半徑值。
圖2給出了基于可編程圖形管線的漸變填充繪制過程及每個計算階段的輸入輸出內(nèi)容,大致可以分為在CPU中進行的預(yù)處理計算過程和在GPU中進行的計算和渲染過程。其中頂點著色器和片元著色器替代了固定管線渲染中原有的固定功能操作模塊,通過將原本在CPU中串行計算的部分轉(zhuǎn)移到著色器中進行并行計算,以提升整個計算和繪制過程的效率。
圖2 計算和繪制過程
以下給出著色程序的核心代碼,用于并行計算弧面上各點顯示的顏色,分別被頂點著色器和片元著色器執(zhí)行:
(1)頂點著色器。
uniform vec4 mainColor;//漸變主色
uniform vec4 subColor;//漸變輔色
uniform vec2 centerNode;//漸變基準(zhǔn)位置
uniform vec2 radius;//兩側(cè)漸變半徑值
uniform vec2 angle;//漸變方向角度,為減少三角函數(shù)計算使用方向向量代替
varying vec4 vertexColor;//頂點顏色
floatpara;//顏色混合參數(shù)
vec2 vector=gl_Vertex.xy-centerNode.xy;//由漸變基準(zhǔn)指向頂點的向量
float distance=dot(vector,angle)/length(angle);//頂點向量沿漸變方向向量的投影距離,大于0表示向量夾角小于90°,反之大于90°
if(distance<0.0) para=distance/radius.x;//計算顏色混合參數(shù),向量夾角大于90°時應(yīng)用左側(cè)的漸變半徑計算,反之應(yīng)用右側(cè)漸變半徑計算
elsepara=distance/radius.y;
vertexColor=subColor*para+mainColor*(1-para);//計算頂點顏色
transform();//頂點MVP矩陣變換
(2)片元著色器。
varying vec4vertexColor;
gl_FragColor=vertexColor;//渲染像素顏色
圖3給出了基于可編程渲染管線繪制對地球上某弧面分別進行輻射漸變和線性漸變填充的效果。AB為漸變基準(zhǔn)位置不同的輻射漸變填充,CD為漸變方向和顏色權(quán)重不同的線性漸變填充。其中C表示漸變角度為0°,兩種顏色權(quán)重均為0.5的線性漸變填充效果;D表示漸變角度為135°,顏色權(quán)重分別為0.3和0.7的效果。AC的填充中未使用α通道。
圖3 漸變填充效果
圖4給出了使用著色器渲染的實驗組與使用固定管線繪制的對照組在性能上的比對結(jié)果,分別從運行時間和顯示幀率進行對照,展示了在單一繪制對象內(nèi),隨著頂點數(shù)目和三角面片數(shù)目的增加,不同的繪制方案呈現(xiàn)的性能趨勢。其中實線代表實驗組的測試結(jié)果,虛線代表對照組的測試結(jié)果。測試結(jié)果統(tǒng)計均基于算法相對復(fù)雜的線性漸變填充。
由圖4可以看出,在三角面數(shù)量較少、網(wǎng)格較為簡單時,二者并未呈現(xiàn)較大的性能差異;當(dāng)三角網(wǎng)格數(shù)目達(dá)到十萬級時,對照組的顯示幀率已經(jīng)開始大幅降低,達(dá)到百萬級時,幀率已經(jīng)下降到20幀以下,幾乎不足以支持流暢顯示;而即使三角網(wǎng)格數(shù)目達(dá)到100萬時,實驗組仍能保持流暢的顯示,幀率維持在30幀以上,直到數(shù)量接近200萬時才不足20幀。對照組的運行時間始終呈線性增長趨勢,實驗組運行時間則僅在數(shù)量級跨度較大時有少量的增加,在三角面數(shù)量接近200萬時,二者的運行時間差異有5倍之多。
由測試結(jié)果可以得出,使用著色器繪制的弧面漸變填充算法有著明顯的性能優(yōu)勢,尤其針對繪制對象數(shù)量較少而三角面數(shù)較多的復(fù)雜線面標(biāo)號,能表現(xiàn)出遠(yuǎn)優(yōu)于傳統(tǒng)固定管線繪制的性能。在渲染管線內(nèi)使用著色器編程,更充分應(yīng)用了GPU的計算能力,使得每個獨立的頂點計算能夠并行進行,極大地縮短了計算時間,優(yōu)化了顯示效果。
圖4 兩種繪制策略在單一繪制對象中
針對傳統(tǒng)固定管線渲染方法在沿地球弧面的三維線面標(biāo)號漸變填充性能上表現(xiàn)出的不足,提出了基于GPU并行計算的性能優(yōu)化方法。實驗結(jié)果表明,通過在渲染管線過程中使用著色器編程,提高了算法對GPU的利用率,使得對于頂點的部分計算過程能夠并行進行,極大提升了圖形的繪制效率,同時也減少了頂點部分屬性數(shù)組在空間上的占用,實現(xiàn)了較高性能應(yīng)用于光滑弧面的兩種漸變填充效果;同時通過在線面標(biāo)號漸變填充這一典型實例上的應(yīng)用和大量數(shù)據(jù)測試,驗證了著色器在大量點線面數(shù)據(jù)處理上的高效率。
[1] 韓李濤,范克楠.三維地形顏色漸變渲染的光滑過渡方法研究[J].地球信息科學(xué)學(xué)報,2015,17(1):31-36.
[2] 張 旭,戴 寧,廖文和,等.基于三維漸變的牙齒磨耗可視化仿真[J].機械工程學(xué)報,2013,49(3):95-100.
[3] 簡洪登,范湘濤.基于GLSL的多重視頻紋理映射與融合[J].計算機工程與設(shè)計,2014,35(11):3873-3878.
[4] MILOSAVLJEVI? A,DIMITRIJEVI? A,RAN?I? D.GIS-augmented video surveillance[J].International Journal of Geographical Information Science,2010,24(9):1415-1433.
[5] 裘 初,費廣正,石民勇.可編程圖形硬件綜述[J].北京廣播學(xué)院學(xué)報:自然科學(xué)版,2004,11(3):13-19.
[6] 王俊杰,徐小剛,胡運發(fā),等.魚眼投影在虛擬實景中的應(yīng)用研究[J].小型微型計算機系統(tǒng),2004,25(2):287-290.
[7] 蘆鴻雁.基于層次包圍盒的碰撞檢測算法研究[J].計算機與數(shù)字工程,2008,36(2):23-25.
[8] 李運鋒,劉修國.基于方向包圍盒投影轉(zhuǎn)換的輪廓線拼接算法[J].計算機應(yīng)用,2011,31(12):3353-3356.
[9] CIRNE M V M,PEDRINI H.Marching cubes technique for volumetric visualization accelerated with graphics processing units[J].Journal of the Brazilian Computer Society,2013,19(3):223-233.
[10] WATSON B,LUEBKE D.The ultimate display:where will all the pixels come from[J].Computer,2005,38(8):54-61.
[11] 韓俊剛,蔣 林,杜慧敏,等.一種圖形加速器和著色器的體系結(jié)構(gòu)[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2010,22(3):363-372.
[12] 黃 龍.基于GLSL三維渲染效果的研究與應(yīng)用[D].西安:西安科技大學(xué),2014.
[13] WOO J H,SOHN J H,KIM H,et al.A 195 mW,9.1M vertices/s fully programmable 3-D graphics processor for low power mobile devices[J].IEEE Journal of Solid-State Circuits,2008,43(11):2370-2380.
[14] 陳繼選,王毅剛.基于OSG的GLSL著色器編輯環(huán)境[J].計算機系統(tǒng)應(yīng)用,2011,20(3):153-156.
[15] WOLF D.OpenGL4.0 shading language cookbook[M].[s.l.]:PACKT Publishing,2011.