GPU Gems1 - 1 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)
該讀書(shū)筆記大多內(nèi)容參照了大神淺墨的該篇文章https://zhuanlan.zhihu.com/p/35974789
本章介紹了一種在GPU中模擬和渲染大的水體的系統(tǒng)。它把基本網(wǎng)格的集合波動(dòng)于動(dòng)態(tài)發(fā)現(xiàn)貼圖的生成結(jié)合起來(lái)。
1.1 目標(biāo)和范圍
這章里,我們將由計(jì)算簡(jiǎn)單正弦函數(shù)之和開(kāi)始,逐步擴(kuò)展到更復(fù)雜的函數(shù)如Gerstner波,也擴(kuò)展到像素著色器。主要思路是使用周期波的加和,來(lái)創(chuàng)建動(dòng)態(tài)的平鋪(tiling)凹凸貼圖,從而獲得優(yōu)質(zhì)的水面細(xì)節(jié)。
1.2 正弦近似值的加和
1.2.1 波的選擇
我們需要運(yùn)行兩個(gè)表面模擬:一個(gè)是表面網(wǎng)格的幾何波動(dòng),另一個(gè)是網(wǎng)格上法線圖的擾動(dòng)。兩個(gè)模擬本質(zhì)上是相同的。水面高度由簡(jiǎn)單的周期波疊加表示,正弦函數(shù)疊加后得到了一個(gè)連續(xù)函數(shù),這個(gè)函數(shù)描述了水面上所有點(diǎn)的高度和方向。在處理頂點(diǎn)時(shí),我們基于每個(gè)頂點(diǎn)的水平位置對(duì)函數(shù)取樣,使得網(wǎng)格細(xì)分成連續(xù)水面。在幾何分辨率下,通過(guò)對(duì)近似正弦疊加的法線取樣,別通過(guò)shader渲染到render target texture,就得到了表面的法線貼圖。
水紋理的波紋好壞決定著模擬的逼真度,對(duì)紋理波紋我們有不同的幾何選擇標(biāo)準(zhǔn):
- 波長(zhǎng)Wavelength (L):世界空間中波峰到波峰之間的距離。波長(zhǎng)L與角頻率ω的關(guān)系為
ω=2π/L。 - 振幅Amplitude (A):從水平面到波峰的高度。
- 速度Speed (S):每秒種波峰移動(dòng)的距離。為了方便,把速度表示成相位常數(shù) φ=S x
2π/L。 - 方向Direction (D):垂直于波峰沿波前進(jìn)方向的水平矢量。
1.2.2 法線與切線
因?yàn)槲覀兊谋砻嬗卸x明確的函數(shù),所以可以直接計(jì)算任意給定點(diǎn)處的曲面方向,而不是依賴于有限差分技術(shù)。
副法線(Binormal)B和正切矢量T分別是x和y方向上的偏導(dǎo)數(shù)。
對(duì)于2D水平面中的任意點(diǎn)(x,y),表面上的三維位置P為:
?
求副法線(Binormal)B方向,即對(duì)上式對(duì)x方向求偏導(dǎo)。而求正切矢量T方向,即對(duì)上式對(duì)y方向求偏導(dǎo)。
而法線N由副法線B和切線T的叉積給出:
1.3 波的幾何特征
首先文中將幾何波限制為4個(gè),因?yàn)樘砑痈嗟牟ú⒉荒茉黾有碌母拍?#xff0c;只不過(guò)增加更多相同的頂點(diǎn)Shader處理指令和常數(shù)而已。
1.3.1 方向波或圓形波的選擇
需要對(duì)下圖所示的方向波或圓形波進(jìn)行選擇。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 方向波和圓形波
?
對(duì)于兩種類型的波,視覺(jué)特性和復(fù)雜性都是由干涉條紋引起的。
方向波需要的頂點(diǎn)shader處理指令較少,但是究竟選擇何種波需要取決于模擬的場(chǎng)景。對(duì)于大的水體,方向波往往更好,因?yàn)樗鼈兪秋L(fēng)吹動(dòng)產(chǎn)生的波較好的模型。對(duì)于較小的池塘的水,產(chǎn)生波的原因不是由于風(fēng),而是諸如例如瀑布,水中的魚(yú),圓形波則更好一些。對(duì)于方向波,波的方向是在風(fēng)向的一定范圍內(nèi)任意繪制的;對(duì)于圓形波,波中心是在某些限定的范圍內(nèi)任意繪制的。
1.3.2 Gerstner波
正弦波看起來(lái)圓滑,用于渲染平靜的,田園詩(shī)般的池塘很合適。而對(duì)于粗獷的海洋,需要形成較尖的浪頭和較寬的浪槽,則可以選擇Gerstner波。
Gerstner波早在計(jì)算機(jī)圖形學(xué)出現(xiàn)之前就已經(jīng)被研發(fā)了出來(lái),用于物理學(xué)基礎(chǔ)上為海水建模。Gerstner波可以提供一些表面的微妙運(yùn)動(dòng),雖然不是很明顯但是卻很可信(具體可見(jiàn)[Tessendorf 2001])。
另外,Gerstner波有一種經(jīng)常被忽略的性質(zhì):它將頂點(diǎn)朝著每個(gè)浪頭頂部移動(dòng),從而形成更尖銳的波峰。因?yàn)椴ǚ迨俏覀兯砻嫔献钿J利的(即最高頻率,最主要)特征,所以我們正希望頂點(diǎn)可以集中在此處。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖 Gerstner波
?
1.3.3 波長(zhǎng)等參數(shù)的選擇
?
波長(zhǎng)等參數(shù)的選擇方法:
- 波長(zhǎng)的選擇,要點(diǎn)是不要追求波在真實(shí)世界中的分布,而是要使用現(xiàn)在的少數(shù)幾個(gè)波達(dá)到最大效果。對(duì)波長(zhǎng)相似的波進(jìn)行疊加可以突顯水面的活力。于是文中選擇中等的波長(zhǎng),然后從它的1/2至兩倍之間產(chǎn)生任意波長(zhǎng)。
- 波的速度,通過(guò)波長(zhǎng),基于公式即可計(jì)算得出。
- 振幅方面,主要是在Shader中指定一個(gè)系數(shù),由美術(shù)同學(xué)對(duì)波長(zhǎng)指定對(duì)應(yīng)的合適振幅。
- 波的方向,運(yùn)動(dòng)方向與其他參數(shù)完全獨(dú)立,因此可以自由選擇。
?
1.4 波的紋理特征
加和到紋理中的波也像上文說(shuō)到的頂點(diǎn)一樣需要參數(shù)化,但是其具有不同的約束條件。首先,在紋理中得到寬頻譜更為重要。其次,在紋理中更容易形成不像天然波紋的圖案。第三,對(duì)給定波長(zhǎng)只有某些波方向能保證全部紋理的平鋪(tiling)。也就是說(shuō),不像在世界空間中僅僅需要注意距離,在紋素(texel)中要注意所有的量。
文中的思路是在2到4個(gè)通道中,使用15個(gè)頻率和方位不同的波進(jìn)行處理。雖然4個(gè)通道聽(tīng)起來(lái)有點(diǎn)多,但是它們是進(jìn)行256 x 256分辨率的渲染目標(biāo)紋理的處理,而不是處理主幀的幀緩沖。實(shí)際上,生成法線貼圖的填充率所造成的影響小到可以忽略不計(jì)。
?
1.5 關(guān)于深度
首先,把在頂點(diǎn)上的水深度作為一個(gè)輸入?yún)?shù),這樣,在著色器碰到岸邊這樣的微妙區(qū)域時(shí),便可以自動(dòng)進(jìn)行校正。
因?yàn)樗母叨刃枰?jì)算,所以頂點(diǎn)位置的z分量就沒(méi)什么用了。雖然我們可以利用這點(diǎn)來(lái)壓縮頂點(diǎn)的數(shù)據(jù)量,但是選擇把水深度編碼在z分量中,是一個(gè)更好的選擇。
更確切地說(shuō),就是把水體底部的高度放在頂點(diǎn)的z分量中,作為常數(shù)帶入水的高度表中,這樣通過(guò)相減,即可得到水深度。而同樣,這里假定了一個(gè)恒定高度的水位表(constant-height
water table)。
我們也使用水深度來(lái)控制水的不透明度、反射強(qiáng)度和幾何波振幅。簡(jiǎn)單來(lái)說(shuō),即水淺的地方顏色淺,水深的地方顏色深。有了適當(dāng)?shù)乃疃?#xff0c;也就可以去光的傳播效果進(jìn)行更完善的建模。
?
【核心要點(diǎn)總結(jié)】
文中提出的水體渲染方法,總結(jié)起來(lái)有三個(gè)要點(diǎn):
1)使用周期波(正弦波、Gerstner波)的加和
2)創(chuàng)建動(dòng)態(tài)的平鋪(tiling)貼圖
3)使用凹凸環(huán)境映射(Bump-Environment Mapping)
?
總結(jié)
以上是生活随笔為你收集整理的GPU Gems1 - 1 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决ORA-30036:无法按8扩展段(
- 下一篇: GPU Gems1 - 2 水刻蚀的渲染