(1.中國科學院地理科學與資源研究所,北京100101;2.中國科學院大學,北京100039;3.北京超圖軟件股份有限公司,北京100015)
論文來源:《地理與地理信息科學》 2013年11月 第29卷第6期
摘要:為了精確、高效地將傳統(tǒng)的且對地形有約束作用的二維矢量數(shù)據(jù)疊加繪制到多分辨率全球地形上,提出了一種基于矢量高程紋理矢量疊加繪制方法。首先將矢量高程渲染到矢量高程紋理金字塔中,然后在GPU中采用膨脹方法對高程紋理進行處理,在繪制地形網格時根據(jù)從矢量高程紋理中的采樣值調整頂點高度,最后疊加繪制矢量網格。實驗表明,該方法可與Clipmap等主流多分辨率規(guī)則格網地形模型結合,在地形上精確繪制矢量,并有效解決由于地形網格精度導致的矢量邊緣被地形遮擋問題。
關鍵詞: 矢量數(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
一個三維場景通常由地形和地形表面上的矢量共同構成。由此產生一個問題,如何在三維地形上疊加繪制矢量。特別是當前多數(shù)三維場景均采用了多分辨率地形模型,使得地形幾何表面隨視點變化[1],這增加了問題的難度。已有的研究集中于如何將矢量數(shù)據(jù)緊貼著地形繪制到場景中[2-4],這種繪制方法對于抽象化的矢量符號是足夠的,但在具有真實感的場景中,矢量數(shù)據(jù)的存在往往會對地形產生約束作用[5](如道路和湖泊所在地形應該是平的、河流不能向高處流等),對于這種情況下矢量在地形上的疊加繪制研究較少。文獻[5]提出采用足跡紋理和高程紋理合成繪制矢量地形的方法,但其論述是基于平面場景的,而對于如何將足跡紋理應用到規(guī)則球面地形網格及如何解決地形網格精度不夠時的矢量壓蓋等關鍵問題并未深入探討。
受文獻[5]啟發(fā),本文以面狀矢量要素為例,提出了GPU友好的在規(guī)則球面地形網格上疊加繪制矢量數(shù)據(jù)的方法,并對其中出現(xiàn)的矢量邊緣被地形壓蓋的問題進行了分析和改進。本文采用的矢量繪制方法主要分為4個步驟:1)將要繪制的矢量數(shù)據(jù)預先正射的繪制到一張32位浮點型矢量高程紋理上,這張紋理稱為矢量高程紋理;2)對矢量高程紋理進行膨脹修正,以避免矢量邊緣被地形壓蓋的問題;3)在繪制地形網格的頂點著色器中,從矢量高程紋理中采樣出高程值,據(jù)此修改頂點高程;4)將要繪制的矢量構建成三角網,然后進行繪制。
1地形數(shù)據(jù)的組織
為平衡全球海量地形的渲染質量和速度,一般采用面向全球的多分辨率金字塔模型組織地形[6]。這種技術把全球地形按經緯度分成不同的層和塊,所有地形塊的地形網格連在一起,構成全球地形網格。當視點移動時,需將已不在視錐體內的地形塊從內存中卸載,并用新的地形塊替換。當視點向地球靠近時,使用精細的地形塊替換粗糙的地形塊。相反,當視點離開地球時,使用粗糙的地形塊替換精細的地形塊。參考文獻[1]中的方法組織并繪制地形,建立一個以視點為中心的L層,每一層由M*M個四邊形組成地形網格金字塔,每一層網格的邊長是相鄰粗糙層的1/2。不同地形層間的關系和每個地形塊內的網格結構如圖1所示。
2矢量高程紋理的繪制
2.1矢量高程紋理的組織
通過把同一層地形塊范圍內的矢量數(shù)據(jù)正射的繪制到與地形范圍重合的浮點紋理上來獲得矢量高程紋理,其與傳統(tǒng)基于紋理的矢量繪制方法不同的是,寫入紋理的數(shù)據(jù)是矢量高程。
為了減少紋理分辨率引起的變形,并控制紋理開銷,本文采用實時紋理金字塔技術[3]管理矢量高程紋理,將矢量高程動態(tài)繪制到數(shù)量和范圍與地形層次相同的L張紋理上。由于精細層范圍是粗糙層范圍的1/4,但用的紋理分辨率相同,這就保證了越靠近視點使用的高程紋理越精細。
2.2紋理坐標和紋理矩陣的計算
為把球面上地形網格的頂點映射到矢量高程紋理上,采用切圓柱墨卡托投影將球面投影到平面矩形上,并以矩形的左上角點為原點,緯線方向為u軸,經線方向為v軸,建立圖2所示紋理坐標系。
采用下式計算每個地形頂點的紋理坐標(u,v):
式中:x為頂點經度,西經為負,東經為正;y為頂點緯度,北緯為正,南緯為負。計算出的坐標稱為全局紋理坐標,為將其映射為每個矢量紋理的坐標,需對其進行矩陣變換:
其中:ω、φ分別為矢量紋理左、右上角經度,width為矢量高程紋理u方向跨過的經度,height為v方向跨過的緯度。因為GPU所能接受的紋理坐標精度為32位浮點型,為了減小舍入誤差,提高紋理坐標精度,為每個頂點紋理坐標擴大了2L倍,L為頂點所在層號,所以實際采用的紋理矩陣是:
通過把每一層紋理的全局紋理坐標范圍傳給GPU,可以在繪制地形的頂點著色器中計算出當前頂點所位于的最精細層是哪一層,然后把其全局紋理坐標乘以相應層的紋理矩陣,從而獲得用來在矢量高程紋理中采樣的紋理坐標。
2.3動態(tài)生成矢量高程紋理
文獻[2]為了解決矢量覆蓋區(qū)地形和周邊地形間的平滑過渡問題,引入了Z曲線,但采用此方法需要把矢量在構建三角網時劃分為邊界和內部兩部分,使得問題復雜化。本文只考慮強制地形位于矢量下方的情況,因此只需把矢量的高程保存到矢量三角剖分后的頂點屬性中,就可以在片元著色器中將矢量高程寫入紋理中。
根據(jù)當前繪制的最粗糙層的范圍,從矢量圖層中查詢出范圍內的矢量紋理,將矢量三角剖分為三角鏈后,采用正射投影的方式繪制矢量。以32位浮點紋理作為矢量紋理,將紋理默認值設置為一個極大值作為非法值,將矢量高程寫入紋理中,這一過程在片元著色器中完成。
3矢量高程紋理的膨脹修正及對地形高程的修改
3.1矢量邊緣壓蓋問題
在使用矢量高程紋理修改地形的過程中,由于矢量覆蓋區(qū)域與高程紋理柵格并不重合,會引起矢量邊緣的精度損失。如圖3所示,虛線網格為矢量高程紋理的柵格結構,實線區(qū)域為原始的矢量范圍,黑色區(qū)域為寫入矢量高程紋理的矢量范圍,灰色區(qū)域為矢量邊緣精度損失部分。這會導致當矢量疊加繪制到地形后,其邊緣被地形壓蓋、閃爍等現(xiàn)象(圖4)。
可以通過提高矢量高程紋理分辨率和地形網格密度來減少邊緣精度損失。對于平面場景,可通過將一小塊規(guī)則網格不斷地平移和縮放聯(lián)結成整個場景的地形,因此對這一小塊地形提高精度對其渲染性能影響不大。但是對于球面場景,由于不同緯度的四邊形網格形狀不同,需要把整套網格頂點放在頂點緩沖區(qū)并進行渲染,所以提高地形格網密度對性能影響很大。
3.2膨脹修正方法
對矢量紋理進行“膨脹”操作,使得到的矢量高程紋理比原來大一圈,以保證修改后的矢量在高程紋理上的對應像素區(qū)域能夠完全包含矢量本身的范圍。需要確定這個膨脹范圍多大合適,膨脹范圍應該恰好能夠比膨脹前多壓蓋一個地形網格。由于每一層地形都對應一張矢量紋理,紋理的大小p*p和每層的地形網格數(shù)n都是固定的,所以每個地形網格的一條邊占用了紋理上的p/n個像素。所以為了使得在紋理上膨脹的部分能夠壓蓋一個完整網格,需要膨脹√2p/n個像素。
圖像膨脹操作的基本原理是:用一個(2k+1)*(2k+1)大小的結構元素掃描原圖像的每個元素,用結構元素與其覆蓋的二值圖像做“與”操作,如果都為0,則結果圖像的該元素為0,否則為1,其結果圖像將比原圖像擴大k個像素大小的一圈。根據(jù)上述計算結果,結構元素k=√2*p/n。
為了提高膨脹操作的速度,把它放在GPU中處理。方法是繪制一個大小與矢量紋理相同的與屏幕對齊的矩形到一個32位浮點紋理中,在片元著色器中以原始圖像作為紋理輸入,進行膨脹操作。其glsl語言的片元著色器代碼如下:
const int KernelSize=170;其中:KernelSize為(2k+1)*(2k+1),baseImage為原始的矢量紋理,offset數(shù)組保存的是結構元素矩陣中每個元素相對于矩陣中心的偏移量。MAX-VALUE是矢量紋理中沒有被矢量覆蓋區(qū)域存儲的標識值。
3.3使用矢量高程紋理修改地形高程
繪制地形時,在頂點著色器中根據(jù)頂點紋理坐標分別從矢量紋理和高程紋理中采樣出紋理值,以矢量紋理中的非極大值的采樣值修改地形頂點高度。在以球心為原點的世界坐標系中,球面網格頂點可由下式計算:
在地形頂點著色器中,可按下式調整頂點位置:
pos.xyz=pos.xyz*(Radius+h)/Radius
其中:Radius為地球半徑,latitude和longitude為頂點經緯度,h為從矢量高程紋理中獲得的采樣值。
4矢量的疊加繪制
采用墨卡托切圓柱投影將面狀矢量的頂點投影到一個橫軸為經度、縱軸為緯度的矩形平面上,在此平面坐標系下進行三角剖分,將面狀矢量轉化為一個相互連接的三角網結構,由式(1)得到矢量頂點在三維空間中的位置。這樣一個二維面狀矢量就轉化為了三維空間中一個隨地球彎曲的三角形構成的折面,將此折面疊加繪制到修改過高程的地形上即可。
當面狀矢量范圍很大,此時矢量折面與球面地形貼合不好,可用模板陰影體法代替上述方法。
5實驗結果
在Win32平臺下,基于C++和OGRE渲染引擎構建了一個驗證系統(tǒng)。動態(tài)繪制6層地形網格,每一層包含64*64個四邊形地形網格,每一個網格剖分為2個三角片。默認視場角為90°,屏幕分辨率為1440*900,由此計算出最精細層地形三角面占大約30.625個像素。使用6張1024*1024分辨率的紋理作為矢量高程紋理,此時紋理資源大小為24M。紋理覆蓋范圍與地形網格相應層對應。
實驗中采用上文提出的方法以解決在地形上疊加繪制水體的問題,通過“展平”水體矢量所覆蓋地形,使得水體不被地形所遮擋。實驗地形數(shù)據(jù)采用京津地區(qū)分辨率為30m的地形數(shù)據(jù),矢量數(shù)據(jù)采用京津地區(qū)湖泊數(shù)據(jù)。圖5a為沒有采用本文方法時水體矢量被地形遮擋的情況,圖5b為采用本文方法后矢量與地形的疊合情況,圖6a為使用矢量高程紋理修改地形前后的地形網格情況??梢娡ㄟ^矢量高程修改紋理,可以有效解決矢量數(shù)據(jù)被地形遮擋的問題。
6結語
本文提出了基于矢量高程紋理在球面規(guī)則地形網格上疊加繪制矢量的方法。理論和實驗證明,通過把矢量動態(tài)繪制到6張矢量高程紋理上,再在GPU頂點著色器中動態(tài)修改地形高程,可以有效地解決由于地形數(shù)據(jù)和矢量數(shù)據(jù)精度不同導致的地形遮擋矢量問題。通過對矢量高程紋理進行膨脹操作,使矢量的邊界部分不會被地形網格遮擋。
參考文獻:
[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)仿真學報,2006,18(4):955-958.
作者簡介:孫寅樂(1986-),男,碩士研究生,主要研究方向為三維地理信息系統(tǒng)。