空洞騎士重現 - Shader Graph

空洞騎士
這次來練習怎樣使用 Unity 中的 Shader Graph 來創造出不同的視覺效果,會使用最簡單的 HDR effect 跟特製一個 vanish effect 來做出一個超級斬擊的效果。

Sprites


本次使用的 sprites 跟上次一樣:
上述 sprites 可能會有紅框,可以透過此程式來移除。

Shader Graph


shader graph glow example
Shader Graph 是 Unity 提供讓開發人員能透過 UI 介面來達成基礎的影像處理,過程不用撰寫程式,對於一些簡單影像處理是相當方便的工具,這邊有找到幾個很棒的教學影片可供參考: video1、video2、video3,上圖是一個 glow effect 的 shader graph,實作步驟如下:
  • 創建 Shader Graph - 在 project 內創造一個新的 shader graph,如果特效要與環境光互動就使用 lit,不用就選 unlit。
  • new shader graph
  • 創建 Material - 直接 Create/Material 然後設定使用剛剛創建的 shader。
  • shader graph material
  • 新增參數 - 左上角視窗點擊新增創造一個 Texture2D,名稱一定要取作 MainTex ,這樣當外部 sprite 套用此 shader graph 時就會自動把 sprite 的 texture 讀取到此變數中,另外也可以在左下角設定 default value 把要測試的 sprite 載入。同時再新增一個 Float 參數用來控制 Glow 的程度。
  • shader graph material
  • 新增 Node - Node 是 shader graph 中執行運算的最小單位,每種 Node 都有不同功能,要達到 Glow 效果僅需使用兩種 Node:
    • Sample Texture 2D - 標配,這是把 texture 轉成 RGBA 的形式,方便後續操作。
    • Multiply - 調整像素亮度。
    然後照上圖那樣把 Node 連在一起,透明度在此並沒有使用到,所以直接繼承原圖,不過發現一個有趣的點,slash 的圖檔其實蠻多地方是透明的,或許能讓快速揮砍的殘影顯得更自然點。
  • 套用 material - 替我們的 sprite 修改 material,然後可以從 material property 中控制 shader graph 新增的參數。
  • shader graph slash new material
  • 開啟 bloom - 要看到 glow effect 需要先開啟 camera 的 postprocess 並套用 volume 的 bloom 效果,參數可以自由調整,threshold 設定成 2 是為了避免小騎士的頭發光。
  • shader graph slash volume
  • 檢驗成果 - 可以看到隨著 material 的 glow scale 越大,像素的亮度會越大,然後就會超過 bloom 設定的 threshold 並產生發光的效果,另外這邊採用紅色感覺有點像是亡者之怒護符的效果呢 ~~~
  • shader graph slash glow

Particle System + Shader Graph


除了一般的 sprite,particle system 也可以採用 shader graph,透過修改 render 內的 material:
particle shader graph
此外可以修改 shader graph 的 graph blending mode = additive 來讓粒子間可以疊加達成更高的亮度,效果蠻好看的:
glow additive
效果差異如下:
glow particle

Super Slash


前面學到了基本的應用,接下來就是發揮創意的時間了~~~ 我很喜歡隻狼裡面不死斬的視覺效果,所以打造一個 shader graph 來模擬,目標效果是黑色的斬擊揮出後,由上而下慢慢消失
super slash
關於漸進式消失的 Node 組合可以去看前面提到的教學影片,他們都有很詳細的說明,這邊想要補充的是如何達成 "由上而下" 的消失 - 像素之所以消失是因為透明度歸零,而透明度會歸零是因為沒有超過 step node 設定的閥值,因此只要設定出一個函數在座標上方數值越小、下方數值越大即可:
super slash node
為了產生與座標相關的函數,先使用 UV node 得到 sprite 的像素座標,然後透過 split node 得到 G 軸 (RGB 對應 XYZ) = Y 軸,範圍是 0 ~ 1,由於希望是上面比較小,所以加上一個 subtract node,最後 saturate node 是控制輸出是 0 ~ 1 之間,這樣當 VerticalDisplay 夠大 (ex: 1.5),整張 sprite 都會大於閥值而顯示出來,當 VerticalDisplay 逐漸變小,sprite 上方的數值就會變小而低於筏值並消失。
最後要做的就是讓他在動畫播放的時候 VerticalDisplay 由大慢慢變小就好,這可以透過 animation 的參數來控制,只要用錄製的時候調整 material 上的參數即可,真方便阿 ~~~
super slash vertical display

成品



除了 glow 的斬擊外,可以看到影片中展示了有無使用 shader graph 的粒子效果差異,以及超級斬擊的漸進式消失特效,此外還替他加了一個集氣的動作特效,整體來說我覺得很不錯 !!

總結


Shader graph 是個容易上手並且能與 particle system & animation 結合的好工具,這次特效學完了,該繼續學習一些基本的遊戲機制了,像是血量系統等等。