AAA遊戲中雪的實現

如今愈來愈多的AAA遊戲中都實現了逼真的雪的效果,好比戰神四、地平線:黎明時分、荒野大鏢客:救贖二、古墓麗影:崛起等都實現了不錯的雪地效果。今天咱們就來探究一下他們的實現方式。如今主流的實現方式都是經過硬件提供的細分功能來實現的。算法

Batman: Arkham Origins

這個遊戲裏面沒有地形,只有房頂和城市街道兩種,因此它的作法比較取巧,侷限性比較大。ide

動態生成置換高度圖,主機使用視差映射,PC使用細分技術。post

如何生成高度圖?優化

把會影響雪地效果的物體(有一部分在雪的表面下)使用一個踝關節高的正交相機渲染到一個rt裏面。.net

  1. 把rt清除成黑色。
  2. 渲染物體爲白色。
  3. 過濾並把渲染結果累積到另一張紋理裏面。

大致思路就是這樣的,它的優勢就是實現簡單,可是也有一些侷限就是它只適用於房頂以及平坦的城市街道。固然咱們也能夠對它進行相應的改進,以支持地形以及有坡度的物體。3d

Rise of the Tomb Raider

古墓麗影崛起的作法較通用,能夠在地形上產生雪跡。在仔細介紹前先統一下術語。orm

Snow height:在未應用變形以前的雪的高度(vertex.z)htm

Deformation points:勞拉的腳以及其它產生變形的3D座標。blog

Foot height:一個變形點的垂直高度(point.z)遊戲

Trail depression:雪跡被踩下去的比本來雪低的那部分。

Trail elevation:因爲被踩下去致使雪隆起的那一部分。

Deformation heightmap:一張32位的紋理,1024x1024個像素,存儲變形信息。

Depression depth:abs(snow height – foot height)

Deformation shader:用於生成變形高度圖的compute shader。

Fill shader:用於模擬暴風雪後雪跡被慢慢填充的過程。

Snow shder:用於渲染雪的shader,這個shader會應用變形信息。

有了這些術語,咱們接下來看看它是怎麼作的。

從上圖能夠看出它主要分爲三個步驟:

  1. Deformation shader根據dynmaic_object的defomation point來計算影響的像素信息。
  2. Fill shader用於修改上面計算好的高度信息,模擬暴風雪將雪跡填平的過程。
  3. Snow shader用來應用變形高度圖配合細分來實現雪跡效果。

生成高度圖

觀察發現雪跡的形狀能夠用一個二次曲線近似,經過把一些 動態物體近似成一些點,變形高度能夠經過如下公式計算:

這些變形點累積到deformation heightmap中,deformation shader爲每個點分配一個組,每一個組會寫入32x32的一個區域內,而且使用一個原子取最小操做,之因此須要這個是由於多個點的影響的區域 可能會重合。

生成隆起(elevation)部分

爲了計算elevation,foot height也是須要的,主要是用來判斷是否能生成雪跡,由於elevation部分是高於雪未經變形的高度的。

爲了計算elevation,咱們須要知道elevation distance,它是elevation 開始的地方到當前渲染點的距離。以下圖所示:

爲了計算elevation distance,咱們引入瞭如下幾個變量:

  • Depression distance:變形的中心到depression結束的距離
  • Distance from root:變形的點心到當前渲染點的距離,注意它是depression distance和elevation distnce的和。

Elevation的值應該跟雪跡的深度成正比,雪跡越深,那麼elevation應該越高。計算公式以下所示:

紋理選擇

爲了給雪地一個更隨機真實的效果,三張紋理貼圖應用到了變形的不一樣部分,以下所示:

到這裏,基本的雪的變形效果的實現已經講完了,一些優化細節咱們這裏就不仔細講解了,感受興趣的同步能夠參考GPU Pro7上的文章。如今咱們來講下它的優缺點,優勢是實現也比較簡單,支持任意坡度的網格,雪跡的形跡有隆起的部分,以及模擬暴風雪填平雪跡的效果。缺點是它把一個物體當成了一些點的集合,這樣就不容易作一我的死後躺在地上相似的效果,固然也不是不能作就是把一個成當成多個點來解決,可是整體效果會差一些。下面咱們來看另一個解決方案。

Creating Snow Trails in Unreal Engine 4

它的步驟以下所示:

  1. 使用一個Scene Capture從下向上拍攝一張地形的深度圖。
  2. 在上一個拍攝的基礎上使用Custom Depth拍攝影響雪跡深度。
  3. 根據這兩個深度的差值來決定哪些地方會產生雪的軌跡。
  4. 把上面的結果放到別個一個rt上用來作累積。
  5. 應用累積後的效果到雪的材質產生雪跡的效果。

從下往上拍攝

根據offset來生成灰度圖

固然這裏有一些細節須要處理,咱們這裏略過不談,感興趣的能夠看參考文章中的Create snow trails in ue4來了解細節。固然這個只是個demo實現,並不能應用到實際使用中,須要作不少的改動和優化,主要是借鑑下思路。最終效果以下所示:

如今咱們來講下它的優缺點,優勢是實現較簡單,適用於全部狀況(適用於任意形狀的物體),缺點是這個只是個demo,若是要真正使用中仍是有不少細節(坑)要去踩。固然也能夠在這個算法上作些改進優化以達到更通用的支持,好比在地形以外的任何物體產生雪跡。

總結

上面列舉了幾個生成雪跡的方案,能夠看到都用到了變形以及細分來作,若是硬件機能有限也能夠把細分用視差映射來替代,經過分析它們的優缺點,讀者能夠根據本身的遊戲類型來選擇對應的方案。固然咱們也能夠在原來的基礎上擴展以及修改達到更好的支持,甚至超越市面上的AAA遊戲。若是有其它的方案,也歡迎你們在留言中討論。

參考文章

  1. https://www.slideshare.net/colinbb/gdc2014-deformable-snow-rendering-in-batman-arkham-origins
  2. http://tombraider.tumblr.com/post/131825841425/dev-blog-snow-tech-and-houdini-simulations-mike
  3. GPU Pro 7 Deferred Snow Deformation in Rise Of The Tomb Raider
  4. https://www.raywenderlich.com/5760-creating-snow-trails-in-unreal-engine-4
  5. https://www.resetera.com/threads/gamingbolt-graphics-analysis-god-of-war-arguably-the-best-looking-game-of-all-time.35748/page-32
相關文章
相關標籤/搜索