摘 ?要:使用快速傅里葉變換來(lái)計(jì)算深海海浪的網(wǎng)格與法線信息,添加風(fēng)力的影響構(gòu)建深海海面的波形并計(jì)算法線信息;然后對(duì)Gerstner波形進(jìn)行擠壓,構(gòu)建靠近岸邊的海水波形,計(jì)算水體的法線。添加光照模型,豐富海面的紋理。借用Unity的著色器進(jìn)行渲染,實(shí)時(shí)的展現(xiàn)出海面的波浪效果。在增加海面的采樣點(diǎn)的情況下,依然可以保持較好的時(shí)效性。提升了海平面的細(xì)節(jié),增強(qiáng)了視覺(jué)效果。
關(guān)鍵詞:快速傅里葉變換;海面;法線;渲染
中圖分類號(hào):TP391.9;P731.22 ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2020)21-0024-04
Sea Surface Simulation Rendering Method Based on FFT
ZHANG Junpeng
(Qingdao University,Qingdao ?266071,China)
Abstract:FFT(fast Fourier transform)is used to calculate the grid and normal line information of deep sea waves,and the influence of wind is added to construct the waveform of deep sea surface and calculate the normal line information;then Gerstner waveform is extruded to construct the seawater waveform near the shore and calculate the normal of water body. Add a lighting model to enrich the texture of the sea. Using Unitys shaders to render,real-time show the wave effect of the sea. In the case of increasing the sea surface sampling points,it can still maintain good timeliness. Promote the details of the sea level,enhance the visual effect.
Keywords:fast Fourier transform;sea surface;normal line;rendering
0 ?引 ?言
模擬自然景觀中的流體一直是計(jì)算機(jī)圖形學(xué)比較重要的研究方向,其中包括火焰、水流等常見(jiàn)的流體。國(guó)內(nèi)外大量學(xué)者都在虛擬海洋環(huán)境可視化方面做了很多工作,因?yàn)楹Q蟓h(huán)境復(fù)雜多變,海面可能會(huì)受到風(fēng)力、洋流等許多因素的影響,生成復(fù)雜的海浪波形,提升海面波浪可視化的實(shí)時(shí)性和真實(shí)性成為了國(guó)內(nèi)外學(xué)者研究的難點(diǎn)。在渲染海面波浪紋理的方面,初期使用的方法是在海面網(wǎng)格上映射上一張法線貼圖,再通過(guò)紋理的擾動(dòng)得到近似海浪的效果。之后有學(xué)者發(fā)現(xiàn)Gerstner波可以模擬水體的波浪,其波形的浪尖被可以較為真實(shí)得描繪出水體的波浪。1986年,F(xiàn)ournier與Reeves[1]第一次使用Gerstner波構(gòu)建出生動(dòng)的海洋模型。2001年,Jerry Tessendorf[2]提出可以在海平面模型上添加采樣點(diǎn),使用快速傅里葉變換(FFT)生成多種波形相互疊加的逼真海面模型并提高了實(shí)時(shí)性。童若鋒等[3]對(duì)頂點(diǎn)波以及短峰波進(jìn)行分類造型,模擬水波的大致形狀。徐迎慶[4]等使用Saint-Venant方程組來(lái)構(gòu)建海浪模型。在海面光學(xué)模擬上,2016年,唐勇等[5]對(duì)近島海洋場(chǎng)景中的海水色彩進(jìn)行實(shí)時(shí)繪制,2018年,Jeschke S,Sk?ivan T,Müller-Fischer M等[6]使用小波變換對(duì)水體變換進(jìn)行離散化處理,該方法是FFT生成模型的拓展,可以準(zhǔn)確計(jì)算出物體與流體直接的作用。
本人愛(ài)好研究游戲制作,為了在游戲虛擬海洋場(chǎng)景中渲染出完整真實(shí)的海面模型,并且添加合適的光線效果,需要構(gòu)建一個(gè)完整的海面渲染可視化流程。本文首先使用FFT波浪方程計(jì)算法線貼圖用于生成深海海浪,之后使用變形的Gerstner波用于生成海岸邊的波浪模型,并添加光照模型,生成較為完善的渲染框架。
1 ?海面海浪模型及法線
逼真的海面模擬特效需要有海面網(wǎng)格的劃分,模擬真實(shí)的海洋波浪,也需要模擬光照在海平面上的折射與反射的效果,本文所用技術(shù)為可編程的著色器,使用FFT變換與Gerstner波形實(shí)時(shí)構(gòu)建深海與岸邊波形與法線,并添加菲涅爾反射,渲染工作由Unity的shader編寫。
1.1 ?深海波浪模型
深海海面的模擬波浪可以看做是多個(gè)不同周期不同偏執(zhí)的正弦曲線的疊加而來(lái):
y=Aisin(ωix+tφi) ? ? ? ? ? ? ? ? ? ?(1)
其中,Ai為正弦曲線的振幅大小,ωi=,L為正弦曲線的波長(zhǎng),φi為波的初相移動(dòng)。通過(guò)正弦曲線疊加而來(lái)的波形看起來(lái)較為圓滑,比較適合繪制平靜的湖面,但是對(duì)于波濤洶涌的海洋,還需要繪制尖型的浪頭的較寬的浪槽,這里本文在正弦波的水平方向增加位移,使用Gerstner波形來(lái)描繪海浪的浪尖。
(2)
其中,x、z為平面坐標(biāo)中的長(zhǎng)寬,Di為波峰運(yùn)動(dòng)方向,φi為波的初相移,i為每個(gè)Gerstner波形的序號(hào),根據(jù)公式可以看出在相位波的傳導(dǎo)過(guò)程中添加了的相位偏移進(jìn)行擠壓波形,當(dāng)Qi=0時(shí),這時(shí)波形是一個(gè)簡(jiǎn)單的正弦波,而當(dāng)Qi=時(shí)候會(huì)得到波峰最尖的波形。在海洋統(tǒng)計(jì)學(xué)中,波浪振幅可以看成一個(gè)高度函數(shù)h(x,t),X是一個(gè)二維坐標(biāo)(x,z),將Y中時(shí)間t去掉,使用h(x,t)替換可得:
Y=h(x,t)×cos(ωiDi×(x,z)) ? ? ? (3)
將公式添加一個(gè)虛部可得:
Y=h(x,t)×cos(ωiDi×(x,z))+isin(ωiDi×(x,z)) ? ? ?(4)
然后我們?cè)O(shè)α為以弧度為單位的參數(shù),根據(jù)歐拉公式e iα= cosα+isinα帶入式(4)可得到:
Y=h(x,t)eiωiDiX ? ? ? ? ? ? ? ? ? ? ? ? (5)
此公式為海洋波形的初步形式,這時(shí)我們就可以根據(jù)快速傅里葉變換可快速對(duì)大量的cos和sin波形求和,這樣我們可以得到Tessendorf所提到的海洋公式:
(6)
本文設(shè)置參數(shù)為水平方向的坐標(biāo),t為時(shí)間,函數(shù) 就得到在相應(yīng)時(shí)間與地點(diǎn)的海平面的高度,這里可以看出就是對(duì)做的離散傅里葉變換:
(7)
其中,k為波的方向向量,Lx和Lz為定義海面的長(zhǎng)寬,N和M為定義離散采樣的點(diǎn)數(shù),如果采樣的數(shù)值越高,波形就會(huì)越平滑,但是計(jì)算的時(shí)間也會(huì)隨之增加。通過(guò)式(6)可以看出,只要得到頻譜h(k,t),就可以對(duì)其進(jìn)行離散傅里葉變換得到平面的高度。這里頻譜設(shè)置為:
(8)
其中, 為 ?的共軛復(fù)數(shù),k為 ?的模,ω(k)為角頻率ω和波長(zhǎng)的關(guān)系。
本文設(shè)置參數(shù)ω(k)2=gk,k為波浪傳播的模,g為重力加速度,其中Tessendorf使用傅里葉頻譜函數(shù)創(chuàng)建初始時(shí)刻海面高度場(chǎng)的傅里葉頻譜海面高度模型表示為:
(9)
其中,ξr和ξi為兩個(gè)相互獨(dú)立的高斯隨機(jī)數(shù),Ph(k)為方向波譜:
(10)
A為頻譜的幅度,向量為傳播的風(fēng)向,l=v2/g,這里l等于風(fēng)速在v時(shí)候的最大波浪。這樣遠(yuǎn)洋處的波形就形成了。
1.2 ?深海波浪法線計(jì)算
在求得深海海平面高度方程后,可以使用差分法求法線,根據(jù)已求得的高度公式 因此本文可求得波浪的空間梯度為:
(11)
而海平面參數(shù)方程可表示為:
P(x,z,t)=(x,H(x,z,t),z) ? ? ? (12)
海平面的次法線與切向量分別可以看作是海平面方程對(duì)x與z求偏導(dǎo)數(shù)求出,因此,次法線N1可以表示為:
(13)
海平面切向量T可以表示為:
(14)
因此海面的法線N可以由切向量T叉乘次法線N1求出法線:
(15)
海面的網(wǎng)格與法線的公式已經(jīng)得出,接下來(lái)就可以對(duì)公式進(jìn)行計(jì)算了,但是使用標(biāo)準(zhǔn)DFT性能消耗較大,所以本文使用FFT進(jìn)行計(jì)算。網(wǎng)格信息的采樣點(diǎn)數(shù)N、M會(huì)影響海面的渲染效率,但是本文借助GPU的強(qiáng)大計(jì)算性能和使用FFT并行計(jì)算大量頻率信息,可以實(shí)時(shí)有效地完成對(duì)海平面的渲染。
1.3 ?靠近岸邊的海面波浪模型
遠(yuǎn)洋海浪可以看作是不同頻率不同方向的多種波形疊加而成,而近岸處的海浪則會(huì)因?yàn)樗俣炔疃斐善D(zhuǎn),近岸處的海浪波形可以看作是波形收到了來(lái)自岸邊方向的擠壓而造成的。為了形成尖型的波峰,我們通過(guò)對(duì)橫軸進(jìn)行擠壓這里使用x=x-bsin(x)來(lái)對(duì)橫軸進(jìn)行擠壓,b為表示擠壓程度的參數(shù),我們?cè)O(shè)自變量為q,生成Gerstner波:
X(q)=q-b×sin(q)
可得到Gerstner波形如圖1所示。
因?yàn)樵谧匀唤缰锌拷哆叺牟ɡ送菐в袃A斜角度的波浪,本文為了形成海浪傾斜的波形,將剛剛生成的Gerstner波形前半個(gè)周期進(jìn)行擠壓,后半個(gè)周期進(jìn)行拉伸,從而形成了向岸邊傾斜的波浪形狀。波浪的傾斜角度會(huì)隨著離岸邊的距離增加而增加,所以本文也構(gòu)建不同傾斜角度的函數(shù),這里函數(shù)如下,函數(shù)圖像如圖2所示。
r=1+k×x2
這里r為擠壓的系數(shù)參數(shù),將模型轉(zhuǎn)換為3D情況下,只需添加方向向量即可,因?yàn)樵娇拷0兜那闆r下,海浪的頻率就會(huì)變得越高,所以本文在將靠近海岸的海浪波形頻率增大。
1.4 ?靠近岸邊的海面波浪法線計(jì)算
由N=normailze()得,只需求得 ?便可以得到一個(gè)函數(shù)周期中的法線,根據(jù)之前的公式推導(dǎo)可得:
(16)
因此可得出海平面的法線向量,此時(shí)求得的海浪法線為2D的,若要求得3D的法線,只需要將法線乘以海浪的傳播方向dir即可:
(17)
這樣就求得了近海的波形與法線,但是此時(shí)的波形高度和法線都太平滑,所以在計(jì)算時(shí)這里使用噪聲圖對(duì)模型的UV以及法線進(jìn)行不規(guī)則的微弱扭曲,得到不規(guī)則的扭曲后的波浪。
2 ?海面光照
為了渲染出自然界真實(shí)的海面效果,光照模型是必不可少的。光照模型是用于計(jì)算光源經(jīng)過(guò)物體反射、折射、散射后返回到渲染畫面的數(shù)學(xué)模型表示方式。隨著GPU的性能提升,光照模型的計(jì)算效率和效果都得到了極大的提升。自然界的水體可以看作是一個(gè)理想的鏡面模型,但不同的是,在光線到達(dá)此模型時(shí)主要分為兩部分:一個(gè)是穿透海面經(jīng)過(guò)折射的光線和被反射的光線,這兩種光線受到反射與折射的系數(shù)影響。
2.1 ?反射光
在鏡面反射中,入射角等于反射角,之前已經(jīng)求出海面波浪函數(shù)h(x,t)以及海面的法向量N,當(dāng)知道射入海面的光線方向向量Li就可以得到反射后的向量Lo:
(18)
2.2 ?菲涅爾反射
菲涅爾反射描述了一種光學(xué)現(xiàn)象,當(dāng)光照到物體表面時(shí),一部分發(fā)生反射,另一部分則進(jìn)入物體內(nèi)部,發(fā)生折射或散射;相比直接的反射和折射計(jì)算,菲涅爾反射更接近真實(shí)情況。菲涅爾反射光學(xué)模型一般運(yùn)用于水面效果,在自然界中,當(dāng)看向近處的水面時(shí),反射較少,而遠(yuǎn)處的水面反射較多,即反射率隨著入射角的增大而增大,這種現(xiàn)象稱為菲尼爾效應(yīng)。設(shè)F0為反射系數(shù),e為視線的方向,N為海面的法向量,在實(shí)時(shí)渲染時(shí)通常使用Schlick菲涅爾近似等式:
(19)
海平面因?yàn)椴煌姆瓷渎识纬傻墓庹漳P褪侵匾暮C婕y理之一,在本文中,通過(guò)不同方向的法線、反射率而形成的海面紋理更加具有真實(shí)感和實(shí)時(shí)性。
3 ?實(shí)驗(yàn)與結(jié)果
3.1 ?實(shí)驗(yàn)環(huán)境與實(shí)驗(yàn)效果
本文實(shí)驗(yàn)采用的機(jī)器配置為:Intel Core i7-8750,雙核四線程,主頻2.2 GHz,內(nèi)存16 GB,NVIDIA GTX1060顯卡,CUDA版本為10.2。海面網(wǎng)格信息與實(shí)時(shí)渲染由Unity引擎,通過(guò)c#以及cg著色器語(yǔ)言實(shí)現(xiàn),本文在渲染計(jì)算中,絕大部分是FFT海面網(wǎng)格以及法線的計(jì)算,采樣的點(diǎn)數(shù)為512×512,通過(guò)著色器的渲染,可以呈現(xiàn)出逼真的海面波浪紋理,實(shí)驗(yàn)效果圖如圖3所示。
3.2 ?實(shí)驗(yàn)對(duì)比結(jié)果
本文算法在渲染時(shí)的真實(shí)感和實(shí)時(shí)性都較好,影響渲染效率的主要因素是采樣點(diǎn)的個(gè)數(shù),將本文方法與投影網(wǎng)格方法做出對(duì)比如表1所示。
對(duì)比本文方法與投影網(wǎng)格法的幀數(shù)中可以看出,本文方法渲染效率略低于投影網(wǎng)格法,但是渲染出來(lái)的真實(shí)性較好,在采樣點(diǎn)增加的情況下幀數(shù)雖然有所下降,但是幀數(shù)依然可以保持在200幀以上,可以夠保證渲染的實(shí)時(shí)性。
4 ?結(jié) ?論
本文使用FFT構(gòu)建了深海海浪的網(wǎng)格與法線信息,然后對(duì)Gerstner波進(jìn)行方向上的擠壓,通過(guò)海水波形并計(jì)算水體法線。通過(guò)添加光照模型,渲染自然界真實(shí)的海面效果。經(jīng)過(guò)對(duì)比,本文的渲染方法在真實(shí)性和實(shí)時(shí)性方面效果較好,但渲染效率略低于投影網(wǎng)格法。因此,在渲染效率方面作者將做出深入研究。
參考文獻(xiàn):
[1] FOURNIER A,REEVES W T.A simple model of ocean waves [J].ACM SIGGRAPH Computer Graphics,1986,20(4):75-84.
[2] TESSENDORF J.Simulating ocean water [J].Simulating nature:realistic and interactive techniques,2001,1(2):5.
[3] 童若鋒,汪國(guó)昭.用于動(dòng)畫的水波造型 [J].計(jì)算機(jī)學(xué)報(bào),1996(8):594-599+642.
[4] 徐迎慶,蘇成,李華,等.基于物理模型的流水及波浪模擬 [J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),1997(2):96-97.
[5] 唐勇,范福鼎,李穎.近島海洋場(chǎng)景海水色彩真實(shí)感實(shí)時(shí)繪制 [J].小型微型計(jì)算機(jī)系統(tǒng),2016,37(4):847-850.
[6] JESCHKE S,SK?IVAN T,M?LLER-FISCHER M.Water surface wavelets [J].ACM Transactions on Graphics,2018,37(4):742-755.
作者簡(jiǎn)介:張軍鵬(1994—),男,漢族,河南新鄉(xiāng)人,碩士研究生在讀,研究方向:計(jì)算機(jī)視覺(jué)。