3D遊戲場景DEMO 新增水體效果

2021-05-28 01:25:17 字數 1062 閱讀 5745

好久沒寫了,5月初就把地形弄差不多了,後來幾天把天空穹改了下,弄了多重紋理雲彩飄動。

之後一直在做水體的實現,發現水體太煩了。原以為比較簡單沒地形複雜,結果一查閱資料,天吶~~比地形複雜多了。和地形也有相似的地方lod之類的,也許是本來對圖形方面的不了解。看了海水生成的方式——2d水波方法、正弦波疊加、fft(快速博立葉變換)、柏林雜訊、還有《遊戲程式設計精髓6》上的「gpu互動式流體」。腦殼那個大呀,一開始太茫然了。=.=

考慮了實際情況,決定先嘗試了「正弦波疊加法」產生水的波浪效果,用vs和ps試了下,雖然是可行,但是感覺重複性太大了。當採用單方向的波傳播方式時,多個波相疊加後產生的波浪效果就是重複的,與水平面角度不大時 看上去還好,如果是俯視水平面看著就不真實了。

而採用以圓的方式擴散傳播時,只有在距離波源不是很遠時才能達到比較真實的效果,遠了以後波長不知道怎麼的會變短,就會發生很尖銳的效果。同時考慮到場景中多個水體並非乙個波源,而且在河流和海水(4周環繞的)中時波源和不同單獨水體塊的銜接感覺不好處理,還擔心計算頂點偏移會耗時間。(我機子太差)

所以最後就沒採用動態網格,只通過動態紋理來產生了水波效果。嘿嘿^_^

使用了「gpu互動式流體」中在水波靜態時產生水波效果的方法,通過法線貼圖對水體紋理進行水波干擾。採用乙個波浪型別的法線紋理,在vs中計算出uv座標,在ps中取得法向量(y為0)。將法向量xz平面的值作為折射圖和反射圖的uv座標的偏移量,如此這般,水體紋理顏色值就有些波浪的扭曲效果了。(我想遊戲中部分的**特效空間扭曲效果,應該和這類似吧?)

水體的折射圖則採用rtt(渲染到紋理),當前攝像機位置所看到的地形渲染到折射圖紋理中。(雖然剔除了部分但仍很耗時,還需要優化)

水體反射圖也是rtt,把水平面作為裁剪平面setclipplane,渲染時要遮蔽掉地形在水以下的部分,計算出水平的反射矩陣d3dxmatrixreflect,將地形映象翻轉後設定背面剔除為順時針剔除進行渲染。這時,相當於我門從地下從水下往上看能看到的東西就是水反射的東西,需要注意的是裁剪水平面的正方向設定b=-1向下,這個setclipplane函式起的效果是,保留平面正半區內容,剔除掉平面負半區的內容。(仔細想一下不難想^_^)。同時反射渲染時先渲染地形再是天空,也需要優化減少渲染地形的大小,很耗時。

3D遊戲場景DEMO 新增水體效果

好久沒寫了,5月初就把地形弄差不多了,後來幾天把天空穹改了下,弄了多重紋理雲彩飄動。之後一直在做水體的實現,發現水體太煩了。原以為比較簡單沒地形複雜,結果一查閱資料,天吶 比地形複雜多了。和地形也有相似的地方lod之類的,也許是本來對圖形方面的不了解。看了海水生成的方式 2d水波方法 正弦波疊加 f...

自己動手寫遊戲引擎二 D3D遊戲場景

這一節課,我們要做乙個 d3d的開發環境出來,基於 vc 6.0 directx9 我們需要的標頭檔案和庫檔案 d3d9.h 與d3d9.lib 首先,開發之前,我們要了解兩個東西 具體意義,參考 sdk幫助檔案 idirect3d9 pidirect3d9 d3d 介面物件 idirect3dde...

AR學習2 遊戲場景基礎介紹及製作3d模型 桌子

一.基礎介紹 1.首先建立開發資料夾 2.建立乙個資源管理資料夾 場景為scenes檔案下的場景。一.尺寸 模型的尺寸 cube就是立方體 長寬高都是1公尺的參照物 二.方向 分為兩個方向 世界的方向 座標軸 紅右 綠上 藍前面 類似 現實生活中東西南北上下 世界的方向永遠不變 物體的方向 以自己為...