基于頂點紋理的無限大海水仿真
最近手上有了一塊7800的顯卡,因此就想利用這塊強大的顯卡做點東西出來?;陧旤c紋理的無限大面積海水的算法在腦子想了很久了,但一直苦于沒有支持頂點紋理的顯卡而無法實現(xiàn)。
拿到顯卡以后,就開始三下五除二的寫程序。下面是最終的效果圖。
效果圖1
效果圖2
效果圖3
主要的方法是,使用一個與視相關的自適應網(wǎng)格(1),使用tessendorf的基于2DFFT的海水仿真算法(2)生成動態(tài)的海水高度場,并將高度場存入到頂點紋理當中,然后在頂點著色器中通過取頂點紋理的值對自適應網(wǎng)格進行擾動,形成動態(tài)的海水效果。
這個思路雖然簡單,但是在目前的顯卡中,不支持浮點紋理的雙線性濾波,只支持最近點采樣的方式,如果使用最近點采樣的方式你會發(fā)現(xiàn)整個波動效果會有很明顯的塊狀效果(非常討厭),因此,必須通過shader自己來寫一個雙線性濾波的函數(shù),另外在我這個算法中還要求根據(jù)高度場計算出法線場,由于取頂點紋理是一個非常耗時的操作,如果把這些計算都放在頂點著色器里面進行的話,頂點著色器會成為整個繪制過程的一個大瓶頸。
最終我采用的是多次繪制的方法。首先在一個PS里面進行高度場的濾波,并且計算對應的法線,并且把這個結果渲染到一張浮點紋理中(在PS中做這些操作要比在VS中做這些操作要快很多),然后再利用這張經(jīng)過濾波處理和法線預計算的浮點紋理作為頂點著色器中的高度場和法線紋理進行高度擾動,以及取法線。
另外。在光照處理方面,海水著色方面參考了(3)。
于是就有了以上的渲染效果圖。
最后,我還是要打擊一下自己,下面這張是用3dmax加dreamscape插件渲染的海水效果圖??磥硇Ч罹噙€是有的。當然我可以用1/65秒渲染一幀,而它卻需要65秒來渲染一幀。
3dsmax海水效果圖
(1)http://www-evasion.imag.fr/Publications/2002/HNC02/wavesSCA.pdf
這是法國人寫的論文,這個網(wǎng)格構造的思路確實巧妙,值得去研究下。
(2)Simulating Ocean Water, Jerry Tessendorf
這個經(jīng)典的海水仿真算法我就不解釋了,不過這里面最近更新了一個交互海水的算法,也是很值得研究。
(3)http://graphics.cs.lth.se/theses/projects/projgrid/
一個英國人的碩士論文,用到了投影網(wǎng)格概念,不過他的水面效果是使用perlin noise生成#p#page_title#e#
波長為空間周期的n分之一
前提條件和一維時候的情況基本相同:
b:使用多個Gestner-Wave的疊加來合成出整個波動效果。
(15)
(16)
在后面的章節(jié)里,將要介紹使用海洋統(tǒng)計學頻譜結合上述使用傅立葉變換描述的海水波動計算公式來進行海水模擬