如今愈來愈多的AAA遊戲中都實現了逼真的雪的效果,好比戰神四、地平線:黎明時分、荒野大鏢客:救贖二、古墓麗影:崛起等都實現了不錯的雪地效果。今天咱們就來探究一下他們的實現方式。如今主流的實現方式都是經過硬件提供的細分功能來實現的。算法
這個遊戲裏面沒有地形,只有房頂和城市街道兩種,因此它的作法比較取巧,侷限性比較大。ide
動態生成置換高度圖,主機使用視差映射,PC使用細分技術。post
如何生成高度圖?優化
把會影響雪地效果的物體(有一部分在雪的表面下)使用一個踝關節高的正交相機渲染到一個rt裏面。.net
大致思路就是這樣的,它的優勢就是實現簡單,可是也有一些侷限就是它只適用於房頂以及平坦的城市街道。固然咱們也能夠對它進行相應的改進,以支持地形以及有坡度的物體。3d
古墓麗影崛起的作法較通用,能夠在地形上產生雪跡。在仔細介紹前先統一下術語。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會應用變形信息。
有了這些術語,咱們接下來看看它是怎麼作的。
從上圖能夠看出它主要分爲三個步驟:
觀察發現雪跡的形狀能夠用一個二次曲線近似,經過把一些 動態物體近似成一些點,變形高度能夠經過如下公式計算:
這些變形點累積到deformation heightmap中,deformation shader爲每個點分配一個組,每一個組會寫入32x32的一個區域內,而且使用一個原子取最小操做,之因此須要這個是由於多個點的影響的區域 可能會重合。
爲了計算elevation,foot height也是須要的,主要是用來判斷是否能生成雪跡,由於elevation部分是高於雪未經變形的高度的。
爲了計算elevation,咱們須要知道elevation distance,它是elevation 開始的地方到當前渲染點的距離。以下圖所示:
爲了計算elevation distance,咱們引入瞭如下幾個變量:
Elevation的值應該跟雪跡的深度成正比,雪跡越深,那麼elevation應該越高。計算公式以下所示:
爲了給雪地一個更隨機真實的效果,三張紋理貼圖應用到了變形的不一樣部分,以下所示:
到這裏,基本的雪的變形效果的實現已經講完了,一些優化細節咱們這裏就不仔細講解了,感受興趣的同步能夠參考GPU Pro7上的文章。如今咱們來講下它的優缺點,優勢是實現也比較簡單,支持任意坡度的網格,雪跡的形跡有隆起的部分,以及模擬暴風雪填平雪跡的效果。缺點是它把一個物體當成了一些點的集合,這樣就不容易作一我的死後躺在地上相似的效果,固然也不是不能作就是把一個成當成多個點來解決,可是整體效果會差一些。下面咱們來看另一個解決方案。
它的步驟以下所示:
從下往上拍攝
根據offset來生成灰度圖
固然這裏有一些細節須要處理,咱們這裏略過不談,感興趣的能夠看參考文章中的Create snow trails in ue4來了解細節。固然這個只是個demo實現,並不能應用到實際使用中,須要作不少的改動和優化,主要是借鑑下思路。最終效果以下所示:
如今咱們來講下它的優缺點,優勢是實現較簡單,適用於全部狀況(適用於任意形狀的物體),缺點是這個只是個demo,若是要真正使用中仍是有不少細節(坑)要去踩。固然也能夠在這個算法上作些改進優化以達到更通用的支持,好比在地形以外的任何物體產生雪跡。
上面列舉了幾個生成雪跡的方案,能夠看到都用到了變形以及細分來作,若是硬件機能有限也能夠把細分用視差映射來替代,經過分析它們的優缺點,讀者能夠根據本身的遊戲類型來選擇對應的方案。固然咱們也能夠在原來的基礎上擴展以及修改達到更好的支持,甚至超越市面上的AAA遊戲。若是有其它的方案,也歡迎你們在留言中討論。