齊 敏,周加軍,李大健,崔赫琳
(1.西北工業大學 陜西 西安 710129;2.西北工業大學365研究所 陜西 西安 710129)
在虛擬現實和可視化仿真中,對自然景物的模擬是其研究的重點之一。動態水流經常出現在虛擬環境當中,它能夠在很大程度上增加虛擬環境的真實感。水流與煙霧、火焰一樣,其形狀和運動的方式受其它景物的影響,沒有規律性,因此不能用傳統的幾何建模方法來創建它。
目前有多種形成水波的方法,在國外,Peachey[1]采用了正弦函數與二次函數線性組合的方法來模擬波浪外形。Fournier[2]等人則利用構造參數曲面合成的方法來模擬比較復雜的海浪。Foster[3]等人使用有限差分近似求解Navier-Stokes方程,用得到流速場和壓力場產生水波高度場模擬出較真實的水面效果。Perlin[4]提出了一種噪聲圖像合成方法,利用噪聲函數生成連續的二維噪聲曲面,再疊加成分形曲面。Johanson[5]利用Perlin噪聲和投影網格來模擬海浪等。
在國內,楊懷平和孫家廣[6]從海洋學觀測的經驗入手,利用海浪譜對深水波進行了模擬。李廣鑫[7]等人引入Perlin噪聲作為水面高度場動態變化的激勵源,使用準均勻B樣條曲面來構造水面,來模擬水面連續動蕩變化的效果,而且用CubeMap紋理映射技術模擬了水面的反射效果等。宋利等人利用Fourier[8]合成技術,對模型表面利用靜止水面的圖像數據進行紋理映射,模擬雨滴下落的自然現象。
Perlin[4]噪聲是由Ken Perlin發明的自然噪聲生成算法??梢杂脕砟M自然界中的噪聲現象。用它可以得到連續變化的二維圖像,例如可以用它來模擬人體的隨機運動,螞蟻行進的線路,也可以通過計算分形和模擬云朵、火焰等非常復雜的紋理。Perlin噪聲對各個點的計算是相互獨立的,非常適合使用圖形處理器進行計算。
創建Perlin噪聲函數,需要有一個噪聲函數和一個插值函數:
1)噪聲函數基本上是一個種子隨機發生器。它需要有一個整數作為參數,然后根據這個參數得到一個隨機數。對于相同的兩個參數,會得到相同的結果。
2)可以在兩值之間進行平滑插值,來形成一個可以輸入非整參數的連續函數,由此來填充兩個隨機點之間的非整數的空白部分,目前常用的插值函數有線性插值、余弦插值、立方插值以及多次方插值函數。本文中Perlin利用余弦插值進行平滑,得到了很好的平滑效果。
在文中需要利用二維的Perlin噪聲函數對水面紋理進行擾動。首先要構造一個二維梯度場,如圖1,將二維噪聲面分割為個網格,每個網格點則為噪聲面的控制點,每個控制點的梯度方向和長度都是隨機產生的,并且是一次性的,但是在求每個噪聲控制點的過程中,其梯度是不變的,這就使得Perlin噪聲對于相同的整數輸入,產生相同的輸出。

圖1 噪聲網格梯度圖Fig.1 Gradient map of noise grid
設噪聲函數為 PerlinNiose(x,y),I(x,y)為任意一點的噪聲值,如果I(x,y)的坐標為整數,則其數值等于原始的數值,如果I(x,y)的坐標不為整數坐標,其數值則由包圍它的單位四邊形上的四個點來插值求得。其相鄰的四個控制點為N(i,y),N(i,j+1),N(i+1,j),N(i+1,j+1),其中 v(i,j)v(i,j+1),v(i+1,j),v(i+1,j+1)分別為這 4 個點的梯度,這 4 個控制點對待插點的的貢獻值為:

然后在 x,y 方向上利用 D1,D2,D3,D4對 I(x,y)進行余弦插值,即可得到平滑的噪聲平面。其余弦插值函數為

可編程的圖形硬件是提高圖形程序設計靈活性和效率的一個重要手段,隨著圖形處理單元GPU的逐漸完善,OpenGL著色語言(GLSL)應運而生,它可以使得開發人員可以很好的控制圖形處理管線,實現各種完美的圖形渲染效果。
最新的GLSL主要包含頂點著色器(Vertex Shader),片元著色器(Fragment Shader),和幾何著色器(Geometry Shader)。
1)頂點著色器 在OpenGL著色語言中,頂點不僅是位置坐標值,還包括法線坐標、紋理坐標、顏色坐標、霧坐標和自定義屬性坐標。在頂點處理的過程中,數據通過attribute變量,uniform變量和紋理貼圖的方式傳遞給頂點著色器。經過處理后的數據再通過varying變量和專用的頂點著色器輸出變量從頂點著色器輸出,并將頂點插值得到的結果傳入幾何著色器,或者片元著色器。
2)片元著色器 是一個可編程的處理面片數值及數據的單元。片元處理器可以完成對圖形的插值,紋理的訪問等相關處理,以及實現霧化效果和顏色求和。片元著色器可以處理光柵化生成的點、線、多邊形,像素集合及位圖等,但面片處理器不能完成多個面片的同時操作。
3)幾何著色器 幾何著色器的操作對象是圖元,包括一維的點圖元,二維的線圖元,三維的三角形圖元。幾何著色器利用內置變量gl_VerticesIn獲取當前的圖元的維數,從而獲得圖元的每個元素的數值。并且幾何著色器要求用戶主動設置輸入和輸出圖元的性質。
OpenGL著色器在渲染管線中的位置和作用如圖2所示。

圖2 OpenGL著色器渲染流程Fig.2 Flowing chart of OpenGL Shader
頂點著色器可以完成頂點替代、法線變換、生成和變換紋理坐標、光照及材質應用的功能;片元著色器則可以實現替代紋理、霧化、像素匯總的功能;幾何著色器在圖元裝配的過程中生成新的圖元。
文中利用Perlin噪聲作為驅動源,擾動輸入的水面圖片,再通過OpenGL渲染語言進行圖片中片元法線、顏色操作等,便可形成比較真實的水面。
首先創建一個幾何平面,然后把將要當做水面紋理的純色圖片映射到幾何平面上,作為動態水面的初始高度場。采用此種方法,可以把三維立體波浪的求解過程變換為對二維平面擾動來求解波浪面。從而較求解傳統波動方程,可以大大簡化計算過程和減少工作量。
在文中,高度場是由Perlin噪聲擾動紋理數據來形成的,紋理上的相應點的高度值是隨著噪聲控制點的變化趨勢而變化的。其波動方程可表示為:

其中x,y為水面相應點的橫坐標與縱坐標,t代表當前時刻,則 Z(t)表示在噪聲的擾動下,坐標(x,y)處點的高度值。當Z(t)=0 時,表示該點處于水平面狀態,當 Z(t)不等于 0 時,則表示該點處于已形成的水波面上。對于該水面,以一定的間距把水面分割為有點的網格面,本文中以1為單位,使得相鄰的網格點組成單位矩形面,在網格點上,根據公式1即可求得其對應坐標的數值,不在網格點上的點數值則由相鄰的點插值得到。其插值過程如下。
對于任意一點的I(x,y),由包圍它的四個點進行插值,這四個點分別為 N([x],[y]),N([x]+1,[y]),N([x],[y]+1),N([x]+1,[y]+1),為了得到平滑的效果,在插值之前,先對這四個點進行平滑。平滑按照Perlin噪聲的平滑公式進行平滑,以N([x],[y])點為例,得到的結果為:

用同樣的方法可以求得其他 3 個點 N([x]+1,[y]),N([x],[y]+1),N([x]+1,[y]+1)的數值,然后利用得到的平滑后的點,分別在X,Y方向上進行余弦插值。
余弦插值公式為:

其中a,b代表根據公式2求得的各個網格點的平滑結果,x代表網格點與相應點在X方向的距離,即可看做在插值中,各網格點對待插值點的貢獻值。
設在 X 方向的插值結果分別為 F1(x,y),F2(x,y)。
利用這兩個結果再在Y方向上進行插值,即得到I(x,y)處的數值。

其中y代表待插點與相應點在Y方向的距離。經過此項插值可獲得平滑的水面高度場,此時可得到平滑動蕩的水面,此時的水面還沒有具備水面的特性,既沒有反射、映射等效果。接下來通過水面法線等計算來實現以上效果。
文中法線的計算是以網格中單位矩形為單位面片的。

所以該單元面的法線為:

隨著水面的波動,各個單元面的法向量也隨著變化,由于各個單元面的法向量不同,所以就出現了明暗不同的效果。再通過OpenGL渲染語言對生成的水面進行渲染,對法線進行實時更新,實時計算各個面的法線,同時根據網格中每個點的高度來調節點的顏色值,使得不同高度的點呈現出不同的顏色值,從而實現接近真實水面的色調。
本文中的反射效果根據OSG中的模板緩存[9]來實現的。根據鏡面反射[10]原理,在繪制虛擬環境實體時,還要對它施加矩陣變換來實現關于鏡面的對稱影像。然后將鏡面影像寫入模版緩存,以防止超出鏡面范圍的鏡像被顯示。然后根據反射原理求得觀察景物倒影視線與水面的范圍,將景物倒影進行投影變換,映射到水面的可視范圍,從而對影像與水面混合繪制。隨著視點位置的變化,對倒影的可視區域位置也會發生變化,在此重新對倒影進行投影變換,從而獲得真實水面影像。

圖3 反射原理Fig.3 Principle of reflection

圖4 動態水面效果圖Fig.4 Flowing warter surface
對動態水面的模擬始終是虛擬現實領域研究的重點之一,本文利用Perlin噪聲擾動水面紋理形成水面高度場,同時在 OSG基礎上利用OpenGL Shader渲染語言進行水面渲染,并且實現實時的水面映射效果的方法,具有原理簡單,計算量小的特點。克服了利用傳統高分辨率網格創建水面方法計算量大的缺點。本方法形成的動態水面可以與三維地形等模型一起渲染,可以得到很好的整體效果。
[1]Peachey D.Modeling waves and surf[J].Computer Graphics,1986,20(4):65-74.
[2]Fournier A,Reeves W T.A simple model of ocean waves[J].Computer Graphics,1986,20(4): 75-84.
[3]Foster N,Metaxas D.Realistic animation of liquids[J].Graphical Models and Image Processing,1996,58(5):471-483.
[4]Perlin K.An image synthesizer[J].Computer Graphics,1985,19(3):287-296.
[5]Johanson C.Real-time water rendering-Introducing the projected grid concept[M].Sweden:Department of Computer Science,Lund University,Master dissertation,2004.
[6]楊懷平,孫家廣.基于海浪譜的波浪模擬[J].系統仿真學報,2002,14(9):1175-1178.
YANG Huai-ping,SUN Jia-guang.Waves simulation based on the wave spectrum of ocean.Journal of System Simulation,2002,14(9):1175-1178.
[7]李廣鑫,丁振國,詹海生,等.一種面向虛擬環境的真實感水波面建模算法 [J].計算機研究與發展,2004,41(9):1580-1585.
LI Guang-xin,DING Zhen-guo,ZHAN Hai-sheng,et al.A modeling algorithm for realistic water surface simulation in virtual environment[J].Journal of Computer Research and Development,2004,41(9):1580-1585.
[8]宋利,周源華,周軍.基于Fourier合成技術的水波動畫[J].計算機工程與應用,2002,(6):10-11.
SONG Li,ZHOU Yuan-hua,ZHOU Jun.Waves animation based on fourier synthesis[J].Computer Engineering and Applications,2002,(6):10-11.
[9]曹莉,李紹彬,申閆春.基于OSG的鏡面反射特效的實現[J].計算機仿真,2009,26(8):208-211.
CAO Li,LI Shao-bin,SHEN Yan-chun.Implementation of mirror reflection effect based on OSG[J].Computer Emulation,2009,26(8):208-211.
[10]馬駿,朱衡君,龔建華.基于Cg和 OpenGL的實時水面環境模擬[J].系統仿真學報,2006,18(2):395-340.
MA Jun,ZHU Heng-jun,GONG Jian-hua.Simulation of realtime water surface based on Cg and OpenGL[J].Journal of System Simulation,2006,18(2):395-340.