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