矢量在全球規(guī)則格網(wǎng)地形上的疊加繪制方法

孫寅樂,宋關(guān)福,馮振華

(1.中國科學(xué)院地理科學(xué)與資源研究所,北京100101;2.中國科學(xué)院大學(xué),北京100039;3.北京超圖軟件股份有限公司,北京100015)

論文來源:《地理與地理信息科學(xué)》 2013年11月 第29卷第6期

摘要:為了精確、高效地將傳統(tǒng)的且對地形有約束作用的二維矢量數(shù)據(jù)疊加繪制到多分辨率全球地形上,提出了一種基于矢量高程紋理矢量疊加繪制方法。首先將矢量高程渲染到矢量高程紋理金字塔中,然后在GPU中采用膨脹方法對高程紋理進(jìn)行處理,在繪制地形網(wǎng)格時根據(jù)從矢量高程紋理中的采樣值調(diào)整頂點(diǎn)高度,最后疊加繪制矢量網(wǎng)格。實(shí)驗表明,該方法可與Clipmap等主流多分辨率規(guī)則格網(wǎng)地形模型結(jié)合,在地形上精確繪制矢量,并有效解決由于地形網(wǎng)格精度導(dǎo)致的矢量邊緣被地形遮擋問題。

關(guān)鍵詞: 矢量數(shù)據(jù),三維地形,繪制,高程紋理

A Method for Rendering Vector Data over Global 3D Regular Terrain Grid

SUN Yinle,SONG Guanfu,F(xiàn)ENG Zhenhua

(1.Institute of Geographic Sciences and Natural Resources Research,Chinese Academy of Sciences,Beijing100101;2.University of Chinese Academy of Sciences,Beijing100039;3.SuperMap Software Co.Ltd.,Beijing100015,China)

Abstract:To display traditional 2D vector data which constraints the terrain,on a 3D multi-resolution terrain model,a method based on elevation textures of vector data has been proposed in this paper. The elevation of vectors was saved in a dynamic pyramid of textures and the footprint of vectors in elevation texture was expanded in GPU. When rendering the terrain,the height of the vertex was modified according to the value read from vector elevation texture. Then meshes of vector data were constructed and rendered.The result of an experiment indicates that vector data and its edges could be rendered accurately and correctly. In addition,this method is suited to work with most of major terrain LOD algorithms.

Keywords:vector data; 3D terrain; rendering; elevation texture

  一個三維場景通常由地形和地形表面上的矢量共同構(gòu)成。由此產(chǎn)生一個問題,如何在三維地形上疊加繪制矢量。特別是當(dāng)前多數(shù)三維場景均采用了多分辨率地形模型,使得地形幾何表面隨視點(diǎn)變化[1],這增加了問題的難度。已有的研究集中于如何將矢量數(shù)據(jù)緊貼著地形繪制到場景中[2-4],這種繪制方法對于抽象化的矢量符號是足夠的,但在具有真實(shí)感的場景中,矢量數(shù)據(jù)的存在往往會對地形產(chǎn)生約束作用[5](如道路和湖泊所在地形應(yīng)該是平的、河流不能向高處流等),對于這種情況下矢量在地形上的疊加繪制研究較少。文獻(xiàn)[5]提出采用足跡紋理和高程紋理合成繪制矢量地形的方法,但其論述是基于平面場景的,而對于如何將足跡紋理應(yīng)用到規(guī)則球面地形網(wǎng)格及如何解決地形網(wǎng)格精度不夠時的矢量壓蓋等關(guān)鍵問題并未深入探討。

  受文獻(xiàn)[5]啟發(fā),本文以面狀矢量要素為例,提出了GPU友好的在規(guī)則球面地形網(wǎng)格上疊加繪制矢量數(shù)據(jù)的方法,并對其中出現(xiàn)的矢量邊緣被地形壓蓋的問題進(jìn)行了分析和改進(jìn)。本文采用的矢量繪制方法主要分為4個步驟:1)將要繪制的矢量數(shù)據(jù)預(yù)先正射的繪制到一張32位浮點(diǎn)型矢量高程紋理上,這張紋理稱為矢量高程紋理;2)對矢量高程紋理進(jìn)行膨脹修正,以避免矢量邊緣被地形壓蓋的問題;3)在繪制地形網(wǎng)格的頂點(diǎn)著色器中,從矢量高程紋理中采樣出高程值,據(jù)此修改頂點(diǎn)高程;4)將要繪制的矢量構(gòu)建成三角網(wǎng),然后進(jìn)行繪制。

1地形數(shù)據(jù)的組織

  為平衡全球海量地形的渲染質(zhì)量和速度,一般采用面向全球的多分辨率金字塔模型組織地形[6]。這種技術(shù)把全球地形按經(jīng)緯度分成不同的層和塊,所有地形塊的地形網(wǎng)格連在一起,構(gòu)成全球地形網(wǎng)格。當(dāng)視點(diǎn)移動時,需將已不在視錐體內(nèi)的地形塊從內(nèi)存中卸載,并用新的地形塊替換。當(dāng)視點(diǎn)向地球靠近時,使用精細(xì)的地形塊替換粗糙的地形塊。相反,當(dāng)視點(diǎn)離開地球時,使用粗糙的地形塊替換精細(xì)的地形塊。參考文獻(xiàn)[1]中的方法組織并繪制地形,建立一個以視點(diǎn)為中心的L層,每一層由M*M個四邊形組成地形網(wǎng)格金字塔,每一層網(wǎng)格的邊長是相鄰粗糙層的1/2。不同地形層間的關(guān)系和每個地形塊內(nèi)的網(wǎng)格結(jié)構(gòu)如圖1所示。

圖1不同層地形間的關(guān)系和結(jié)構(gòu)
Fig.1Relationship between different terrain levels

2矢量高程紋理的繪制

  2.1矢量高程紋理的組織

  通過把同一層地形塊范圍內(nèi)的矢量數(shù)據(jù)正射的繪制到與地形范圍重合的浮點(diǎn)紋理上來獲得矢量高程紋理,其與傳統(tǒng)基于紋理的矢量繪制方法不同的是,寫入紋理的數(shù)據(jù)是矢量高程。

  為了減少紋理分辨率引起的變形,并控制紋理開銷,本文采用實(shí)時紋理金字塔技術(shù)[3]管理矢量高程紋理,將矢量高程動態(tài)繪制到數(shù)量和范圍與地形層次相同的L張紋理上。由于精細(xì)層范圍是粗糙層范圍的1/4,但用的紋理分辨率相同,這就保證了越靠近視點(diǎn)使用的高程紋理越精細(xì)。

  2.2紋理坐標(biāo)和紋理矩陣的計算

  為把球面上地形網(wǎng)格的頂點(diǎn)映射到矢量高程紋理上,采用切圓柱墨卡托投影將球面投影到平面矩形上,并以矩形的左上角點(diǎn)為原點(diǎn),緯線方向為u軸,經(jīng)線方向為v軸,建立圖2所示紋理坐標(biāo)系。

圖2球面坐標(biāo)和紋理坐標(biāo)的映射
Fig.2Mapping between texture coordinate and geographic coordinate

  采用下式計算每個地形頂點(diǎn)的紋理坐標(biāo)(u,v):

  式中:x為頂點(diǎn)經(jīng)度,西經(jīng)為負(fù),東經(jīng)為正;y為頂點(diǎn)緯度,北緯為正,南緯為負(fù)。計算出的坐標(biāo)稱為全局紋理坐標(biāo),為將其映射為每個矢量紋理的坐標(biāo),需對其進(jìn)行矩陣變換:

  其中:ω、φ分別為矢量紋理左、右上角經(jīng)度,width為矢量高程紋理u方向跨過的經(jīng)度,height為v方向跨過的緯度。因為GPU所能接受的紋理坐標(biāo)精度為32位浮點(diǎn)型,為了減小舍入誤差,提高紋理坐標(biāo)精度,為每個頂點(diǎn)紋理坐標(biāo)擴(kuò)大了2L倍,L為頂點(diǎn)所在層號,所以實(shí)際采用的紋理矩陣是:

  通過把每一層紋理的全局紋理坐標(biāo)范圍傳給GPU,可以在繪制地形的頂點(diǎn)著色器中計算出當(dāng)前頂點(diǎn)所位于的最精細(xì)層是哪一層,然后把其全局紋理坐標(biāo)乘以相應(yīng)層的紋理矩陣,從而獲得用來在矢量高程紋理中采樣的紋理坐標(biāo)。

  2.3動態(tài)生成矢量高程紋理

  文獻(xiàn)[2]為了解決矢量覆蓋區(qū)地形和周邊地形間的平滑過渡問題,引入了Z曲線,但采用此方法需要把矢量在構(gòu)建三角網(wǎng)時劃分為邊界和內(nèi)部兩部分,使得問題復(fù)雜化。本文只考慮強(qiáng)制地形位于矢量下方的情況,因此只需把矢量的高程保存到矢量三角剖分后的頂點(diǎn)屬性中,就可以在片元著色器中將矢量高程寫入紋理中。

  根據(jù)當(dāng)前繪制的最粗糙層的范圍,從矢量圖層中查詢出范圍內(nèi)的矢量紋理,將矢量三角剖分為三角鏈后,采用正射投影的方式繪制矢量。以32位浮點(diǎn)紋理作為矢量紋理,將紋理默認(rèn)值設(shè)置為一個極大值作為非法值,將矢量高程寫入紋理中,這一過程在片元著色器中完成。

3矢量高程紋理的膨脹修正及對地形高程的修改

  3.1矢量邊緣壓蓋問題

  在使用矢量高程紋理修改地形的過程中,由于矢量覆蓋區(qū)域與高程紋理柵格并不重合,會引起矢量邊緣的精度損失。如圖3所示,虛線網(wǎng)格為矢量高程紋理的柵格結(jié)構(gòu),實(shí)線區(qū)域為原始的矢量范圍,黑色區(qū)域為寫入矢量高程紋理的矢量范圍,灰色區(qū)域為矢量邊緣精度損失部分。這會導(dǎo)致當(dāng)矢量疊加繪制到地形后,其邊緣被地形壓蓋、閃爍等現(xiàn)象(圖4)。

圖3矢量邊界精度損失示意
Fig.3 Loss of precision on vector border

  

圖4矢量邊界部分被地形網(wǎng)格覆蓋
Fig.4 Boundary region of vector is covered by terrain

  可以通過提高矢量高程紋理分辨率和地形網(wǎng)格密度來減少邊緣精度損失。對于平面場景,可通過將一小塊規(guī)則網(wǎng)格不斷地平移和縮放聯(lián)結(jié)成整個場景的地形,因此對這一小塊地形提高精度對其渲染性能影響不大。但是對于球面場景,由于不同緯度的四邊形網(wǎng)格形狀不同,需要把整套網(wǎng)格頂點(diǎn)放在頂點(diǎn)緩沖區(qū)并進(jìn)行渲染,所以提高地形格網(wǎng)密度對性能影響很大。

  3.2膨脹修正方法

  對矢量紋理進(jìn)行“膨脹”操作,使得到的矢量高程紋理比原來大一圈,以保證修改后的矢量在高程紋理上的對應(yīng)像素區(qū)域能夠完全包含矢量本身的范圍。需要確定這個膨脹范圍多大合適,膨脹范圍應(yīng)該恰好能夠比膨脹前多壓蓋一個地形網(wǎng)格。由于每一層地形都對應(yīng)一張矢量紋理,紋理的大小p*p和每層的地形網(wǎng)格數(shù)n都是固定的,所以每個地形網(wǎng)格的一條邊占用了紋理上的p/n個像素。所以為了使得在紋理上膨脹的部分能夠壓蓋一個完整網(wǎng)格,需要膨脹√2p/n個像素。

  圖像膨脹操作的基本原理是:用一個(2k+1)*(2k+1)大小的結(jié)構(gòu)元素掃描原圖像的每個元素,用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果都為0,則結(jié)果圖像的該元素為0,否則為1,其結(jié)果圖像將比原圖像擴(kuò)大k個像素大小的一圈。根據(jù)上述計算結(jié)果,結(jié)構(gòu)元素k=√2*p/n。

  為了提高膨脹操作的速度,把它放在GPU中處理。方法是繪制一個大小與矢量紋理相同的與屏幕對齊的矩形到一個32位浮點(diǎn)紋理中,在片元著色器中以原始圖像作為紋理輸入,進(jìn)行膨脹操作。其glsl語言的片元著色器代碼如下:

const int KernelSize=170;
uniform sample2D baseImage
uniform vec2 offset[KernelSize];
uniform float MAXVALUE;
void main(){
  float heightValue=0.0;
  float resultHeightValue=0.0;
  resultHeightValue=texture2D(baseImage,gl_TexCoord[0].st);
  for(int i=0;i  heightValue=texture2D(baseImage,gl_TexCoord[0].st+offset[i]);
  if(heightValue!=MAXVALUE){
    resultHeightValue=heightValue;
      break;
 ?。?BR>}
  gl_FragColor=vec4(resultHeightValue);

  其中:KernelSize為(2k+1)*(2k+1),baseImage為原始的矢量紋理,offset數(shù)組保存的是結(jié)構(gòu)元素矩陣中每個元素相對于矩陣中心的偏移量。MAX-VALUE是矢量紋理中沒有被矢量覆蓋區(qū)域存儲的標(biāo)識值。

  3.3使用矢量高程紋理修改地形高程

  繪制地形時,在頂點(diǎn)著色器中根據(jù)頂點(diǎn)紋理坐標(biāo)分別從矢量紋理和高程紋理中采樣出紋理值,以矢量紋理中的非極大值的采樣值修改地形頂點(diǎn)高度。在以球心為原點(diǎn)的世界坐標(biāo)系中,球面網(wǎng)格頂點(diǎn)可由下式計算:

  

  在地形頂點(diǎn)著色器中,可按下式調(diào)整頂點(diǎn)位置:

  

  pos.xyz=pos.xyz*(Radius+h)/Radius

  其中:Radius為地球半徑,latitude和longitude為頂點(diǎn)經(jīng)緯度,h為從矢量高程紋理中獲得的采樣值。

4矢量的疊加繪制

  采用墨卡托切圓柱投影將面狀矢量的頂點(diǎn)投影到一個橫軸為經(jīng)度、縱軸為緯度的矩形平面上,在此平面坐標(biāo)系下進(jìn)行三角剖分,將面狀矢量轉(zhuǎn)化為一個相互連接的三角網(wǎng)結(jié)構(gòu),由式(1)得到矢量頂點(diǎn)在三維空間中的位置。這樣一個二維面狀矢量就轉(zhuǎn)化為了三維空間中一個隨地球彎曲的三角形構(gòu)成的折面,將此折面疊加繪制到修改過高程的地形上即可。

  當(dāng)面狀矢量范圍很大,此時矢量折面與球面地形貼合不好,可用模板陰影體法代替上述方法。

5實(shí)驗結(jié)果

  在Win32平臺下,基于C++和OGRE渲染引擎構(gòu)建了一個驗證系統(tǒng)。動態(tài)繪制6層地形網(wǎng)格,每一層包含64*64個四邊形地形網(wǎng)格,每一個網(wǎng)格剖分為2個三角片。默認(rèn)視場角為90°,屏幕分辨率為1440*900,由此計算出最精細(xì)層地形三角面占大約30.625個像素。使用6張1024*1024分辨率的紋理作為矢量高程紋理,此時紋理資源大小為24M。紋理覆蓋范圍與地形網(wǎng)格相應(yīng)層對應(yīng)。

  實(shí)驗中采用上文提出的方法以解決在地形上疊加繪制水體的問題,通過“展平”水體矢量所覆蓋地形,使得水體不被地形所遮擋。實(shí)驗地形數(shù)據(jù)采用京津地區(qū)分辨率為30m的地形數(shù)據(jù),矢量數(shù)據(jù)采用京津地區(qū)湖泊數(shù)據(jù)。圖5a為沒有采用本文方法時水體矢量被地形遮擋的情況,圖5b為采用本文方法后矢量與地形的疊合情況,圖6a為使用矢量高程紋理修改地形前后的地形網(wǎng)格情況。可見通過矢量高程修改紋理,可以有效解決矢量數(shù)據(jù)被地形遮擋的問題。

  

圖5采用矢量高程紋理方法前后效果對比
Fig.5 Comparison between before and after using the method in this paper

  

圖6修改地形網(wǎng)格前后對比
Fig.6 Comparison of terrain grids between before and after using the method in this paper

 

6結(jié)語

  本文提出了基于矢量高程紋理在球面規(guī)則地形網(wǎng)格上疊加繪制矢量的方法。理論和實(shí)驗證明,通過把矢量動態(tài)繪制到6張矢量高程紋理上,再在GPU頂點(diǎn)著色器中動態(tài)修改地形高程,可以有效地解決由于地形數(shù)據(jù)和矢量數(shù)據(jù)精度不同導(dǎo)致的地形遮擋矢量問題。通過對矢量高程紋理進(jìn)行膨脹操作,使矢量的邊界部分不會被地形網(wǎng)格遮擋。

參考文獻(xiàn):

  [1]ARSIRVATHAM A,HOPPE H.GPU Gems2[M]. New Jersey:Addison Wesley,2005.27-44.

  [2]WEBER A,BENNER J. Interactive generation of digital terrain models using multiple data sources[A]. First International Symposium on Digital Earth Moving[C]. Switzerland:Manno(Lugano),2001.60-64.

  [3]KERSTING O,DOLLNER J. Interactive 3D visualization of vector data in GIS [A]. Proceedings of the 10th ACM International Symposium on Advances in Geographic Information Systems[C]. VA,USA:McLean,2002.107-112.

  [4]SCHNEIDER M,KLEIN R.Efficient and accurate rendering of vector data on virtual landscapes [J] . WSCG,2007,15(3):59-65.

  [5]BRUNETON E,NEYRET F.Real-time rendering and editing of vector-based terrains[J].Euro.graphics Proceedings,2008,27:311-320.

  [6]杜瑩,武玉國,王曉明,等.全球多分辨率虛擬地形環(huán)境的金字塔模型研究[J].系統(tǒng)仿真學(xué)報,2006,18(4):955-958.

作者簡介:孫寅樂(1986-),男,碩士研究生,主要研究方向為三維地理信息系統(tǒng)。