專利名稱:面向gpu的大規模地形快速繪制方法
技術領域:
本發明涉及計算機圖形學領域,尤其涉及一種面向GPU的大規模地形快速繪制方法。
背景技術:
地形是自然界中最常見的景物,它與人們的生活密切相關。三維地形繪制技術一直都是計算機圖形學的研究熱點,近年來,它的發展與進步對國民經濟的各個方面產生了重大影響,推動著信息時代的不斷向前發展。隨著攝影測量和衛星遙感技術的快速發展,人們可以得到的地形數據精度越來越高,隨之而來的是急劇增加的地形數據量,而對于計算機硬件來說,雖然在同一時期也經歷 了快速發展的階段,但是與無限增長的地形數據量相比,硬件的發展總是顯得比較滯后,在一定的幀頻下,計算機硬件每秒只能繪制有限數量的三角形面片,這便造成了有限的計算機硬件水平同海量地形數據之間的矛盾,因此對大規模地形進行高精度的繪制往往難以獲得令人滿意的繪制效率。一種有效提升地形繪制效率的方法是降低地形模型的精度,即采用一種精度較低的模型表示同一區域的地形進而實現繪制,層次細節(LOD)技術正是出于這樣的考慮,通過簡化整個場景的復雜度,減少參與繪制的數據量,緩解繪制精度和繪制效率之間的矛盾。另一種提高繪制效率的方法是外存(out-of-core)技術,由于地形數據規模很大,無法一次性將其載入內存,考慮對外存數據重新組織存于硬盤,在繪制時根據需要,將其部分載入,當然這就要求找到一種數據調度策略,目前主要采用的調度策略是通過建立索引來快速定位所需的數據塊,然后將它載入內存的。國內外學者在大規模地形繪制的研究上,取得了大量的研究成果,同時也提出了許多優秀的解決方案,但是由于人們對繪制精度和繪制效率二者的要求都很高,現有的解決方案都不能完美地二者兼顧。
發明內容
本發明主要解決的技術問題是提供一種面向GPU的大規模地形快速繪制方法。用以解決現有技術的諸多不足。為解決上述問題,本發明采用的一種技術方案是提供一種面向GPU的大規模地形快速繪制方法,包括以下步驟SI、生成原始地形的外存文件;其中,所述外存文件中存儲有包含原始地形數據的多個地形塊、每個所述地形塊的索引編號以及與所述地形塊相對應的壓縮紋理塊,所述地形數據包括紋理數據和高程數據;S2、根據預設視點參數確定地形的LOD層次分布,建立地形四叉樹結構,遍歷所述地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點,將選中的四叉樹節點添加到渲染調度隊列;其中,所述地形四叉樹結構的各個節點對應于所述外存文件中的相應壓縮地形塊,用于存儲相應壓縮地形塊的LOD層次及高程數據;
S3、從所述渲染調度隊列獲取將被調度的節點,并對所述將被高度的節點進行渲染,完成對原始地形的繪制。其中,所述SI包括以下步驟獲取原始地形的高程數據和紋理數據,并將所述原始地形的高程數據和紋理數據進行分層分塊處理,得到多個大小相同的地形塊及與所述地形塊相對應的紋理塊;對所述紋理塊進行壓縮,得到壓縮紋理塊,并為所述地形塊構建相應的索引編號;將所有所述地形塊及與每個地形塊相應的索引編號、壓縮紋理塊存儲于一文件中,得到外存文件。其中,所述S3中對所述將被調度的節點進行渲染,,完成對原始地形的繪制的步驟包括以下步驟 根據所述將被調度的節點獲取相應地形塊的地形數據;將所述地形塊的高程數據作為頂點紋理載入顯存,由固定的頂點緩存和索引緩存建立地形的平面網格模型;利用頂點著色器的頂點紋理拾取功能獲取地形網格的高程值,設置消除裂縫、跳躍現象的過渡帶,并進行頂點變換和片元處理,最終實現繪制。進一步的,所述SI采用的分層方法為采用隔行隔列法對所述原始地形的高程數據進行重采樣、采用雙線性插值法對所述原始地形的紋理數據進行重采樣。在上述實施方式中,所述SI壓縮所述初始地形塊的紋理數據時采用的壓縮算法為采用DXT算法。在本技術方案中,在所述S2的LOD層次分布中當視距增加一倍時,LOD級別降低一級。進一步的,所述S2在遍歷所述地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點的同時還執行下述步驟對所述地形四叉樹結構進行視錐體裁剪。在上述具體的實施方式中,所述對所述地形四叉樹結構進行視錐體裁剪具體為對當前四叉樹節點的包圍盒與視錐體進行相交測試,完成快速視錐體裁剪。本發明的有益效果是區別于現有技術不能夠有效提升地形繪制效率,本發明提供一種面向GPU的大規模地形快速繪制方法,通過結合out-of-core技術、LOD技術、可見性裁剪技術以及GPU加速技術,能夠有效地提高數據調度的效率,充分地發揮GPU的可編程性和加速能力,減輕CPU運算負擔,增加每秒可繪制三角形的數量,同時獲得很高的幀率,提高大規模地形繪制的效率。
圖I是一實施方式中面向GPU的大規模地形快速繪制方法的流程圖;圖2是另一實施方式中面向GPU的大規模地形快速繪制方法的流程圖;圖3是一實施方式中文件存儲結構示意圖;圖4是一實施方式中三角形條帶化方式;圖5是一實施方式中頂點幾何過渡原理圖;圖6是一實施方式中地形塊過渡帶設置示意圖。
具體實施例方式為詳細說明本發明的技術內容、構造特征、所實現目的及效果,以下結合實施方式并配合附圖詳予說明。請參閱圖1,本實施方式提供一種面向GPU的大規模地形快速繪制方法,包括以下步驟SI、生成原始地形的外存文件;其中,所述外存文件中存儲有包含原始地形數據的多個地形塊、每個所述地形塊的索引編號以及與所述地形塊相對應的壓縮紋理塊,所述地形數據包括紋理數據和高程數據;S2、根據預設視點參數確定地形的LOD層次分布,建立地形四叉樹結構,遍歷所述地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點,將選中的四叉樹節點添加 到渲染調度隊列;其中,所述地形四叉樹結構的各個節點對應于所述外存文件中的相應壓縮地形塊,用于存儲相應壓縮地形塊的LOD層次及高程數據;S3、從所述渲染調度隊列獲取將被調度的節點,并對所述將被高度的節點進行渲染,完成對原始地形的繪制。在如圖2所示的實施方式中,所述SI包括步驟S110、S120以及S130,具體如下文所述。S110、獲取原始地形的高程數據和紋理數據,并將所述原始地形的高程數據和紋理數據進行分層分塊處理,得到多個大小相同的地形塊及與所述地形塊相對應的紋理塊。在本實施方式中,對于分層處理過程,本方法采用隔行隔列法對所述原始地形的高程數據進行重采樣,這樣可以保證在相同地理位置的點的高程值保持不變,且可以重復使用高程值;采用雙線性插值法對所述原始地形的紋理數據進行重采樣,這樣對局部細節保存較好。在本領域中,對于分塊處理過程,分塊的規則主要有兩種等間距分塊和等面積分塊,由于等間距劃分方法簡單,檢索速度快,本方法采用等間距分塊。在本發明中,分塊的大小沒有具體的計算公式,需要根據繪制需要和硬件條件綜合考慮。在本實施方式中,分塊操作是從原始數據的左下角開始,按從左到右,從下到上的順序進行,對于最右側和頂部的邊緣數據塊,由于它們不能構成一個正方形塊,就以空數據補齊。在其他實施方式中,分塊操作的順序可從原始數據的左上角開始,按從左到右、從上到下的順序進行。在另外的實施方式中,分塊操作的順序可根據實際情況具體設定。S120、對所述紋理塊進行壓縮,得到壓縮紋理塊,并為所述地形塊構建相應的索引編號。與高程數據相比,紋理數據量相對較大,在分層分塊處理后會占用較多的外存空間,且紋理越精細,所占用的存儲空間就越大,在紋理數據傳輸時,還會占用較多帶寬,因此本方法對紋理進行合理地壓縮。紋理壓縮的方法有很多種,在本實施方式中,紋理壓縮時采用的壓縮算法為DXT (DirectX Texture Compress)。DXT分為五種壓縮格式DXTl、DXT2、DXT3、DXT4和DXT5,其中DXTl格式的壓縮比為6:1,適用于不帶Alpha分量的紋理。在本實施方式中,選用DXTl作為紋理壓縮的最終格式,應用于Direct3D生成壓縮紋理塊。由于每一個地形塊可以由LOD級別、行編號和列編號唯一表示,所以對數據的編碼也只需要考慮這三個因素。在本實施方式中,本方法采用ΠΝΤ32型整數來構建地形塊的索引編碼,其形式為(DataType (I), BlockLevel (5), BlockX (13), BlockY (13)),即第 I位記錄數據類型(高程數據或紋理數據),第2位到第6位記錄LOD級別,第7位到第19位記錄行編號,最后13位記錄列編號。S130、將所有所述地形塊及與每個地形塊相應的索引編號、壓縮紋理塊存儲于一文件中,得到外存文件。在本實施方式中,以文件形式存儲所有的地形塊數據,如圖3所示,文件分為文件頭區、塊索引區和塊數據區。其中文件頭區包含了對原始地形的地理信息描述、地形分層數、每層的縱橫向地形塊個數等信息。塊索引區包含所有地形塊的索引信息,記錄了每個地形塊在文件中的偏移量(以字節為單位)、數據塊的大小(以字節為單位),即該塊在地形文件中的起始位置和長度。在塊數據區中,地形塊的元數據包括地形塊編碼、地形塊表示地理范圍等信息。在上述實施方式中,S2步驟主要包括步驟S210、S220、S230,具體如下文所述。
S210、根據預設視點參數確定地形的LOD層次分布。其具體過程如下將視點與節點間的距離作為確定LOD分布的標準,設地形LOD層次數為n,第O層為最精細層,第η-i層為最粗糙層,構造地形的連續多分辨率模型時,以視點為中心,離視點較近的區域選用較精細層的節點表示,而離視點較遠的區域選用較粗糙層的節點表示。具體地,視距在Itl以內的區域選擇第O層節點表示,視距在Itl和I之間的區域選擇第I層節點表示,以此類推,視距在Ip1和Ii之間的區域選擇第i層節點表示,且滿足^=2 · Ig (I ^ i ^ n-1),其中Ilri為最大可視距離,是一個可調節參數,它的大小直接影響到整個地形總體的層次分布情況。進一步的,當視距增加一倍時,LOD級別降低一級。S220、建立地形四叉樹結構。其具體過程如下四叉樹結構由地形高程圖信息生成,樹的深度由地形的精度確定,它同地形的LOD層次數相對應。在本實施方式中,四叉樹結構的節點只保存每個節點的最大和最小高程值,用于計算節點的AABB包圍盒,節點的其他數據可以在遍歷四叉樹結構時動態獲取。四叉樹結構一旦建立,繪制期間便常駐內存,如果原始地形數據沒有發生變化它就不會改變。S230、遍歷所述地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點,將選中的四叉樹節點添加到渲染調度隊列。上述過程具體如下從四叉樹結構的根節點開始,也就是最低細節層次的節點,遍歷四叉樹為不同的細節層次選擇相應的四叉樹節點。對于第i層的節點,判斷其包圍盒與以視點為中心,Ii為半徑的球體與之間的位置關系,如果包圍體完全在球體之外,則退出對此節點的判斷,用其父節點代替它,將父節點加入到渲染調度隊列中,并繼續對其父節點的其他子節點進行判斷;如果球體和包圍體相交或包含,再進一步判斷以視點為中心,Ig為半徑的球體與包圍體之間的位置關系,如果包圍體完全在球體之外,則將此節點加入到渲染調度隊列中,否則對其子節點作判斷,遞歸重復此過程。進一步的,在上述實施方式的某些實施例中,在遍歷四叉樹結構的同時,還會執行對所述地形四叉樹結構進行視錐體裁剪的步驟。具體的實施過程如下通過確定包圍盒與視錐體的位置關系即可確定節點的可見性,也就是對當前四叉樹節點的包圍盒與視錐體進行相交測試,進而完成視錐體裁剪。在一實施例中,通過判斷包圍盒的八個頂點同視錐體的六個裁剪平面之間的位置關系來實現視錐體裁剪。在上述實施方式中,所述S3中對所述將被調度的節點進行渲染,完成對原始地形的繪制的步驟包括步驟S310、S320、S330,具體如下文所述。S310、根據所述將被調度的節點獲取相應地形塊的地形數據。此為對上述選中節點的調度過程,具體如下以地形塊為單位進行數據調度,預先開辟一個緩沖區用于接收地形塊的數據信息,并設置一個渲染隊列和一個緩沖區隊列,采用LRU (Least Recently Used)方式管理緩沖區中的地形數據,具體描述如下(I)把文件頭區的部分信息、地形塊索引區和地形塊元數據讀入內存,同時建立映射std: :map<uint32, Block*〉BlockMap,以地形塊編碼作為鍵值,以地形塊對象作為映射數據類型;
(2)將確定需要渲染的地形塊加入到渲染隊列中;(3)遍歷渲染隊列,提取隊列中的每一個地形塊編碼,對每一個地形塊查找其編碼是否存在于緩沖區隊列中,如果緩沖區隊列中存在其編碼,通過編碼值在BlockMap映射中獲取相對應的地形塊對象,并將地形塊的引用次數狀態量加1,同時將該地形塊的編碼置為-I ;如果在緩沖區隊列未找到其編碼,則執行下面的步驟以載入地形塊數據(3a)根據地形塊的編碼,解算出該地形塊對應的LOD級別,行編號,列編號;(3b)計算地形塊索引在索引文件中的具體位置,通過地形塊的索引獲得地形塊在文件中的偏移量和地形塊的大小;(3c)利用地形塊的編碼、高程數據和紋理數據等信息構建地形塊對象Block,并將Block對象加入到映射BlockMap中。在渲染隊列遍歷完成之后,執行下面的步驟以更新緩沖區(A)遍歷緩沖區隊列,在緩沖區隊列中,如果地形塊編碼值大于0,則將其刪除,釋放地形塊對象內存空間,并在映射中刪除鍵值為該編碼的元素,最后刪除在緩沖區隊列中的該編碼元素。對于緩沖區隊列中編碼值小于O的地形塊,根據其引用次數,決定是否將其刪除,對于引用次數最少的地形塊優先考慮將其釋放;(B)將渲染隊列中存在而緩沖區隊列中不存在的地形塊編碼插入到緩沖區隊列中,這些編碼將作為下一幀的緩沖區隊列的一部分。S320、將所述地形塊的高程數據作為頂點紋理載入顯存,由固定的頂點緩存和索弓I緩存建立地形的平面網格模型。將地形高程數據載入顯存的紋理緩沖區作為頂點紋理,在本方法中調用IDirect3DDevice9: : CreateTexture方法生成頂點紋理。進一步的,為了減少繪制函數調用的次數,我們將模型的網格轉化為三角形條帶,以葉子節點大小的規則塊為單位按三角形條帶的形式實現渲染,如圖4所示為5X5大小的地形塊三角形條帶遍歷方式和對應的順序索引列表。由于所有地形塊具有相同的拓撲結構和相同數量的頂點,且頂點的位置是在GPU中進行計算,為了進一步提高GPU的數據傳輸效率,所有地形塊可以使用一個固定的頂點和索引緩存,每個地形塊對應一組縮放和偏移參數,用于確定地形塊所表示的實際范圍以及在整個地形區域中的具體位置。同時,地形塊的內部也可以采用同樣的頂點連接方式,于是任意地形塊網格均可通過固定的索引序列生成具有規定頂點連接關系的三角形網,進而實現地形塊的渲染。S330、利用頂點著色器的頂點紋理拾取功能獲取地形網格的高程值,設置消除裂縫、跳躍現象的過渡帶,并進行頂點變換和片元處理,最終實現繪制。如圖5所示,V1和Vtl分別為在兩個相鄰層次中對應于相同平面坐標的頂點,在兩個層次切換過程中,利用過渡權值α使頂點在%和%間插值過渡,過渡過程中任意時刻的頂點位置V可表示為V=V「α · (V1-V0)。在地形塊中,處于不同區域內的頂點,其過渡權值α的作用也是不相同的,處于地形塊邊界處的頂點,其α用來保證地形塊間的無縫連接,而處于地形塊內部的頂點,其α用來保證LOD層次間的平滑過渡。在地形塊的邊界處設置一個過渡帶H,如圖6所示,平面坐標V處的頂點在某一時刻t的過渡權值α (t,v)可以由下式確定
atV 電 H α{ , V) = j disl,.rr
at +-(as ~a.)veH
h式中h為過渡帶的寬度,dist為平面坐標V到過渡帶內邊界的距離,a t為時間過渡權值,a s為外邊界處的空間過渡權值。對于時間過渡權值at,以整個地形塊為單位進行計算,為了簡化運算,忽略時間參數對at的影響,僅選取地形塊與視點間的距離參數來求取Cit,則a t=min (max ((D-Dmin) / (Dmax-Dmin), O), I)式中D為地形塊包圍盒與視點之間的最近距離,Dmin和Dmax為該細節層次的地形塊參與構網的兩個極限距離。對于空間過渡權值as,首先考察四個相鄰地形塊的層次級別,如果層次級別相同,則設置對應外邊界的空間過渡權值α 3為0,即當前塊的在外邊界處的頂點位置不變,如果相鄰地形塊的級別小于當前塊的級別,則設置對應外邊界的空間過渡權值asS 1,保證此邊界處的頂點位置和相鄰較粗糙層相同,從而有效地避免了裂縫現象。綜上所述,區別于現有技術不能夠有效提升地形繪制效率,本發明提供一種面向GPU的大規模地形快速繪制方法,通過結合out-of-core技術、LOD技術、可見性裁剪技術以及GPU加速技術,能夠有效地提高數據調度的效率,充分地發揮GPU的可編程性和加速能力,減輕CPU運算負擔,增加每秒可繪制三角形的數量,同時獲得很高的幀率,提高大規模地形繪制的效率。以上所述僅為本發明的實施例,并非因此限制本發明的專利范圍,凡是利用本發明說明書及附圖內容所作的等效結構或等效流程變換,或直接或間接運用在其他相關的技術領域,均同理包括在本發明的專利保護范圍內。
權利要求
1.一種面向GPU的大規模地形快速繪制方法,其特征在于包括以下步驟 51、生成原始地形的外存文件;其中,所述外存文件中存儲有包含原始地形數據的多個地形塊、每個所述地形塊的索引編號以及與所述地形塊相對應的壓縮紋理塊,所述地形數據包括紋理數據和高程數據; 52、根據預設視點參數確定地形的LOD層次分布,建立地形四叉樹結構,遍歷所述地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點,將選中的四叉樹節點添加到渲染調度隊列;其中,所述地形四叉樹結構的各個節點對應于所述外存文件中的相應壓縮地形塊,用于存儲相應壓縮地形塊的LOD層次及高程數據; 53、從所述渲染調度隊列獲取將被調度的節點,并對所述將被高度的節點進行渲染,完成對原始地形的繪制。
2.根據權利要求I所述的面向GPU的大規模地形快速繪制方法,其特征在于所述SI包括以下步驟 獲取原始地形的高程數據和紋理數據,并將所述原始地形的高程數據和紋理數據進行分層分塊處理,得到多個大小相同的地形塊及與所述地形塊相對應的紋理塊; 對所述紋理塊進行壓縮,得到壓縮紋理塊,并為所述地形塊構建相應的索引編號; 將所有所述地形塊及與每個地形塊相應的索引編號、壓縮紋理塊存儲于一文件中,得到外存文件。
3.根據權利要求I或2所述的面向GPU的大規模地形快速繪制方法,其特征在于所述S3中對所述將被調度的節點進行渲染,完成對原始地形的繪制的步驟包括以下步驟 根據所述將被調度的節點獲取相應地形塊的地形數據; 將所述地形塊的高程數據作為頂點紋理載入顯存,由固定的頂點緩存和索引緩存建立地形的平面網格模型; 利用頂點著色器的頂點紋理拾取功能獲取地形網格的高程值,設置消除裂縫、跳躍現象的過渡帶,并進行頂點變換和片元處理,最終實現繪制。
4.根據權利要求2所述的面向GPU的大規模地形快速繪制方法,其特征在于所述SI采用的分層方法為采用隔行隔列法對所述原始地形的高程數據進行重采樣、采用雙線性插值法對所述原始地形的紋理數據進行重采樣。
5.根據權利要求2或4所述的面向GPU的大規模地形快速繪制方法,其特征在于所述SI壓縮所述初始地形塊的紋理數據時采用的壓縮算法為采用DXT算法。
6.根據權利要求I所述的面向GPU的大規模地形快速繪制方法,其特征在于在所述S2的LOD層次分布中當視距增加一倍時,LOD級別降低一級。
7.根據權利要求I所述的面向GPU的大規模地形快速繪制方法,其特征在于所述S2在遍歷所述地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點的同時還執行下述步驟對所述地形四叉樹結構進行視錐體裁剪。
8.根據權利要求7所述的面向GPU的大規模地形快速繪制方法,其特征在于所述對所述地形四叉樹結構進行視錐體裁剪具體為對當前四叉樹節點的包圍盒與視錐體進行相交測試,完成快速視錐體裁剪。
全文摘要
本發明提供一種面向GPU的大規模地形快速繪制方法,包括生成原始地形的外存文件;其中,外存文件中存儲有包含原始地形數據的多個地形塊、每個地形塊的索引編號以及與地形塊相對應的壓縮紋理塊,地形數據包括紋理數據和高程數據;根據預設視點參數確定地形的LOD層次分布,建立地形四叉樹結構,遍歷地形四叉樹結構為不同的LOD層次細節選擇相應的四叉樹節點,將選中的四叉樹節點添加到渲染調度隊列;其中,地形四叉樹結構的各個節點對應于外存文件中的相應壓縮地形塊,用于存儲相應壓縮地形塊的LOD層次及高程數據;從渲染調度隊列獲取將被調度的節點,并對將被高度的節點進行渲染,完成對原始地形的繪制。
文檔編號G06T17/05GK102867331SQ20121031671
公開日2013年1月9日 申請日期2012年8月31日 優先權日2012年8月31日
發明者程建, 屈航, 羅博, 曾杰 申請人:電子科技大學