【計算機圖形學】基於BRDF的無限海水渲染

基於BRDF的無限海水渲染

  • 前言
  • 屏幕空間網格投影
  • Pierson-Moskowitz海浪譜
  • 海水的BRDF模型
  • 實現結果
  • 參考文獻
    在這裏插入圖片描述
    在這裏插入圖片描述

前言

  本文主要是關於實時海水渲染,海水幾何造型是基於Pierson-Moskowitz海浪譜的反演,然後疊加多個Gerstner擺動波來計算網格頂點的波浪偏移。光照方面則是基於Ross推出針對海水的BRDFBRDF(Bidirectional Reflectance Distribution Function,雙向反射分佈函數)物理模型。因代碼比較繁多,故均用僞代碼描述。源代碼暫不開放。本文如有錯誤,歡迎指出,非常感謝!
  主要參考文獻爲《Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF》。

屏幕空間網格投影

1、大致算法

  實現無限海面有多種方法,如LOD動態四叉樹算法、遠近平面平湊法以及屏幕空間網格投影法等。這裏我將採用屏幕空間網格投影法,這是一個非常巧妙的算法,表面上我們是在渲染無限大的海面,實際上我們只需處理屏幕大小的海面網格,整個算法的處理複雜度就僅與屏幕空間中的網格精細程度相關,與海面的規模無關。

  算法大致步驟如下:
  ①在屏幕投影空間創建一個規則的平面網格Grid(座標範圍[1,1][-1,1]);
  ②將上一步的網格Grid投影到海平面上,即變換到世界空間,此時得到一個水平面;
  ③對網格Grid進行Displace,即計算每個網格點的波浪偏移量,加到對應的頂點上;
  ④最後將海面網格Grid投影回屏幕空間。
在這裏插入圖片描述

2、具體細節

在屏幕投影空間創建網格

  一個模型要顯示到屏幕上,需要經過世界變換\to視圖變換\to投影變換\to視口變換。我們創建的網格直接在屏幕投影空間中,不需要經過世界變換、視圖變換以及投影變換,故網格的xxyy座標範圍爲[1,1][-1,1],而zz的座標值爲00,此時該網格就已經在屏幕投影空間了。

  值得注意的是,我們創建的網格要比[1,1]×[1,1][-1,1]\times[-1,1]的範圍稍微大一些。因爲我們將網格投影到世界空間時,還要加上波浪的偏移量,這可能導致邊緣部分因爲發生了一些偏移而使得網格邊緣凸顯出來了,破壞了我們在渲染無限海面的假象。

將屏幕網格投影到世界空間的水平面

  首先求出以網格頂點爲起點、方向指向水平面的射線,然後求該射線與水平面的交點。對於世界空間的一點,經過視圖變換、投影變換我們有:

  Pproj=MprojMviewPworldP_{proj}=M_{proj}*M_{view}*P_{world}(列主序矩陣的寫法)  (1)

  那麼現在反過來已知PprojP_{proj}PworldP_{world},則有:

  Pworld=Mview1Mproj1PprojP_{world}=M_{view}^{-1}*M_{proj}^{-1}*P_{proj}  (2)

  我們在屏幕空間創建的網格z座標爲0,即深度爲0,因此由(2)求得的PworldP_{world}是世界空間下射線的方向向量。射線的方程可表示爲:

  p=p0+dirtp=p_0+dir*t  (3)

  其中p0p_0爲射線起始點,dirdir爲射線的單位方向向量。射線的任意一點都可以用方程(3)表示。它方程(3)寫成各個分量的表示形式就是:

  p.x=p0.x+dir.xtp.x=p_0.x+dir.x*t
  p.y=p0.y+dir.ytp.y=p_0.y+dir.y*t  (4)
  p.z=p0.z+dir.ztp.z=p_0.z+dir.z*t

  而平面的方程爲:

  Ax+By+Cz+D=0Ax+By+Cz+D=0  (5)

  水平面若垂直於y軸,則平面方程(5)可化簡爲:

  y=Ey=E   (6)

  聯立(4)和(6)我們求得交點座標在射線方程(3)中的tt值:

  p.y=p0.y+dir.yt=Et=Ep0.ydir.yp.y=p_0.y+dir.y*t=E \to t=\frac{E-p_0.y}{dir.y} (7)

  因此我們根據tt可求得交點座標。

Pierson-Moskowitz海浪譜構建海浪

  我們採用從 Pierson-Moskowitz海浪譜採樣的n個擺動波疊加構建海浪。

   Pierson-Moskowitz頻譜給出了重力波的能量分佈,它是頻率的函數:

  h(ω)S(ω),S(ω)=αg2ω5exp[β(ω0ω)4]h(\omega)\infty \sqrt{S(\omega)}, S(\omega)=\frac{\alpha g^2}{\omega^5}exp[-\beta(\frac{\omega_0}{\omega})^4]  (8)

  其中h(ω)h(\omega)爲波幅,重力常數g=9.81ms2g=9.81ms^{-2}α=8.1×103\alpha=8.1\times10^{-3}β=0.74\beta=0.74ω0=g/V20\omega_0=g/V_{20}V20V_{20}爲海面上20米處的風速,參數ω\omega爲角頻率。此外,式中\infty表示成正比例的關係。

Gerstner擺動波

  海浪水面渲染中我們使用的基礎波形並不是正弦波或餘弦波,而是一種叫做Gerstner波的特殊波形,Gerstner波和正餘弦波的區別,如下所示。與紅色的正餘弦波相比,Gerstner波在兩側有收緊的趨勢,和真實的海面更加接近。
在這裏插入圖片描述
  一個二維的Gerstner波定義如下:

  p=[x+hsin(ωtkx),hcos(ωtkx)]Tp=[x+hsin(\omega t-kx),hcos(\omega t-kx)]^T  (9)
在這裏插入圖片描述
  其中,hh爲振幅,tt爲時間,kk爲波數,ω\omega爲角頻率,xx爲靜止時的水平位置。可以看出二維的Gerstner波是圍繞靜止時的位置[x,0]T[x,0]^T做圓周運動。對於深水波浪,有ω=gk\omega=\sqrt{gk}

  我們把它推廣到三維,則三維的Gerstner波爲:

  phase=ωtkxxkzz=ωt(kx,kz)(x,z)phase=\omega t-k_xx-k_zz=\omega t-(k_x,k_z)\cdot (x,z)
  p=[x+hcosθsin(phase),hcos(phase),z+hsinθsin(phase)]Tp=[x+hcos\theta sin(phase),hcos(phase),z+hsin\theta sin(phase)]^T  (10)

  三維的Gerstner波圍繞靜止時的位置[x,0,z]T[x,0,z]^T做圓周運動。在這裏波數kk變成了一個向量,稱爲波矢量,k=(kx,kz)=(2πλcosθ,2πλsinθ)k=(k_x,k_z)=(\frac{2\pi}{\lambda}cos\theta,\frac{2\pi}{\lambda}sin\theta),故波矢量大小表示波數(即2πλ\frac{2\pi}{\lambda},其中λ\lambda爲波長,θ\theta爲波的方向角,即波傳播方向與xx軸的夾角),波矢量方向表示波的傳播方向。

  在構建海浪波形時,我們將n個擺動波進行疊加,每個擺動波都有各自對應的振幅、波矢量、角頻率,即(hi,ki,ωi)(h_i,k_i,\omega_i)。我們將從Pierson-Moskowitz頻譜採樣獲取擺動波的(hi,ki,ωi)(h_i,k_i,\omega_i)

Pierson-Moskowitz海浪譜反演

  由式(8)知,波幅與S(ω)S(\omega)成正比,

  h(ω)S(ω),S(ω)=αg2ω5exp[β(ω0ω)4]=8.1×103×9.81×9.81ω5exp[0.74(ω0ω)4]h(\omega)\infty\sqrt{S(\omega)},S(\omega)=\frac{\alpha g^2}{\omega^5}exp[-\beta(\frac{\omega_0}{\omega})^4]=\frac{8.1\times10^{-3}\times9.81\times9.81}{\omega^5}exp[-0.74(\frac{\omega_0}{\omega})^4]
  在實現中,我們取波幅如下:

  h(ω)=Aαg2ω5exp[β(ω0ω)4]ωΔλh(\omega)=A\sqrt{\frac{\alpha g^2}{\omega^5}exp[-\beta(\frac{\omega_0}{\omega})^4]\omega\Delta\lambda}  (11)

  其中AA爲波幅峯值。爲了充分利用GPU的並行能力,我們在頂點着色器進行擺動波的疊加,每個擺動波的(hi,ki,ωi)(h_i,k_i,\omega_i)由Pierson-Moskowitz海浪譜採樣獲得。爲此,我們生成n個隨機波浪(hi,ki,ωi)(h_i,k_i,\omega_i),將(hi,ki,ωi)(h_i,k_i,\omega_i)存放至1D1D紋理中,供頂點着色器進行採樣
在這裏插入圖片描述
  爲了構建P-M海浪譜,我們採用波長劃分的方法,與此同時我們隨機獲取波的方向角。
  值得注意的是,我們是按照波長從小到大的順序將每個波存放到1D1D紋理中,這便於後面我們根據波長進行濾波操作。

網格頂點位置

  按照論文所述,我們不能直接將nn個擺動波疊加,而需要將波長λ\lambda小於NminLN_{min}*L的擺動波過濾掉,其中NminN_{min}是奈奎斯特下界,LL爲世界空間中網格單元的大小(原因不明)。

  爲此,對於每個擺動波,我們乘上一個縮放係數wp,iw_{p,i}

  wp,i(Nmin,Nmax,λi/L)=clamp(λi/LNminNmaxNmin,0,1)w_{p,i}(N_{min},N_{max},\lambda_i/L)=clamp(\frac{\lambda_i/L-N_{min}}{N_{max}-N_{min}},0,1)  (12)

  結合前面所述公式(10),每個網格頂點的最終位置如下:

  P=(X,Y,Z)P=(X,Y,Z)
  ki=(ki,x,ki,z)=2πλi(cosθi,sinθi)k_i=(k_{i,x},k_{i,z})=\frac{2\pi}{\lambda_i}(cos\theta_i,sin\theta_i)
  X=x+Σ1nwp,ihicosθisin(ωitki(x,z))X=x+\Sigma_1^nw_{p,i}h_icos\theta_isin(\omega_it-k_i\cdot(x,z))  (13)
  Y=y+Σ1nwp,ihicos(ωitki(x,z))Y=y+\Sigma_1^nw_{p,i}h_icos(\omega_it-k_i\cdot(x,z))
  Z=z+Σ1nwp,ihisinθisin(ωitki(x,z))Z=z+\Sigma_1^nw_{p,i}h_isin\theta_isin(\omega_it-k_i\cdot(x,z))

  其中(x,y,z)(x,y,z)是網格頂點靜止時的位置。我們在頂點着色器實現這nn個擺動波的疊加,從前面生成的1D1D紋理採樣(hi,ωi,ki)(h_i,\omega_i,k_i)tt是時間點,隨着時間推移,波浪圍繞着靜止時的位置做圓周運動。

網格頂點法線

  我們通過沿xx軸的切線、沿zz軸的切線的叉乘來求得當前頂點的法向量。爲此,我們分別對式(13)求關於xx的偏導、關於zz的偏導。

  與頂點位置的計算一樣,我們同樣要過濾掉波長小於NminlN_{min}*l的擺動波(這裏ll爲屏幕空間中網格的大小,注意與LL區分),爲此設濾波權重wn,iw_{n,i}

  wn,i(Nmin,Nmax,λi/l)=clamp(λi/lNminNmaxNmin,0,1)w_{n,i}(N_{min},N_{max},\lambda_i/l)=clamp(\frac{\lambda_i/l-N_{min}}{N_{max}-N_{min}},0,1)  (14)

  將頂點位置中的wp,iw_{p,i}wn,iw_{n,i}替換。

  求解PP關於xx的偏導數,沿xx軸的切向量:

  phase=ωitki(x,z)phase=\omega_it-k_i\cdot(x,z)
  Px=(Xx,Yx,Zx)\frac{\partial P}{\partial x}=(\frac{\partial X}{\partial x},\frac{\partial Y}{\partial x},\frac{\partial Z}{\partial x})
  Xx=1+Σ1nwn,ihicosθicos(phase)(ki,x)\frac{\partial X}{\partial x}=1+\Sigma_1^nw_{n,i}h_icos\theta_icos(phase)(-k_{i,x})  (15)
  Yx=0+Σ1nwn,ihi[sin(phase)](ki,x)\frac{\partial Y}{\partial x}=0+\Sigma_1^nw_{n,i}h_i[-sin(phase)](-k_{i,x})
  Zx=0+Σ1nwn,ihicosθicos(phase)(ki,x)\frac{\partial Z}{\partial x}=0+\Sigma_1^nw_{n,i}h_icos\theta_icos(phase)(-k_{i,x})

  求解PP關於zz的偏導數,沿yy軸的切向量:

  Pz=(Xz,Yz,Zz)\frac{\partial P}{\partial z}=(\frac{\partial X}{\partial z},\frac{\partial Y}{\partial z},\frac{\partial Z}{\partial z})
  Xz=0+Σ1nwn,ihicosθicos(phase)(ki,z)\frac{\partial X}{\partial z}=0+\Sigma_1^nw_{n,i}h_icos\theta_icos(phase)(-k_{i,z})  (16)
  Yz=0+Σ1nwn,ihi[sin(phase)](ki,z)\frac{\partial Y}{\partial z}=0+\Sigma_1^nw_{n,i}h_i[-sin(phase)](-k_{i,z})
  Zz=1+Σ1nwn,ihicosθicos(phase)(ki,z)\frac{\partial Z}{\partial z}=1+\Sigma_1^nw_{n,i}h_icos\theta_icos(phase)(-k_{i,z})

  從而,結合式(15)、式(16),我們得頂點的法向量如下:

  N=Px×PzN=\frac{\partial P}{\partial x}\times\frac{\partial P}{\partial z}  (17)

網格頂點斜率方差

  爲了計算海面的BRDFBRDF函數,我們需要頂點的一些統計學性質來捕捉海水亞像素表面的細節。不同波長的擺動波序列可被視爲獨立的隨機變量,根據中心極限定理,許多這樣的擺動波疊加構成了一個表面,這個表面的斜率遵從高斯分佈,斜率的方差是每個擺動波斜率方差之和。

  σx2=Σ1nki,xki2(11ki2wr2hi2)\sigma_x^2=\Sigma_1^n\frac{k_{i,x}}{||k_i||^2}(1-\sqrt{1-||k_i||^2w_r^2h_i^2})  
  σz2=Σ1nki,zki2(11ki2wr2hi2)\sigma_z^2=\Sigma_1^n\frac{k_{i,z}}{||k_i||^2}(1-\sqrt{1-||k_i||^2w_r^2h_i^2})  (18)

  其中σx2\sigma_x^2σz2\sigma_z^2是沿着xx軸、zz軸的斜率方差,而wr=1wnw_r=1-w_n。在實現中,我們是沿着風向以及垂直於風向的兩個方向軸計算這兩個方差,這兩個方向軸對應斜率橢圓高斯分佈的軸。

海水的BRDF模型

  在海洋光學中,Ross等人推出了一個針對各項異性表面且斜率和高度遵從高斯分佈的BRDFBRDF模型。對於一個給定斜率ζ\zeta的微平面,他們採用Smith的shadowing因子來推算這個微平面對於視線vv和光線ll均可見的概率。

  qvn(ζ,v,l)=p(ζ)max(vf,0)H(lf)1+(av)+(al))fzcosθvd2ζq_{vn}(\zeta,v,l)=\frac{p(\zeta)max(v\cdot f,0)H(l\cdot f)}{1+\bigwedge(a_v)+\bigwedge(a_l))f_zcos\theta_v}d^2\zeta  (19)

  f(ζ)=[fx,fy,fz]T=11+ζx2+ζy2[ζx,ζy,1]Tf(\zeta)=[f_x,f_y,f_z]^T=\frac{1}{\sqrt{1+\zeta_x^2+\zeta_y^2}}[-\zeta_x,-\zeta_y,1]^T  (20)

  p(ζ)=12πσxσyexp(12(ζx2σx2+ζy2σy2))p(\zeta)=\frac{1}{2\pi\sigma_x\sigma_y}exp(-\frac12(\frac{\zeta_x^2}{\sigma_x^2}+\frac{\zeta_y^2}{\sigma_y^2}))  (21)

  (ai)=exp(ai2)aiπerfc(ai)2aiπ,i{v,l}\bigwedge(a_i)=\frac{exp(-a_i^2)-a_i\sqrt{\pi}erfc(a_i)}{2a_i\sqrt\pi},i\in\{v,l\}  (22)

  ai=(2(σx2cos2ϕi+σy2sin2ϕi)tanθi)1/2a_i=(2(\sigma_x^2cos^2\phi_i+\sigma_y^2sin^2\phi_i)tan\theta_i)^{-1/2}  (23)
在這裏插入圖片描述

  座標系如上圖所示(注意與前面的區分)。對於一個方向向量,我們用(θ,ϕ)(\theta,\phi)來表示,前者爲天頂角,後者爲方位角。ζ=(ζx,ζy)\zeta=(\zeta_x,\zeta_y)表示一個微平面在xx軸、yy軸的斜率,對於給定的微平面斜率ζ\zeta,我們有微平面法線f(ζ)f(\zeta)即式(20),注意與宏觀表面法線區分。式(21)即p(ζ)p(\zeta)就是我們比較熟悉的二維高斯分佈函數,這個函數是關於斜率的高斯分佈函數。函數(ai)\bigwedge(a_i)來源於Smith的shadowing因子。式(19)中的H(lf)H(l\cdot f)是海維賽德函數(Heaviside函數),它的定義如下:

  H(x)={0,x01,x>0H(x)=\begin{cases} 0,x\leq0 \\ 1,x>0 \end{cases}  (24)

   如果我們忽略多重反射並假設微平面都完美的鏡面的話,設hh是向量vv和向量ll之間的半角向量(即vvllhh對稱),ζg\zeta_g是以h爲法線的微平面的斜率(我們以微平面的斜率表示一個微平面),那麼BRDFBRDF函數就是微平面ζh\zeta_h的可見性概率乘上菲涅爾反射因子FF

   d2ζ=sinθldθldϕl4hz3vh=d2ωl4hz3vhd^2\zeta=\frac{sin\theta_ld\theta_ld\phi_l}{4h_z^3v\cdot h}=\frac{d^2\omega_l}{4h_z^3v\cdot h}  
  brdf(v,l)=qvn(ζh,v,l)F(vh)4hz3cosθlvhbrdf(v,l)=\frac{q_{vn}(\zeta_h,v,l)F(v\cdot h)}{4h_z^3cos\theta_lv\cdot h}   (25)

太陽反射光

  對於太陽反射光,我們採用Schlick模型作爲菲涅爾反射因子:

  F(vh)R+(1R)(1vh)5F(v\cdot h)\approx R+(1-R)(1-v\cdot h)^5  (26)

  其中RR是一個常係數,在實現中取R=0.02R=0.02。在整個太陽的立體角Ωsun\Omega_{sun}中我們把BRDFBRDF看作一個常數,避免積分計算。因此反射的太陽光輻射率如下:

  Isun=brdf(v,l)Lsuncosθld2ωlLsunΩsunp(ζh)R+(1R)(1vh)54hz4cosθv(1+(av)+(al))I_{sun}=\iint brdf(v,l)L_{sun}cos\theta_ld^2\omega_l\approx L_{sun}\Omega_{sun}p(\zeta_h)\frac{R+(1-R)(1-v\cdot h)^5}{4h_z^4cos\theta_v(1+\bigwedge(a_v)+\bigwedge(a_l))}  (27)

  其中LsunL_{sun}爲太陽輻射率,其他參數前面都已經提到。整個brdfbrdf的計算我們是在切線空間中進行(以宏觀法線爲zz軸),關於計算太陽反射光輻射率的僞代碼如下所示:
在這裏插入圖片描述

天空反射光

  微平面的BRDFBRDF模型都有相似的表達式,這個表達式表明BRDFBRDF與法線爲半角向量的微平面所佔的比重成比例(假設忽略多重反射),記ρ\rho爲比例係數,我們有:

  brdf(v,l)=p(ζh)ρ(v,l)brdf(v,l)=p(\zeta_h)\rho(v,l)  (28)

  在切線空間計算天空反射光的積分公式則爲(對整個半球方向積分):

  Isky=Ωp(ζh)ρ(v,l)Lsky(l)cosθld2ωlI_{sky}=\iint_\Omega p(\zeta_h)\rho(v,l)L_{sky}(l)cos\theta_ld^2\omega_l  (29)

  Lsky(l)L_{sky}(l)表示從方向ll接收的天空輻射率,做一些轉換:

  d2ωl=4hz3vhd2ζd^2\omega_l=4h_z^3v\cdot hd^2\zeta  
  r(v,ζ)=2(vf(ζ))f(ζ)v=[rx,ry,rz]Tr(v,\zeta)=2(v\cdot f(\zeta))f(\zeta)-v=[r_x,r_y,r_z]^T  (30)
  ρ(v,ζ)=4hz3vf(ζ)rzρ(v,r(v,ζ))\rho^{'}(v,\zeta)=4h_z^3v\cdot f(\zeta)r_z\rho(v,r(v,\zeta))  

  我們將式(29)變換成:

  Isky=+p(ζ)ρ(v,ζ)Lsky(r)H(rz)d2ζI_{sky}=\iint_{-\infty}^{+\infty}p(\zeta)\rho^{'}(v,\zeta)L_{sky}(r)H(r_z)d^2\zeta  (31)

  這裏我們將光線方向ll換成了r(v,ζ)r(v,\zeta),即 視線沿斜率爲ζ\zeta的微平面的反射向量。而H(rz)H(r_z)即公式(24)的海維賽德函數,其中傳入的參數rzr_zr(v,ζ)r(v,\zeta)向量的天頂角coscos值,通過海維賽德函數我們把積分範圍限制在了半球方向內。式(30)和式(31)中的符號前面都已經提到過,不再贅述。

  然後論文指出,如果p(ζ)p(\zeta)影響很小,即BRDF波瓣狹窄,那麼公式(31)可近似擬合成下面兩項平均值之積:

  IskyFLI_{sky}\approx \overline F \cdot \overline L  

  F(v)=+p(ζ)ρ(v,ζ)H(rz)d2ζ\overline F(v)=\iint_{-\infty}^{+\infty}p(\zeta)\rho^{'}(v,\zeta)H(r_z)d^2\zeta  (32)

  L(v)=+p(ζ)Lsky(r)H(rz)d2ζ\overline L(v)=\iint_{-\infty}^{+\infty}p(\zeta)L_{sky}(r)H(r_z)d^2\zeta  (33)

  接下來就是我們要怎麼計算這兩項平均值。

  1)、平均菲涅爾反射

  由Ross的BRDFBRDF模型以及公式(32),有:

  F(v)=+qvn(ζ,v,r)F(vh)H(rz)d2ζ\overline F(v)=\iint_{-\infty}^{+\infty}q_{vn}(\zeta,v,r)F(v\cdot h)H(r_z)d^2\zeta  (34)

  上述公式可看成是有效菲涅爾反射或者平均菲涅爾反射。論文實踐嘗試指出,公式(34)中的qvnq_{vn}可用qvneq_{vn}^e近似,然後採用Schlick模型,我們有:

  qvne(ζ,v)=p(ζ)max(vf,0)(1+(av))fzcosθvd2ζq_{vn}^e(\zeta,v)=\frac{p(\zeta)max(v\cdot f,0)}{(1+\bigwedge(a_v))f_zcos\theta_v}d^2\zeta  
  F(v)R+(1R)+qvne(ζ,v)(1vh)5d2ζ\overline F(v)\approx R+(1-R)\iint_{-\infty}^{+\infty}q_{vn}^e(\zeta,v)(1-v\cdot h)^5d^2\zeta  (35)

  其中RR和前面一樣,我們取R=0.02R=0.02。式(35)中剩餘的積分項取決於σx\sigma_xσy\sigma_y和v。然而當σx\sigma_xσy\sigma_y均小於0.50.5時,該積分項主要取決於θv\theta_v和視線方向上的斜率方差σv\sigma_v

  σv2=σx2cos2ϕv+σy2sin2ϕv\sigma_v^2=\sigma_x^2cos^2\phi_v+\sigma_y^2sin^2\phi_v  (36)

  其中θv\theta_vϕv\phi_v爲前面提到的視線的天頂角、方位角。最後,論文作者在實驗中推出了一個式(35)的近似擬合函數:

  F(v)R+(1R)(1cosθv)2exp(2.69σv)1+22.7σv1.5\overline F(v)\approx R+(1-R)\frac{(1-cos\theta_v)^{2exp(-2.69\sigma_v)}}{1+22.7\sigma_v^{1.5}}  (37)

  2)、平均天空輻射率

  爲了計算平均天空反射輻射率我們丟棄公式(33)中的海維賽德函數H(rz)H(r_z),天空輻射率LskyL_{sky}存儲在一張2D2D紋理中,從而我們可以通過以濾波核函數pp對紋理LskyL_{sky}進行各項異性的紋理採樣來計算平均天空輻射率L\overline L

  記u(v,ζ)=U(R(r(v,ζ)))u(v,\zeta)=U(R(r(v,\zeta)))爲將微平面斜率ζ\zeta映射到紋理座標uu的函數,r(v,ζ)r(v,\zeta)爲視線在微平面ζ\zeta上的反射向量,RR則將反射向量從切線空間轉換到世界空間。爲了儘可能減少拉伸變形,論文作者發現採用極射赤平投影效果最佳,即:

  u=[rx,ry]T/(1+rz)u=[r_x,r_y]^T/(1+r_z)  (38)

  其中(rx,ry,rz)(r_x,r_y,r_z)r(v,ζ)r(v,\zeta)得出的反射向量。而關於如何以濾波核函數pp對紋理LskyL_{sky}進行各項異性的紋理採樣的推導我也看得是一知半解,大致就是如何近似逼近高斯分佈的橢圓區域以此從紋理採樣,實際上我的實現也並未濾波。

  Ltex2D(Lsky,u(v,0),2σxuζx(v,0),2σyuζy(v,0))\overline L\approx tex2D(L_{sky},u(v,0),2\sigma_x\frac{\partial u}{\partial \zeta_x}(v,0),2\sigma_y\frac{\partial u}{\partial \zeta_y}(v,0))  (39)

  這裏tex2Dtex2D可以直接採用GLSL的textureGradtextureGrad函數。

海水折射光

  從太陽和天空接收的光線在水中會發生折射,除去被吸收的光線外,經過多重散射後光線會再次地從水面輻射出來抵達視野。在深水區域中多重散射起主要作用,因爲我們把從水下散射出的輻射率看作漫反射光,基於這個前提假設以及能量守恆定律,我們取海水折射光的菲涅爾因子爲(1F)(1-\overline F)。則海水折射光近似爲以下:

  Isea=Lsea(1F)I_{sea}=L_{sea}(1-\overline F)  (40)

  其中LseaL_{sea}爲海水本身的輻射率,即海水的顏色。式(40)中的(1F)(1-\overline F)意義即除去反射光線外,剩下的光線進入水中發生多重散射。

  綜合①②③三部分,海水光照的僞代碼如下:
在這裏插入圖片描述

  其中,傳入的參數v,l,n,tx,tyv,l,n,t_x,t_y是在世界空間的單位向量,而σx2,σy2\sigma_x^2,\sigma_y^2則是沿着切線方向txt_xtyt_y的斜率方差。

實現結果

  大部分核心算法都是在GPU中實現的。在頂點着色器將屏幕空間的網格投影到世界空間,計算每個頂點的波浪偏移量(從P-M海浪譜採樣),然後再將其投影到屏幕空間。在片元着色器中,計算逐像素的法向量以及太陽反射光、天空反射光和海水折射光。在CPU端預先反演P-M海浪譜,隨機生成一組(hi,ωi,ki)(h_i,\omega_i,k_i)存儲到1D1D紋理中供頂點着色器採樣。

實驗平臺:

  • 操作系統:Windows8.1

  • IDE工具:Qt Creator

  • 語言:C++

  • API接口:OpenGL3.3+, Qt 5.7

參數設置

  奈奎斯特界限:(Nmin,Nmax)=(0.1f,2.5f)(N_{min},N_{max})=(0.1f,2.5f)

  波形疊加數:numWaves=60numWaves=60

  波頻散:waveDispersion=1.25fwaveDispersion=1.25f

  波幅:amplitude=0.96famplitude=0.96f

  單元網格大小:gridSize=2.0fgridSize=2.0f

  波長界限:(lambda_min,lambda_max)=(0.02f,30.0f)(lambda\_min,lambda\_max)=(0.02f,30.0f)

  海面風速:U0=10.0fU0=10.0f

  hdr曝光度:hdrExposure=0.4fhdrExposure=0.4f
在這裏插入圖片描述

實現結果

  1)、海水折射光、太陽反射光、天空反射光、全部光效混合分別如下所示。
在這裏插入圖片描述

  2)、太陽不同位置的效果:
在這裏插入圖片描述

  3)、高空俯瞰:
在這裏插入圖片描述

  4)、網格的精度影響也挺大的:

  從左到右,網格單元大小越來越大,因而精度越來越低,海面細節越來越粗糙。
在這裏插入圖片描述

  5)、其他的一些截圖:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

參考文獻

  1、Eric Bruneton, Fabrice Neyret, and Nicolas Holzschuch, (2010) Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF, In EUROGRAPHICS 2010 Volume 29 (2010), Number 2.

  2、ROSS V., DION D., POTVIN G.: Detailed analytical approach to the gaussian surface bidirectional reflectance distribution function specular component applied to the sea surface.Journal of Optical Society of America A 22 (Nov. 2005), 2442–2453.

  3、HINSINGER D., NEYRET F., CANI M.-P.: Interactive animation of ocean waves. In Symposium on Computer Animation (2002), pp. 161–166.

  4、劉潔, 鄒北驥, 周潔瓊, et al. 基於海浪譜的Gerstner波浪模擬[J]. 計算機工程與科學, 2006, 28(2).

  5、張文橋. 動態海浪建模與仿真的關鍵技術研究[D], 2017.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章