劉曉平, 謝文軍
(合肥工業大學計算機與信息學院VCC研究室,安徽 合肥 230009)
自然現象的模擬一直是計算機圖形學研究的熱點,其中水面的模擬對自然場景的意義尤為重要。由于水面的物理原型十分復雜,實時地對其進行精確描述相當困難,因此研究者們一直在尋求真實感和復雜度之間的平衡點。文獻[1]中Nick Foster 等人建立了基于Navier-Stokes 方程的水面模型,模型精確但求解復雜,不適合實時計算。文獻[2]例舉了線性生成海面網格的方法,采用逆FFT 計算,求得一定數量的線性函數疊加描述波浪,該類方法追求統計學上的模擬,未考慮物理精確性,有待于與流體動力學理論的結合;而在游戲等需要快速生成水體的場合,往往采用perlin 噪聲[3]等噪聲源的預計算生成水面,該方法可以生成視覺效果良好的水面,但無法結合物理計算。近年來,由于硬件技術的發展,尤其是可編程圖形硬件的出現,基于GPU 像素級的可編程能力,實時模擬較復雜的水面成為可能,各種模擬方法也隨之產生。
而在水體渲染方面,初期常用的方法是構建均勻的三角網格,通過定點的高度變化顯示水面,文獻[4]以三角網格為基礎,引入LOD 思想提高繪制速度,和折射反射計算,建立了完整的海浪模型,但此種方法在較大海域時必然由于網格量的增大導致速度緩慢。而近來Cg 語言的片段編程能力使得用少量面片模擬水面成為可能,文獻[5]提出了一種通過預生成噪聲紋理的方法,結合少量的頂點數,通過查詢紋理圖模擬細節,該方法獲得了較好的噪聲源,但在渲染大水面時,所需的噪聲圖大小也增大,嚴重消耗了系統資源。文獻[6]采用了渲染到紋理的方式,實時生成折射、反射紋理,并將繪制水面所需的面片數簡化到了兩個,方法也具備較好的沉浸感,但其中的擾動、凹凸和波光效果仍依賴紋理輸入,渲染效果自然受到紋理大小和質量的制約。
因此,為避免復雜的計算和對外部輸入的依賴,基于文獻[6]的用兩個面片顯示水面的方法,本文提出了一種基于GPU 的實時生成和渲染水面的方法。該方法仍使用折射和反射紋理的方式。而不同的是,紋理生成后,水面合成及模擬步驟均在GPU 片段程序中實現。由于片段程序中顯卡已對物體進行了光柵化操作[7],計算量不會隨的水面大小變化,故不需要附加進行LOD處理,也不需要附加消耗顯存資源。通過定義完整地光學模型,可以達到了良好的的水面渲染效果,且基于可編程顯卡的強大的流計算能力,本方法對渲染速度的影響很小。
由于本文采用的是兩個三角形面片組成水面,在OpenGL 中,繪制的水面即位一個巨大的矩形,四個頂點的初始紋理坐標分別為(0,0), (0,1), (1,0), (1,1),在頂點程序中將未經過投影變換的頂點三維坐標和紋理坐標傳入片斷程序。片段程序在光柵化時,將根據各像素點的相對位置進行這些值的插值處理,使得可以獲得各像素點對應的空間坐標和紋理坐標,作為計算波形的參數。
為進行后續的擾動和凹凸計算,本文要求水波的生成函數近似可導,以顯式獲得水面上任一點的法向量。而由于缺乏位運算,缺乏全局緩存,以及數據精度的限制等[8],導致了GPU 不能實現perlin 噪聲等經典的噪聲函數。
因此,考慮GPU 運算的這些特點,文獻[9]基于線性疊加理論,提出了在頂點程序中使用若干不同相位,不同頻率的正弦波的冪函數疊加的方法模擬水面。該方法體現了水波在波峰和波谷時所受的重力影響,且波的數量足夠多時可以獲得較復雜的水面,但如圖1 所示,冪函數無法生成波谷處過渡平緩的曲線。

圖1 3 種函數波形對比
因此,考慮GPU 對指數函數的硬件支持,以及顯式求導的快速,本文采用余弦的自然指數函數疊加

其中 t 為時間參數,N 為疊加函數的數量, Dnx, Dny為波移動的方向分量,f requencen為波的頻率, speedn為波的推進速度,參數A 為 控制振幅。這種方法在保證波浪模擬的同時,不會增加的計算負擔。


由于法線N 與這兩個方向向量 xN 、yN 均正交,且 xN 、yN 不重合,因此有

需要對生成的折射紋理與反射紋理進行合成,由于每一點的高度和法線都不同,則該點的折射及反射方向與平靜水面相比會有一定偏差。因此,為顯示提高所繪水面的真實感,需要在合成折射、反射紋理時,進行符合物理原理的擾動。
忽略水面高度的起伏量,如圖2 所示,對于反射,可見水面法線的變化使得原本沿視線VO而在紋理面上得到的查詢點的Q1 點發生偏移,移動成為P1′點;而如圖3 所示,對于折射,查詢點Q2 點位置移動到了P2′點,其移動趨勢與反射相反。

圖2 反射擾動原理

圖3 折射擾動原理
擴展到二維的紋理查詢空間,由法線的x,y分量乘以擾動參數,分兩個方向計算

其中dC 為經驗常數,在計算反射時為正,計算折射時為負,且折射時小于反射。將得到的( Du,Dv)與紋理坐標相加,再乘以投影紋理的矩 陣便得到擾動后的折射、反射紋理坐標。而后引入了菲涅爾(Fresnel)效果的進行合成,最后的合成結果為

折射和反射擾動在一定程度上增加了水面的真實感,但不能帶來水面的起伏感。而水面的起伏在視覺上很大程度上來自于水面上的明暗交替和粼粼的波光。依據圖形學中對光照基本分量的定義,以及水面的光學特點,定義一定的光學模型,以確定像素的最后顏色。
環境光分量環境光體現了物體來自分散在場景中各個方向光影響的效果,在水面現實中分量用于表現水的原有顏色,由于水的顏色與所 視深淺相關,因此采用公式 Ambient = Ka× waterColor × (N ? eyeDirection)計算出該點水 的顏色(如圖4(a))。
漫反射分量漫反射量與光到達物體表面的入射角度成正比,快速計算時采用光源到點的方向向量L 和法線N 的點乘作為強度參數 diffuse =Kd× lightColor × max ( N ?L,0) (如圖4(b)),由于水面的透明,受到滿反射 光的影響極小,因此 dK 可以設定為接近于0 的 小數,或者可直接忽略該項。
鏡面反射分量鏡面反射分量用于表現主要反射方向附近的反射光,由于水面可視為光滑表面,因此為表現出波光粼粼的效果,鏡面反射項尤為重要。鏡面反射的計算也要考慮到觀察者的位置,因此將光線與視線的均值H 與法線N的點乘作為控制參數,鑒于水面的光滑特性,應設定較高的光滑參數shininess 使得高光區(波光)較小(如圖4(c))

合成對3 個分量進行合成,得到光照系數light =ambient+diffuse +specular ,得到實現最終的光照模型如圖4(d)所示。

圖4 光照模型合成示意圖
本文方法在Intel P4 3.0,2G 內存,nVidia 6600GT 顯卡硬件環境下,實現效果如圖5 所示。由圖可見,該方法較好地表現了場景和物體在水面的倒影,水面下物體的折射,水面擾動和光學模型。
實驗數據見表1。可見算法可以達到實時,且在相同場景下,還其他方法進行了實驗:其中,三角網格法才用其中網格法采用了128*128 的較小規模的網格;噪聲紋理法1 為文獻[5]方法,結合了32*32 的網格和128*128 的噪聲圖;噪聲紋理法2 為文獻[6]方法,采用了兩個三角面片,和512*512 的噪聲圖;而本文方法由8 個正弦指數函數疊加。
由對比可看出,三角網格法雖然有精確的模型,可以顯示接近物理真實的效果,但速度十分緩慢;而依賴查詢紋理的方法,仍需要控制紋理大小和面片數量,達到速度和精度的平衡;相比之下,使用GPU 進行水波生成和實時運算幾乎不需要消耗顯存資源,且無明顯的速度損失,視覺真實感也較好。

圖5 場景演示

表1 運行結果對比
自然場景尤其是水面的仿真是近年來的熱點之一。尤其是可編程圖形硬件產生以來,用較少量的面片繪制復雜的水面成為可能。本文采用GPU 的片段處理器編程技術,實現了一整套實時的水面模擬方法,包括生成水波、計算法線、折射與反射的擾動合成以及光照模型的建立,避免了現有快速渲染效果對輸入紋理質量的嚴重依賴;同時基于片段處理器的像素級操作的特點,避免了擾動時對深度計算需要和LOD 操作。最后通過實例,驗證了本文方法的具有良好真實感效果和實時性。但由于GPU 的限制,一方面基于物理的計算速度尚無法在處理較大的區域時達到實時;另一方面由于片段處理器尚不支持位操作,不能生成良好的噪聲。導致現階段只能采用線性疊加的方式,若疊加所用的波源較少,在高角度觀察時仍能感覺到波浪的規律性。
[1] Nick Foster, Dimitri Metaxas. Realistic animation of liquids [J]. Graphical Models and Image Processing (S1077-3169), 1996, 58(5): 471-483.
[2] 聶衛東, 等. 基于線性海浪理論的海浪數值模擬[J].系統仿真學報, 2005, 5(17): 1037-1044.
[3] Hugo Elias. Perlin noise [EB/OL]. http://freespace. virgin.net/hugo.elias/models/m_perlin.htm.
[4] Jerry Tessendorf. Simulating ocean water [Z]. SIGGRAPH 2001 Course notes, 2001.
[5] Yuri Kryachko. Using vertex texture displacement for realistic water rendering [M]. GPU Gems2, 2005. 283-294.
[6] 馬 駿, 朱衡君, 龔建華. 基于Cg 和OpenGL 的實時水面環境模擬[J]. 系統仿真學報, 2006, 18(2): 395-400.
[7] Randima Fernando, Mark J Kilgard. The Cg tutorial— the definitive guide to programmable real-time graphics [M]. Addison Wesley, 2004. 14-19.
[8] 吳恩華, 柳有權. 基于圖形處理器(GPU)的通用計算[J]. 計算機輔助設計與圖形學學報, 2004, 16(5): 601-612.
[9] 方建文, 于金輝, 馬文龍. 圖形硬件加速的實時水面繪制[J]. 計算機工程與應用, 2006, 42(15): 86-88.