Unity Shader Graph – Dissolve Height

前言

上一篇我們做了 Dissolve Distance的練習,光是Distance的運用就可以製作相當多種變化,這次的練習是之前一直想要練習的 Height 溶解方式,這個溶解方式如果將溶解的UV改為其他形狀就有更多種有趣的變化,一樣我下面會給大家Shader Graph連結大家可以先下載來玩玩看一邊練習。

點我下載 Shader Graph

  1. 因為我們不需要重新做Node,用上一篇的Shader graph來修改即可。首先我們來找個比較有空間的位置來處理一下Emission位置的問題,新增一個Position Node 並將Space mode改為Object,接著新增一個Add A通道接收position資訊,並新增一個Vector 1 當作offset的控制Node連結到Add Node的B通道。 建立一個Split Node 分裂出來 取G通道當作Y軸像輸出給Divide 的A通道,接著新建一個Vector 1 控制Dissolve的高度最後連結到PBR Master的 Emission 通道。
可以看到Emission的資訊已經被劃分出來了

這時候我們來測試一下 Height 功能是否正常,這邊用一個Slider Node串到Divide的B通道,直接調整就看到 Height 的數值變動了,這邊用Min 0 Max 4 就可以看得到比較大的變化。

2. 接著我們將我們的Height mask做得更精準一點,手先建立一個Vector 1 控制Dissolve的量並串到 One minus 的in ,而One Minus的out則串接給Remap的in 通道,這邊Remap Node的In Min Max 設定X :0 Y:1 ,接著Remap的Out Min Max需要控制Height的 Vector 1 屬性,但是因為Remap的Out Min Max 是Vector 2 的輸入源,所以這邊我們需要新增一個Vector 2 的Node來接收Height資訊並串到Vector 2 的Y 通道並設定X 為0 ,最後串到Out Min Max 。

上面所串好的Node串好後我們將原本串到Divide B通道的height,更改為加了控制量的Remap out通道,然後我們原本的Power node需要再一個Gradient,我們這邊新增一個Vector 1 屬性當作Mask Gradient 串到 Power的B通道。

最後我們需要一個Clamp Node,新增好後將power的out 串到Clamp的In通道,並設定Mix 0 Max 1 。

3. 然後我們來準備將整個Dissolve Height的串接好,首先我們回到Dissolve Mask 新增一個Multiply Node,先將noise的輸出到Multiply的A通道。

最重要的Multiply建立好了接著我們就可以開始做最後的串接

· Height Mask的Clamp 輸出串到Dissolve mask的B通道

· Dissolve Mask的Multiply 輸出串到Emission Border Mask 的in通道

· Dissolve Mask的Multiply 輸出串到PBR Master的 Alpha Clip Threshold當作最後輸出

· Emission Border Mask 的Multiply Out輸出 串到PBR Emission當作最後輸出

串好後我們Save Asset回到Scene看一下會發現我們的Dissolve整個消失了,因為我們的Shader的屬性數值需要修改一下。

首先我們先將Dissolve Amout的Mode改為Slider方便我們調整。

接著我們可以玩一下所有的數值,如果大家覺得我條的數值ok的話也可以直接用我下的數值。

調整好以後我們直接調整Dissolve Amount就可以看到漂亮的溶解效果從上而下的完美溶解。

只要再增加Animation 並調整我們所要的效果就可以簡單的做出動畫了

最後效果

小結

這次的練習可以讓以前只能用Time Node的Dissolve有另一個作法,而且之前的 Dissolve 是蠻沒有規則性的溶解,透過這次的練習可以讓溶解的效果依照我們的需要做調整,像我上面的溶解方式調整了不同的Noise輸入產生了不同的效果,只能說Shader Graph的應用非常的有彈性,如果有更多想法的話也可以做出更有趣的設計。

參考資料: https://www.youtube.com/watch?v=suXg_5K5BLQ&list=PLX3w–II9wfWba0Ctn3NqI-guyKExbPpR

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *