創作類《塞爾達傳說:曠野之息》風格的水著色器

遊資網發表於2019-10-24
《塞爾達傳說:曠野之息》是任天堂遊戲公司出版發行的開放世界動作冒險遊戲。發售以來獲得業界極高評價,2017年獲金搖桿獎年度最佳遊戲獎,TGA 2017年度最佳遊戲。

來自德國柏林22歲的Florian Gelzenleuchter也是這款遊戲的忠實粉絲,他正在獨立製作一個專案《The Bells' Arietta》,這個專案將使用Unity實現《塞爾達傳說:曠野之息》的畫面表現效果。

專案介紹

有沒有覺得《The Bells' Arietta》中畫面效果和《塞爾達傳說:曠野之息》相差無幾呢?

本文,我們將重點介紹《The Bells' Arietta》中,製作水著色器的工作流程。

在收集參考素材時,我會仔細觀察現實中的效果,以及效果在遊戲內的實現結果。這不僅有助於給予啟發,而且也提供了實用的資訊,告訴我可以實現什麼東西,以及什麼地方可能出現問題。

如果有人問我:在《塞爾達傳說:曠野之息》中,什麼東西會在神廟內提供獨特的感覺?

我會把答案總結為三個重要部分:冰冷而美觀的大理石、穿過空氣的光束、以及清澈透明的水。認真思考後,我開始製作水著色器。

創作類《塞爾達傳說:曠野之息》風格的水著色器

專案機制

由於遊戲角色林克無法潛入水底,所以《塞爾達傳說:曠野之息》的水會讓玩家的攝像機一直保持在水面上。

在水體內渲染水效果時,通常需要複雜的著色器設定和額外的水下效果。而且,把攝像機限制在水面可以簡化攝像機的移動。

我設定了相同的限制,這樣便可以專注於從水面上觀察水的外觀,也讓我可以使用著色器技巧,例如:為水下的霧效果使用深度緩衝區。

實現焦散效果

在光線被彎曲表面折射,然後投射到水底時,便會出現焦散效果中令人著迷的圖案。常見的焦散效果例子是一杯水或游泳池表面被陽光照射時的畫面。

下圖是大海中的焦散效果。

創作類《塞爾達傳說:曠野之息》風格的水著色器

首先,我們要解決的問題是焦散效果的動畫。類似其它能量類效果,焦散效果有非常自然的外觀。對於噪聲部分,常用的方法是在Photoshop中使用簡單的混合設定來製作原型。

在本示例中,我們可以注意到下圖左側的基本紋理。我為紋理的每個通道加入了少量偏移,用於計算光線折射。然後建立圖層副本,把圖案放大,然後把混合模式改為Darken變暗。

創作類《塞爾達傳說:曠野之息》風格的水著色器

移動圖層副本時,便會出現混合後的特別效果。在最後的圖案中,通過附加方式把紋理混合到沙灘紋理上。在最終著色器中,兩個圖層會獨立移動。

創作類《塞爾達傳說:曠野之息》風格的水著色器

現在,我可以把結果從光線方向投射到物件上。通過使用NdotL和物件的陰影貼圖加入額外遮罩,現在焦散效果幾乎完成了。

創作類《塞爾達傳說:曠野之息》風格的水著色器

後續步驟取決於物件本身,通常情況下會有一個高度值,該值會在物件所在水面的高度上劃分效果。如果資源是小型模組化資源,該值會在多數情況下起到作用。

但是,如果連線的地形有不同高度,我們則無法定義通用的Cutoff值。使用深度緩衝區是一種解決方法,但在渲染透明物件前,我們無法獲取該物件的深度。由於我們必須計算每個物件的焦散效果和著色器,因此整個效果的效能不是很好。

專案中,我使用的解決方法利用了遊戲引擎中透明物件的特點。這類物件不會渲染到深度緩衝區或G緩衝區,因此我可以訪問所有水下物件的法線和深度資訊。

深度資訊用於計算世界位置,這種方法通常用於後期處理效果。通過使用這種方法,所有工作都可以在一個著色器內完成,焦散效果會自動影響寫入深度緩衝區的所有內容。

創作類《塞爾達傳說:曠野之息》風格的水著色器

紋理製作

水著色器由多個部分組成。它利用了一個經典方法:讓兩個法線貼圖以不同速度和大小互相重疊滾動,這樣就可以輕鬆調整表面的外觀。

這個方法也適用於焦散紋理和另一個噪聲紋理,用來實現水泡等更多細節。由於使用平面對映,在水流到達特定角度時,水的流速也會變快,因此我可以把該著色器放到任何位置,使水的流動效果接近現實。

水著色器的功能如下:

  • 帶有法線貼圖的表面細節。
  • 在角度較大的位置,流速會變快。
  • 焦散效果會從陽光方向投射到表面下的所有內容。
  • 基於深度的折射效果,因此在淺水區的折射效果較小。
  • 水面上的水泡和陰影。
  • 水下的霧、模糊和色差效果。
  • 通過頂點顏色定義位移效果區。

使用Unity的挑戰

在實現逼真的水著色器時,平衡美感和互動性是關鍵。無論現實與否,水都應該看起來富有活力,這就是為什麼即使是《塞爾達傳說:風之杖》的單色海洋也會使人感到逼真的原因。

使用頂點替換和滾動兩個法線貼圖的方法是一個很好的起點,我們還會加入一些折射效果,使用基本的水著色器做進一步優化。

創作類《塞爾達傳說:曠野之息》風格的水著色器

另一個重要部分是互動性,例如:游泳時角色會產生波浪,碰撞時會濺起水花,岸邊的沙子碰到水浪時會變溼。

將水加入遊戲世界時,我們要讓它和所有內容融合起來,而不是類似互相獨立的物體。當然,這也很大程度上取決於遊戲的特定需求。

創作類《塞爾達傳說:曠野之息》風格的水著色器

如果想要知道自己的水著色器效果如何,我們可以詢問別人是否想在這片虛擬的畫素流體中游泳。如果對方回答是的話,這將是很積極的評價。

關於處理著色器的建議

在處理著色器時,必須清楚自己想要實現的效果,並根據遊戲機制來進行開發。著色器是很好的工具,可以把遊戲過程和遊戲世界融合起來。對於著色器初學者,建議建立自己的工具庫,從而製作出色的效果。

我總會嘗試實現想法中的新功能,即使可能不會在任何專案中使用這些功能。但如果現在花時間研究看似不實用的東西,它可能在未來會成為其它專案的重要部分。

雖然我們經常會使用新方法,但也別忘了經典的方法或更簡單的方法。在遊戲開發中,很多東西會發生變化,結合使用基本方法實現複雜的效果是一件很有趣的事。

如果你總是追尋最新方法,卻忽視了過去的方法,這樣可能會浪費潛在的優秀工具。我們應該充分利用新方法和舊方法的潛力,為我們的工作提供便利。

創作類《塞爾達傳說:曠野之息》風格的水著色器

小結

對於著色器程式設計而言,水效果是很好的實現目標。目前有很多出色的效果案例,而且新的創意和藝術風格仍在不斷給人驚喜,精美的水效果從不會過時,所以趕緊實踐去完成精美的水效果吧。

下載Unity Connect APP,請點選此處。 觀看更多Unity官方精彩視訊,請關注“Unity官方”B站賬戶。

你可以訪問Unity答疑專區留下你的問題,Unity社群和官方團隊幫你解答:

Connect.unity.com/g/discussion


來源:Unity官方平臺
原文:https://mp.weixin.qq.com/s/7bvBBldIH3J7YrhRRsevPA

相關文章