劉曉平, 謝文軍
(合肥工業(yè)大學(xué)計算機(jī)與信息學(xué)院VCC研究室,安徽 合肥 230009)
自然現(xiàn)象的模擬一直是計算機(jī)圖形學(xué)研究的熱點,其中水面的模擬對自然場景的意義尤為重要。由于水面的物理原型十分復(fù)雜,實時地對其進(jìn)行精確描述相當(dāng)困難,因此研究者們一直在尋求真實感和復(fù)雜度之間的平衡點。文獻(xiàn)[1]中Nick Foster 等人建立了基于Navier-Stokes 方程的水面模型,模型精確但求解復(fù)雜,不適合實時計算。文獻(xiàn)[2]例舉了線性生成海面網(wǎng)格的方法,采用逆FFT 計算,求得一定數(shù)量的線性函數(shù)疊加描述波浪,該類方法追求統(tǒng)計學(xué)上的模擬,未考慮物理精確性,有待于與流體動力學(xué)理論的結(jié)合;而在游戲等需要快速生成水體的場合,往往采用perlin 噪聲[3]等噪聲源的預(yù)計算生成水面,該方法可以生成視覺效果良好的水面,但無法結(jié)合物理計算。近年來,由于硬件技術(shù)的發(fā)展,尤其是可編程圖形硬件的出現(xiàn),基于GPU 像素級的可編程能力,實時模擬較復(fù)雜的水面成為可能,各種模擬方法也隨之產(chǎn)生。
而在水體渲染方面,初期常用的方法是構(gòu)建均勻的三角網(wǎng)格,通過定點的高度變化顯示水面,文獻(xiàn)[4]以三角網(wǎng)格為基礎(chǔ),引入LOD 思想提高繪制速度,和折射反射計算,建立了完整的海浪模型,但此種方法在較大海域時必然由于網(wǎng)格量的增大導(dǎo)致速度緩慢。而近來Cg 語言的片段編程能力使得用少量面片模擬水面成為可能,文獻(xiàn)[5]提出了一種通過預(yù)生成噪聲紋理的方法,結(jié)合少量的頂點數(shù),通過查詢紋理圖模擬細(xì)節(jié),該方法獲得了較好的噪聲源,但在渲染大水面時,所需的噪聲圖大小也增大,嚴(yán)重消耗了系統(tǒng)資源。文獻(xiàn)[6]采用了渲染到紋理的方式,實時生成折射、反射紋理,并將繪制水面所需的面片數(shù)簡化到了兩個,方法也具備較好的沉浸感,但其中的擾動、凹凸和波光效果仍依賴紋理輸入,渲染效果自然受到紋理大小和質(zhì)量的制約。
因此,為避免復(fù)雜的計算和對外部輸入的依賴,基于文獻(xiàn)[6]的用兩個面片顯示水面的方法,本文提出了一種基于GPU 的實時生成和渲染水面的方法。該方法仍使用折射和反射紋理的方式。而不同的是,紋理生成后,水面合成及模擬步驟均在GPU 片段程序中實現(xiàn)。由于片段程序中顯卡已對物體進(jìn)行了光柵化操作[7],計算量不會隨的水面大小變化,故不需要附加進(jìn)行LOD處理,也不需要附加消耗顯存資源。通過定義完整地光學(xué)模型,可以達(dá)到了良好的的水面渲染效果,且基于可編程顯卡的強(qiáng)大的流計算能力,本方法對渲染速度的影響很小。
由于本文采用的是兩個三角形面片組成水面,在OpenGL 中,繪制的水面即位一個巨大的矩形,四個頂點的初始紋理坐標(biāo)分別為(0,0), (0,1), (1,0), (1,1),在頂點程序中將未經(jīng)過投影變換的頂點三維坐標(biāo)和紋理坐標(biāo)傳入片斷程序。片段程序在光柵化時,將根據(jù)各像素點的相對位置進(jìn)行這些值的插值處理,使得可以獲得各像素點對應(yīng)的空間坐標(biāo)和紋理坐標(biāo),作為計算波形的參數(shù)。
為進(jìn)行后續(xù)的擾動和凹凸計算,本文要求水波的生成函數(shù)近似可導(dǎo),以顯式獲得水面上任一點的法向量。而由于缺乏位運算,缺乏全局緩存,以及數(shù)據(jù)精度的限制等[8],導(dǎo)致了GPU 不能實現(xiàn)perlin 噪聲等經(jīng)典的噪聲函數(shù)。
因此,考慮GPU 運算的這些特點,文獻(xiàn)[9]基于線性疊加理論,提出了在頂點程序中使用若干不同相位,不同頻率的正弦波的冪函數(shù)疊加的方法模擬水面。該方法體現(xiàn)了水波在波峰和波谷時所受的重力影響,且波的數(shù)量足夠多時可以獲得較復(fù)雜的水面,但如圖1 所示,冪函數(shù)無法生成波谷處過渡平緩的曲線。
圖1 3 種函數(shù)波形對比
因此,考慮GPU 對指數(shù)函數(shù)的硬件支持,以及顯式求導(dǎo)的快速,本文采用余弦的自然指數(shù)函數(shù)疊加
其中 t 為時間參數(shù),N 為疊加函數(shù)的數(shù)量, Dnx, Dny為波移動的方向分量,f requencen為波的頻率, speedn為波的推進(jìn)速度,參數(shù)A 為 控制振幅。這種方法在保證波浪模擬的同時,不會增加的計算負(fù)擔(dān)。
由于法線N 與這兩個方向向量 xN 、yN 均正交,且 xN 、yN 不重合,因此有
需要對生成的折射紋理與反射紋理進(jìn)行合成,由于每一點的高度和法線都不同,則該點的折射及反射方向與平靜水面相比會有一定偏差。因此,為顯示提高所繪水面的真實感,需要在合成折射、反射紋理時,進(jìn)行符合物理原理的擾動。
忽略水面高度的起伏量,如圖2 所示,對于反射,可見水面法線的變化使得原本沿視線VO而在紋理面上得到的查詢點的Q1 點發(fā)生偏移,移動成為P1′點;而如圖3 所示,對于折射,查詢點Q2 點位置移動到了P2′點,其移動趨勢與反射相反。
圖2 反射擾動原理
圖3 折射擾動原理
擴(kuò)展到二維的紋理查詢空間,由法線的x,y分量乘以擾動參數(shù),分兩個方向計算
其中dC 為經(jīng)驗常數(shù),在計算反射時為正,計算折射時為負(fù),且折射時小于反射。將得到的( Du,Dv)與紋理坐標(biāo)相加,再乘以投影紋理的矩 陣便得到擾動后的折射、反射紋理坐標(biāo)。而后引入了菲涅爾(Fresnel)效果的進(jìn)行合成,最后的合成結(jié)果為
折射和反射擾動在一定程度上增加了水面的真實感,但不能帶來水面的起伏感。而水面的起伏在視覺上很大程度上來自于水面上的明暗交替和粼粼的波光。依據(jù)圖形學(xué)中對光照基本分量的定義,以及水面的光學(xué)特點,定義一定的光學(xué)模型,以確定像素的最后顏色。
環(huán)境光分量環(huán)境光體現(xiàn)了物體來自分散在場景中各個方向光影響的效果,在水面現(xiàn)實中分量用于表現(xiàn)水的原有顏色,由于水的顏色與所 視深淺相關(guān),因此采用公式 Ambient = Ka× waterColor × (N ? eyeDirection)計算出該點水 的顏色(如圖4(a))。
漫反射分量漫反射量與光到達(dá)物體表面的入射角度成正比,快速計算時采用光源到點的方向向量L 和法線N 的點乘作為強(qiáng)度參數(shù) diffuse =Kd× lightColor × max ( N ?L,0) (如圖4(b)),由于水面的透明,受到滿反射 光的影響極小,因此 dK 可以設(shè)定為接近于0 的 小數(shù),或者可直接忽略該項。
鏡面反射分量鏡面反射分量用于表現(xiàn)主要反射方向附近的反射光,由于水面可視為光滑表面,因此為表現(xiàn)出波光粼粼的效果,鏡面反射項尤為重要。鏡面反射的計算也要考慮到觀察者的位置,因此將光線與視線的均值H 與法線N的點乘作為控制參數(shù),鑒于水面的光滑特性,應(yīng)設(shè)定較高的光滑參數(shù)shininess 使得高光區(qū)(波光)較?。ㄈ鐖D4(c))
合成對3 個分量進(jìn)行合成,得到光照系數(shù)light =ambient+diffuse +specular ,得到實現(xiàn)最終的光照模型如圖4(d)所示。
圖4 光照模型合成示意圖
本文方法在Intel P4 3.0,2G 內(nèi)存,nVidia 6600GT 顯卡硬件環(huán)境下,實現(xiàn)效果如圖5 所示。由圖可見,該方法較好地表現(xiàn)了場景和物體在水面的倒影,水面下物體的折射,水面擾動和光學(xué)模型。
實驗數(shù)據(jù)見表1??梢娝惴梢赃_(dá)到實時,且在相同場景下,還其他方法進(jìn)行了實驗:其中,三角網(wǎng)格法才用其中網(wǎng)格法采用了128*128 的較小規(guī)模的網(wǎng)格;噪聲紋理法1 為文獻(xiàn)[5]方法,結(jié)合了32*32 的網(wǎng)格和128*128 的噪聲圖;噪聲紋理法2 為文獻(xiàn)[6]方法,采用了兩個三角面片,和512*512 的噪聲圖;而本文方法由8 個正弦指數(shù)函數(shù)疊加。
由對比可看出,三角網(wǎng)格法雖然有精確的模型,可以顯示接近物理真實的效果,但速度十分緩慢;而依賴查詢紋理的方法,仍需要控制紋理大小和面片數(shù)量,達(dá)到速度和精度的平衡;相比之下,使用GPU 進(jìn)行水波生成和實時運算幾乎不需要消耗顯存資源,且無明顯的速度損失,視覺真實感也較好。
圖5 場景演示
表1 運行結(jié)果對比
自然場景尤其是水面的仿真是近年來的熱點之一。尤其是可編程圖形硬件產(chǎn)生以來,用較少量的面片繪制復(fù)雜的水面成為可能。本文采用GPU 的片段處理器編程技術(shù),實現(xiàn)了一整套實時的水面模擬方法,包括生成水波、計算法線、折射與反射的擾動合成以及光照模型的建立,避免了現(xiàn)有快速渲染效果對輸入紋理質(zhì)量的嚴(yán)重依賴;同時基于片段處理器的像素級操作的特點,避免了擾動時對深度計算需要和LOD 操作。最后通過實例,驗證了本文方法的具有良好真實感效果和實時性。但由于GPU 的限制,一方面基于物理的計算速度尚無法在處理較大的區(qū)域時達(dá)到實時;另一方面由于片段處理器尚不支持位操作,不能生成良好的噪聲。導(dǎo)致現(xiàn)階段只能采用線性疊加的方式,若疊加所用的波源較少,在高角度觀察時仍能感覺到波浪的規(guī)律性。
[1] Nick Foster, Dimitri Metaxas. Realistic animation of liquids [J]. Graphical Models and Image Processing (S1077-3169), 1996, 58(5): 471-483.
[2] 聶衛(wèi)東, 等. 基于線性海浪理論的海浪數(shù)值模擬[J].系統(tǒng)仿真學(xué)報, 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 的實時水面環(huán)境模擬[J]. 系統(tǒng)仿真學(xué)報, 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] 吳恩華, 柳有權(quán). 基于圖形處理器(GPU)的通用計算[J]. 計算機(jī)輔助設(shè)計與圖形學(xué)學(xué)報, 2004, 16(5): 601-612.
[9] 方建文, 于金輝, 馬文龍. 圖形硬件加速的實時水面繪制[J]. 計算機(jī)工程與應(yīng)用, 2006, 42(15): 86-88.