高保祿,張 冰,竇明亮
(太原理工大學 軟件學院,山西 太原 030024)
三維地形生成與可視化問題在虛擬戰場模擬、VR系統等方面的應用逐漸增多,實現大型地形場景以更快的速度、更低內存占有率進行更真實的地形環境模擬,使得地形紋理映射技術成為今后一段時間內的研究重點[1,2]。
文獻[3]采用多分辨率紋理映射技術,將可能在紋理映射過程導致塊間裂縫產生的各項因素進行融合計算以消除地形紋理的裂縫,更好實現模型的連續性。文獻[4]提出了一種基于馬爾可夫隨機模型的合成算法,利用紋理分塊可有效保留圖像的全局信息的特性匹配紋理,遮擋與迭代共同作用來消除紋理間縫隙,實現紋理無縫映射,但對于大型場景,迭代過程過于復雜,會減慢渲染的速度。文獻[5]雖然將大部分計算過程從CPU轉移到GPU,將三維地形模型與過程紋理映射結合起來以消除紋理塊間的裂縫,但是裂縫的處理方法被簡化,最終的渲染依然存在不連續。對于文獻[6]提出的紋理映射方法,最終效果比較好,但約束點需要人為指定,缺乏靈活性。
本文實現的地形紋理的無縫映射是在多分辨率紋理映射技術的基礎上,通過對視點頂點的各參數進行加權計算,引入基于埃爾米特的視點運動預測,從根本上解決了紋理分塊間的裂縫。此外,本文為了計算可視范圍內紋理誤差而降低誤差,又構建了基于包圍球的視錐剪及視點運動預測。最后,為了實現地形實時渲染,取得較好的視覺效果,本文對視點運動情況進行預測,并釋放了不在視線范圍的紋理信息。
對大型地形場景進行實時繪制與渲染時,首先需將整體地形紋理塊劃分為多個子塊。本文算法在這一步驟中使用相同大小的紋理圖像來表示結點,將其分為不同層次,各層次結點紋理劃分塊的大小不同,采用這種四叉樹數據結構[7]來實現對地形紋理進行分層次分塊操作。結合文獻[5],不斷將地形紋理塊等分為4部分,直至達到分辨率要求,以使渲染的畫面連續,圖1為方法具體過程。

圖1 地形紋理四叉樹分塊
為實現地形紋理無縫渲染,如何正確的將紋理貼在地形塊上是非常關鍵的。首先要將各個紋理像素地址在對象坐標系上進行映射,再以屏幕坐標系為基準進行顯示。紋理映射的關鍵步驟在于計算紋理坐標,但由于實時繪制的速率受制于對大規模紋理地形的計算,而且不同的視點位置及視線方向所觀察到的地形也極不相同,所以,根據虛擬漫游者在漫游空間所處的視點狀態進行視點運動預測,是計算紋理坐標的基礎。本文采用的預測方法為基于埃爾米特的視點運動預測法,將初始時刻t0時的視點位置及視線方向作為輸入,利用下一時刻t1、t2分別對應的視點狀態T1、T2得到t3時刻的視點運動狀態T3

(1)
其次,本文判斷可見范圍及三角面頂點的可見性,從而剔除不可見點,采用了文獻[8]內的方法。再根據視點位置及視線方向進行視錐裁剪,構造包圍球,將視錐體投影到該平面。將投影面各個邊距包圍球球心的距離與半徑作比較,若小于則該地形塊可見。
采用權值法,即通過求得紋理圖像各邊緣距離三角面值的大小來判斷三角頂點的可見性。距離大于0時三角面可見,反之不可見。接著將紋理貼片組合得到相應的紋理圖像。
若直接將從不同角度收集的圖片組合起來進行渲染會使紋理塊間連續性差,出現畫面不連續、卡頓跳躍的現象,降低漫游者的沉浸感。因此,本文采用文獻[9]提出的方法,綜合考慮視點到頂點的距離、頂點的像素投影位置到圖像的距離以及頂點的法線與頂點到視點的向量之間夾角3個因素影響,由此,對各個參數賦予不同權值進行計算得到紋理像素信息
G′m,n=Gm,n+ω·P(x,y)
(2)
其中G(m,n)表示紋理圖像的像素值,ω表示圖像的像素加權值,P(x,y)代表每個點的像素值。計算如式(3),為了消除紋理間裂縫,使畫面連續性更強,在運算過程中考慮了視點位置和方向的精確性

(3)
圖像頂點法向量為N,其三維坐標為V(x1,y1,z1),而視點三維坐標為Ti,(dmin,dmax)限制視點的視錐范圍,頂點落下投影到圖像主點的最短距離為dz。
紋理調度算法有很多,相比文獻[9]采用的多分辨率紋理映射技術,本文在此基礎上,采用多分辨率金字塔結構[6]的紋理映射技術對數據進行分層次的壓縮與存儲,減少空間占有率。此外,相比現有文獻對紋理映射進行的只考慮了紋理的分辨率級別和紋理分塊距視點的距離計算紋理誤差,通過構造包圍球,根據視點位置及視線方向進行視錐裁剪,進行誤差控制計算時,加入了參數包圍球半徑R,從而實現計算結果更為精確,實現高保真的紋理映射。然后通過預估釋放算法[9,10]對不需要的紋理塊釋放其內存空間,減少渲染所需時間。
為加快紋理渲染速率,需避免頻繁地將海量紋理塊數據調入調出,因此需要根據各層次信息及視點可見范圍,實現實時調度可見地形紋理。依據與視點的距離進行多分辨率紋理的渲染。
通過構建多分辨率金字塔[6]結構對海量的紋理塊進行劃分,并對其分層壓縮存儲,在加載地形時,不像傳統的方法一次性將大量地形數據直接調入內存,而是實時調入當前渲染地形塊相應分辨率的相應紋理塊,從而達到縮短計算時間,減少內存占用率的目的。此外,分多次將當前所需紋理塊實時調入可以得到較好的渲染效果,使漫游者有更好的視覺體驗。圖2為本文方法構建的多分辨率金字塔模型。

圖2 多分辨率紋理金字塔模型
第0層為整個地形塊,分辨率為r。第1層將第0層等分為4個子塊,相應的分辨率變為2r。第2層又將第一層中的4個地形塊等分為4個字塊,分辨率都為4r。按照此規則繼續向下劃分,第k層是將第k-1層的所有地形塊等分為4個字塊形成的,分辨率也是上一層的2倍,不僅地形模型,紋理模型也需滿足下一層是上一層分辨率的2倍。再結合文獻[11]的方法映射紋理圖像,對視點范圍內的地形,根據由近及遠,分辨率由高到低的對應關系進行映射。
文獻[3]根據紋理分辨率級別和紋理分塊距視點的距離計算紋理誤差,本文在此基礎上,構造包圍球,根據視點位置及視線方向較為準確地進行視錐裁剪,將包圍球半徑考慮進去。此外,文獻[3]采用的幾何誤差是取平均值,考慮較為單一,本文將地形塊的高程值考慮進去,更為精準。
在數據預處理階段構造如圖3所示的包圍球,進而對地形塊進行視錐裁剪,其中R為構造的包圍球半徑,O為球心,平面ABCD表示地形塊。

圖3 地形塊包圍球構造
如何選取適合的紋理分辨率是對多分辨率紋理進行映射的關鍵,紋理分辨率選擇過高、過低都會對映射結果產生影響。通常,分辨率的選擇與地形塊的大小、根據視點運動判斷的下一幀視線范圍等因素都是相關的。因此,在多分辨率紋理映射過程中,紋理誤差的存在是不可消除的。誤差一般從幾何誤差和屏幕誤差考慮。首先,計算幾何誤差得到ε

(4)
其中,Hi為對角線交點O的高程值,Ha、Hb、Hc、Hd分別為正方形4個端點A、B、C、D處的高程值。
根據分辨率等級及視點狀態計算紋理誤差

(5)
其中,k表示紋理圖像的分辨率級別,e為視點,w為紋理分塊的大小,ε表示幾何誤差,ω代表視域廣角的像素個數,d表示視點到紋理分塊ABCD的距離

(6)
在很短的時間內加載大規模地形紋理數據對GPU的計算能力要求很高,為確保實時繪制地形紋理,釋放紋理空間是十分關鍵和重要的[11],本文在使用艾爾米特插值算法對用戶視點運動進行預測的基礎上,采用了預估釋放算法(advance estimate release,AER)[12]。將初始視點的狀態數據,即其坐標與視線方向作為算法的初始輸入,再將視點移動過程中所掃過區域的紋理塊數據實時加載入內存,再將視點已掃過且不在視域內的紋理塊移出內存。當緩沖區中的紋理塊數據達到上限時,利用艾爾米特插值算法對視點的移動進行預測判斷,將已經在視點范圍內出現過且不在預測的下一幀視點范圍內的紋理數據按照優先級先后移出內存空間,以此來實現實時紋理渲染。圖4為本文算法流程。

圖4 地形紋理無縫映射過程
本文基于通用windows平臺,模擬實驗采用OpenGL與Visual Studio2013完成。計算機硬件配置為CPU(Intel(R) Core(TM) i7-3770 CPU @ 3.40 GHz),顯卡(AMD Radeon HD 7470),實驗使用的The Puget Sound Area地形數據是Large Geometric Models Archive at Georgia Tech網站提供的。
本文實驗設置共分為4步,①需要在計算機中加載紋理影像,并對其進行計算以得到相應的地形紋理數據;②使用本文中提到的各種算法對紋理數據分塊處理,接著將地形高程數據和紋理數據從數據庫中讀出來;③主要工作是將位圖文件轉化為紋理貼圖;④釋放空閑紋理塊內存占有率。
本文在傳統多分辨率紋理映射算法[3]的基礎上,充分考慮了地形紋理像素生成過程中可能對紋理映射產生影響的多種復雜因素,提出利用艾爾米特差值算法對視點運動進行預測,將角度與距離考慮在內,與整個地形模型進行加權計算,來減少地形紋理誤差。同時,在進行誤差控制計算時,將根據視點位置及視線方向構成的包圍球考慮在內,實現較小的紋理映射誤差。圖5中將不同算法在對相同1000幀紋理數據進行繪制時得到的紋理塊大小進行對比展示。
圖5表明,對相同大小的地形塊分別采用OpenGL、傳統多分辨率紋理映射算法、本文算法進行繪制,得到的紋理大小不同,即它們所需的計算量也有所差異。本文算法在對地形紋理塊進行繪制時,得到的紋理塊較未進行多分辨率計算的OpenGL與傳統映射算法最小,從而所需的計算量也最小,由此獲得了較大的幀速率,保證了渲染速度。

圖5 圖像紋理大小對比
如表1所示,為本文算法與其它多分辨率紋理映射算法在對地形紋理進行渲染時的幀速率對比情況。本文算法一方面增加了艾爾米特插值算法對用戶視點運動進行預測,在對控制誤差進行計算時將包圍球的半徑考慮在內,消除了地形紋理塊間裂縫,使得最終的畫面渲染效果更加平滑;另一方面,本文采用不同于傳統算法的基于金字塔的圖像壓縮算法來保證有較好渲染效果的同時可以具備較高的幀速率,提高地形紋理渲染速度,取得較好的視覺效果。

表1 不同算法的幀速率對比
可以看出,運用本文提出的算法具有更小的算法計算量,且利用對視點的運動軌跡進行預測與誤差的控制計算實現了高保真的紋理無縫映射,雖然在一定程度上增強了CPU的負擔,但是使渲染畫面更加平滑,極大提升了用戶體驗。
為了消除紋理塊間的裂縫,實現高保真的紋理無縫映射,在對紋理數據進行繪制時,本文將角度與距離考慮在內,與整個地形模型進行加權計算,再結合對視點運動軌跡的預測,來減少地形紋理誤差。同時,對于地形紋理映射時可能產生的投影誤差,考慮不同的紋理塊與視點距離的遠近結合分辨率的級別,以此實現紋理塊間的無縫映射,從而獲得更為真實的地形紋理映射。
從各項實驗結果可以看出,本文算法在誤差控制、消除地形紋理間裂縫、對不同分辨率的紋理塊進行實時調用、大規模地形實時渲染方面相較于文中提到的其它算法更具優勢,且在保證有較高的幀速率的同時,內存占用率更少,可以以更快的速度實現地形紋理的實時無縫渲染。