Shader Graph學習(二)

這篇文章我們將通過一個簡單的案例來深入的學習一下Shader Graph的一些Node以及對應的功能。

首先安利一個視頻:https://www.bilibili.com/video/BV1Db411e7Ag

本文也是按照視頻中的案例進行簡單的描述。

 

首先先來看下我們做好的Shader Graph的內容:

實現的效果如圖所示,通過shader使一個物體上下襬動,同時貼圖流動的效果。

 

Node介紹

動手之前,我們先來了解幾個Node,其實只要知道了所有Node的功能,再複雜的ShaderGraph都能夠讀得懂了。

Time Node:

提供對shader中各種時間參數的訪問,一共有五種輸出

  

Time 當前的時間值
Sine Time 當前時間的sin值
Cosine Time 當前時間的cos值
Delta Time 當前幀時間,前一幀到後一幀的時間
Smooth Delta  平滑後的當前幀時間

 

UV Node:

可以獲取到mesh的頂點或者片段的UV座標,可以在Channel中選擇你所需要的uv類型進行輸出

   

有關UV0-UV3,可以看上右圖,unity一共支持四套uv,在Shader中分別叫UV0,UV1,UV2,UV3,UV0用於主紋理, UV1用於光照貼圖, UV2用於實時動態光照, UV3可進行自定義。

 

Position Node:

可以獲取到mesh的頂點或者片段的位置信息,可以在Space中選擇輸出的空間座標系。

  

Object 模型空間
View 觀察空間
World 世界空間
Tangent 切線空間
Absolute World 絕對的世界空間

注:在不同的SRP中,世界空間可能是不同的,例如在HDRP中默認的世界空間是取決於攝像機關係的,因此我們可以使用Absolute World來獲取絕對的世界空間位置。

 

Tiling And Offset Node:

可以用於對輸入的uv進行平鋪和偏移的操作,通常可以和Time Node結合製作滾動紋理的效果(也就是我們例子中的效果)

 

剩下一些比較簡單的Node就不過多介紹了,例如加法運算的Add Node,乘法運算的Multiply Node,求正弦值的Sine Node,拆分多維向量的Split Node,以及對應的Combine Node用於將一維向量合併,等等。以及一些暫時還沒介紹到的重要節點,大家可以先查閱官方文檔:https://docs.unity3d.com/Packages/[email protected]/manual/Node-Library.html

 

介紹完這些節點,最開始的ShaderGraph就很好理解了,下面就簡單的描述一下。

流動效果

我們先來看下流動貼圖的實現原理

首先我們需要一個Sample Texture 2D Node來進行貼圖採樣,然後創建一個Texture 2D Asset Node來用於貼圖的選擇,將其輸出關聯到我們的Sample Texture 2D Node的Texture 輸入上即可。此時若將Sample Texture 2D Node的RGBA輸出關聯到我們Master的Albedo的輸入上,mesh就會顯示我們所選擇的貼圖了。

 

那麼如何讓其流動起來呢,這時候我們就要從UV來入手。所謂的流動其實就是貼圖一直在做偏移操作,那麼我們可以利用Tiling And Offset Node來給uv座標施加偏移效果,如何使偏移量一直隨着時間而增長呢,Time Node的Time輸出正好符合這一要求,因爲Time是一個遞增的值,我們將其賦值到Offset上,就可以實現隨着時間一直偏移的流動效果了。

至於改變貼圖的顏色,我們只需要利用Color Node 和 Multiply Node即可,利用Multiply Node將Color Node輸出的顏色與Sample Texture 2D Node輸出的顏色值相乘即可。

拓展:

1.如果想要來回流動的效果,可以使用Sine Time。

2.若要改變流動速度,我們可以添加一個Vector 1 Node,然後利用Multiply Node將其和Time相乘,然後將輸出的值賦值到Offset上。

 

擺動效果

接着我們來看看相對比較複雜的擺動效果的實現原理(由於自己莫得模型,用的Cube,頂點只有兩頭有,因此無法像視頻中的“龍”那樣擺動)

同樣的,我們要了解怎樣才能實現上下襬動的效果,既然是上下襬動,那麼肯定是頂點的Y軸位置偏移。結合前面的流動效果,利用Sine Time來實現上下襬動。

首先利用Position Node,Space選擇Object來獲取頂點的位置,由於輸出是Vector3的值,而我們只想改變Y的值,所以需要利用Split Node來進行拆分,然後我們將Y的值與Sine Time相加,再利用Combine節點合併原本的XZ和新的Y值,最後將新的位置信息關聯到Master的Vertex Position上,如圖:

不過現在我們的物體是整體的進行上下移動,因爲我們現在所有頂點的偏移量都是相同的,並沒有達到像“龍”那樣的擺動效果。由於我們的“龍”是隨着Z軸擺動的,也就是隨着頂點Z的不同,Y的偏移量也不同,而Z軸相同的頂點,Y的偏移量相同。根據這個特徵,我們可以將頂點位置Z的值進行Sine計算作爲Y的偏移量。這樣我們的“龍”就可以扭曲了,但是還並不會動,因此我們需要將Z的值和Time值相加再進行Sine計算,來作爲Y 的偏移量。這樣我們的龍就真正的擺動起來了。

最後講解下三個可配置參數的理解:

Frequency:擺動的頻率,這個值與Z軸相乘,縮放Z的值,相同時間下會改變Sine後峯值的個數,也就改變了“龍”的扭曲程度。

Speed:擺動速度,這個值與Time相乘,例如增加這個值,會使相同時間間隔下,偏移量變化的更大,使其擺動的更快。

Distance:擺動的距離,這個值很好理解了,與偏移量相乘,直接改變Y軸的偏移效果。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章