倪榮梅,張建偉,譚詩瀚
(1.四川大學計算機學院,成都610065;2.四川大學視覺合成圖形圖像國防重點學科實驗室,成都610065)
由于自然景物在空間范圍、動態移動上的限制,在計算機圖形學中視景仿真模擬一直是研究熱點。飛行模擬機是用于飛行員飛行模擬訓練的重要設備,且飛行模擬訓練已經在民航及空軍飛行員訓練中廣泛使用。仿真模擬分為硬件和軟件兩部分,硬件是進口的空客A320 座體艙,為該機型內部各設備鍵盤及窗口的1:1 仿真還原,軟件是飛行模擬時所見的虛像系統,包括地形山貌及場景里的景物建筑等,飛行員在艙體內訓練的時候可以實際模擬飛機的起飛、降落或可能在飛行過程種發生的各種狀況。
海洋作為仿真視景的重要組成部分,具有不可忽視的作用,本文旨在研究飛行模擬場景下的海洋仿真渲染。目前的飛行模擬海洋渲染只是紋理加上法線貼圖擾動,逼真度不高,并且后續如果有飛行靠近海面或交互需求無法在簡單紋理的基礎上做,所以需要更仿真的海洋特效渲染,并與飛行模擬視景的地形做適配。
海洋繪制的研究大致可分為三部分:建模、網格劃分和渲染。在國內外學者多年研究的基礎上,已經建立了許多種海浪的模型,實現了海浪模擬。對于復雜多變的海洋來說,海面的波動現象是十分復雜的,在空間和時間上都具有不規則性和不重復性。
海浪場景仿真需要先建立海浪模型,模型的精確與否將直接決定海浪的真實感和逼真度。針對數據處理量大小和實時性強弱的問題,在計算機圖形學研究領域中,國內外的專家學者對海浪模擬提出很多仿真算法:如Stam 基于流體力學建模,采用求解Navier-Stokes 方程組的方法[1],計算量較大難以實時,但渲染效果十分逼真;Fournier 基于幾何建模,采用噪聲函數/參數化的三角函數(Gerstner)的方法[2],計算量不大,實時性好,但海洋表面渲染效果不太理想;基于海浪譜建模,將水面分解為各種方向不同、頻率不同、振幅不同的波疊加的效果,從真實的海洋水面統計數據,再通過FFT 算法將這些波合成海浪譜的方法,由于實時性和逼真性兼顧,是目前應用較為廣泛的一種方法;基于動力學建模,賀懷清等人使用粒子系統[4]、隨機風浪法[5](特征風浪模型)模擬,粒子數量越多,模擬生成的效果越好,相應的實時性也更差一些;龔琳等人基于分形幾何建模[6],多次迭代反映海浪分形特點的動態過程;在波動粒子的基礎上,Jeschke 和Wojtan 引入了以理論群速度傳播的水波小包[7]方法,該方法繼承了基于頻譜的有點方法的優點,如數值穩定性和理論上準確的波速,同時通過將全局余弦波分解成一系列更短的波分量,從而避免了基于頻譜的方法的復雜性;在水面小包的基礎上,Jeschke 對其進行了改進,提出了新的水面小波[8]的方法,該方法基于歐拉方法,自由度與空間區域有關,與波動本身無關。因此該方法可以和GPU 更好地結合,因為計算復雜度是恒定的,不隨粒子的數量而變化。
大量海浪的數學模型,最后都是通過OpenGL3D圖形庫來實現海浪最終的繪制工作。在海浪仿真中網格劃分和渲染也是幾年來研究的重點,尤其是如何在實際海浪繪制過程中減少計算量,提高繪制逼真度與實時性。結合國內外學者的研究,James 使用LOD 模型[9],逐次將大范圍的海面網格按照不同分辨率進行劃分;Tessendorf 提出基于矩形網格[10]的方法,對海面進行均勻采樣;Lindstrom 提出高度場的方法,根據高度的變化將高度場所對應的頂點看作四叉樹,記錄頂點之間的關系,根據各個高度差的投影及相互關系選擇合適的頂點實時構造三角形網格[11];Johanson 提出投影網格[12],將屏幕空間劃分生成均勻采樣網格,頂點著色器將從視點發出的投射光線穿過視口的采樣網格,與一個基底平面相交,交點即為網格頂點的世界坐標。然后將頂點移動到交點位置,生成原始網格,解翠在這基礎上做了改進[13];圓形網格法[14],以視點在海面的中心為圓心,在沿著圓周對角方向進行等分,離圓心較近的地方采樣數較多,越遠采樣數越少,適用于以物體為中心的海洋場景的描繪。
海浪的通透感的具體實現有LUT 方法(Look-Up-Table Approach),Depth Based-LUT 方法,思路是計算視線方向的水體像素深度,然后基于此深度值采樣吸收/散射LUT(Absorb/Scatter LUT)紋理,以控制不同深度水體的上色,得到通透的水體質感表現;次表面散射近似方法[15](Sub-Surface Scattering, SSS Approximation Approach),將水體的光照分解成水體表面的漫反射顏色乘以散射顏色加上高光顏色。高光的計算使用經典的BlinnPhong 光照公式;同時將LUT 與次表面散射近似兩種方案結合使用。
通過上述方法能較為真實地渲染出海洋特效,并各自適配一些特定的渲染場景,可使海洋水體運動更真實,水面更通透,白沫更符合實際自然場景的物理特性,但其中方法由于參數或幀率限制并不能很好地適配飛行模擬機視景。
結合飛行模擬機的實際情況,本文將采用IFFT 解算Phillips 頻譜構建海面高度場,使用投影網格的繪制方法,結合改進的SSS 增加通透性,適配飛行模擬的實際地形采用基于Multi Ramp Map 方法實現近岸白沫特效改進,最終實現適配飛模全球地形的海洋渲染。
我們可以將海浪理解為由無限多的頻率不同、方向不一致、振幅不相等、相位雜亂無章的正弦波(余弦波)疊加的結果,由各個組成波提供海浪所具有的能量。海浪譜則是一種描述海浪能量隨方向或頻率和分布的物理量。所謂譜就是不同頻率間隔內波浪能量的分布,因為它是波的能量沿頻率的分布,所以叫頻譜或譜。由于Phillips 頻譜得到的統計數據是從真實海洋中獲得的,所以模擬出的深海海浪效果更接近真實。為了構建動態海浪,利用Phillips 頻譜計算海浪頻域的振幅值,通過IFFT 將頻域的振幅值變換到時域的高度值,從而構建海面高度場。
首先將屏幕空間劃分生成均勻的采樣網格,顯卡的渲染性能決定其最大分辨率。在可編程渲染管線的流程下,vertex shader 將從視點發出的投射光線從視口的采樣網格穿過,相交于基底的平面,交點即為世界坐標系下的網格頂點,再將頂點移動到交點位置從而生成原始網格,并自動實現LOD。采樣網格由于基于屏幕空間劃分,所以其大小和數目固定不變。同時固定的采樣網格可以存儲在顯存中,作為輸入數據直接輸入vertex shader 中。由于只在開始傳輸時生成的采樣網格,而不是在每一幀中都傳輸一次,所以有效地減少了處理器和顯卡之間的傳輸開銷,vertex buffer 直接把數據加載到顯存里,減少了渲染的時間。另外,由于在每一幀的渲染中只對同樣數目的三角網格進行投射計算以及渲染,因而在整個渲染過程中幀率較為穩定。

圖1 投影網格原理
關于水體渲染的Shading 部分,首先要提到的是,目前游戲業界的主流方案都不是基于物理的。光線到達水面后除了在水體表面發生反射以外,還有一部分光線進入水體內部,經過吸收和散射后再次從水體表面射出,即水體的次表面散射現象(Sub-Surface Scattering,SSS)。基于物理的渲染中,求解次表面散射最標準的方法是求解BSSRDF(Bidirectional Surface Scattering Reflectance Distribution Function,雙向表面散射反射分布函數)。但在光柵圖形學中,求解BSSRDF 需要很大的計算量,所以實時渲染業界大多數的水體渲染,依舊是非基于物理的經驗型渲染方法。本文采用改進次表面散射的方法,假設光更有可能在波浪的一側被水散射與透射。基于FFT 模擬產生的頂點偏移,為波的側面生成波峰mask,再根據視角,光源方向和波峰mask 的組合,將次表面散射水體顏色和深水顏色之間進行混合,得到次表面散射顏色。最后將位移值(Displacement)除以波長,并用此縮放后的新的位移值計算得出次表面散射項強度,在實際項目里幀率也較為穩定。
在飛行模擬中運用本文的方法渲染的海洋效果界面效果如圖3 所示,用遮罩紋理的思想以顏色通道不同的值進行了區分,更加直觀。使用本文方法前后的海洋渲染對比圖如圖2-圖3。

圖2 改進前

圖3 改進后
本文在IFFT 解算Phillips 頻譜的基礎上,結合飛行模擬的實際情況,采用投影網格與改進的次表面散射的方法渲染海洋,幀率穩定在62Hz 左右,現已應用于本飛行模擬機,具有一定的實際應用意義。此次項目研究的基礎是飛行模擬部門的自研Hive 引擎框架與提供的1080Ti 高性能工作站計算機和能夠滿足海洋組件的添加與渲染特效的顯卡。
目前在飛行模擬視景中已經實現了小范圍地形上的海洋特效渲染,后續的工作是繼續改進該海洋渲染算法,并適配全球地形。