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