紅色警戒3的水面特效是怎麼做出來的?

08年的遊戲dx9時期的產物做出了可能許多dx11都做不出的東西


給你看看我在05、06年間給Halo 3做的水面渲染,也是dx9。

可以交互,可以近距離看,有幾何起伏,有折射反射。從圖上看,由於視角有限,紅警的水並不需要幾何起伏,所以也不需要很密的三角形。應該只要用normal map就可以了。交互和波浪,都可以視為對normal map的操作。折射本身只是個post processing,偏個角度採樣就行了。還有,紅警的水都在一個平面上,反射只要用常見的平面反射方法,攝像機翻轉一下生成reflection map就可以了。


從技術的角度而言,是用shader語言,通過一些複雜的數學公式算出來的,這有一套通用的和非通用的技術,如果開源,源碼也是可查的,引擎工程師主要做的是實現這套演算法,並且把參數甩出來,遊戲開發工程師要做的主要就是調參數,如果閉源。。。那我也沒辦法那是商業機密,具體的演算法和代碼一句兩句就說不清了

主要分為

1,浪花的計算和顯示

2,水下場景折射後圖像的計算和顯示

3,建築物,船等等和水面進行碰撞導致的水霧和水波(這個主要用粒子效果實現)

這些東西在很早的ogre引擎里都開源了,從模擬的角度而言不比紅警3採用的RNA引擎差多少

更多的是運算效率和細節上的差距了

效果如圖所示

但是我覺得你問的應該不完全是這個,而是為什麼dx9能夠實現很多遊戲dx11都達不到的漂亮效果,這就是個美學問題了,比如說浪多大,水紋多大,水的透明度多高,水啥顏色,陸地海灘和水底的建模讓玩家覺得真實和漂亮

仔細觀察會發現,紅警3的浪花比較大,泡沫很多,顏色也很鮮艷個人覺得乍一看有點不像真實的海,倒有點像一汪硫酸銅。。。

水質特別清澈,光影絢爛(對比上面ogre的效果,紅警簡直是流光溢彩。。。美日蘇打仗真會挑好日子),一個個場景不像是戰場,更像是海濱度假村。。。而且有一點卡通渲染的感覺

個人認為開發人員不僅做了水面的模擬,還做了一些濾鏡效果,使得畫面顯得很風格化,這才是導致你感嘆dx9的畫面比dx11要好的主要原因


說個體外話,當時覺得不是很完善,雖說很美。但只要調低水面質量,幀數馬上就能提高一半左右…


我認為跟你用 dx9, dx11 或是 opengl 沒關係,重要的是演算法。

下面這個鏈接提供了很多關於水面渲染的技術

Water Simulation

我也提過類似的問題,並且得到了很多有用的意見和建議,你可以參考

《神秘海域4》的水面、海面是如何實現的? - 計算機圖形學 - 知乎


1.水深度:用深度相機獲取背景像素深度(剔除水體本身),然後計算水在投影空間的深度,水深度=水面深-背景深。定義淺水區水顏色和深水區顏色,根據水深來對兩種顏色做插值得水自身顏色。

2.反射:根據主相機位置和水面計算反射矩陣,然後創建鏡像相機,傳人相機矩陣(要用上反射矩陣)和投影矩陣,剔除水面和水底層後,做渲染紋理傳入shader後用於水面顏色。不要求實時用CubeMap也可以。

3.折射:主相機位置創建折射相機,只渲染水下層,渲染紋理傳染shader作為水底色。

4.水流動:可以用Gerstner、FFT、三角波、FlowMap等方法來計算水面起伏。如果是模擬海洋還要加入波粒子、海浪大波,用雅可比絕對值計算泡沫。

5.菲涅耳效應:用schlick近似模擬不同視角的差異,也可以把F0拿出來給美術同學調節。

6.開爾文船波:模擬水體交互的方法,可以從上面水流預留交互參數來控制,更簡單方法是直接在法線圖上畫幾十個逐漸擴大的水圈來模擬。

7.水底:主要考慮水底霧、水紋刻蝕(可以參考GPU Gems)。


個人感覺不僅是水面,你認為所達到的效果和水底的映襯也有關。


推薦閱讀:

如何評價AS仙閣教練寒夜?
玩DOTA和LOL的人機選手,是什麼支持你們玩2000盤的?
如何看待正版遊戲和盜版遊戲的問題?
如何看待6.28日的鬥魚一姐之爭?
AR Gun 這類玩具的可玩性在哪裡?都有哪些類似的產品?

TAG:遊戲 | 計算機技術 | 渲染 | 命令與征服:紅色警戒3 |