Shader Graph Node 筆記


Add Node : 將輸入 A 與 B 相加後輸出。可用在

  • 顏色混合:兩個顏色相加會讓結果更亮,例如 紅色(1,0,0) + 綠色(0,1,0) = 黃色(1,1,0)。
  • 偏移效果:可以為 UV 座標 添加一個數值,實現紋理偏移或滾動效果。
  • 漸變控制:用於疊加額外的數值,如增加光照強度或提高某些參數的基礎值。

Multiply Node : 將輸入 A 與 B 相乘後輸出。可用在

  • 顏色調整:用 Multiply 乘以一個顏色值可以調整其亮度,例如 (1,1,1) * 0.5 讓顏色變暗。
  • 遮罩(Mask):如果將一個紋理乘以一個黑白影像(如漸層遮罩),黑色部分(0)會被隱藏,白色部分(1)保持不變。
  • 縮放(Scaling):可以用 Multiply 來控制值的縮放,例如控制波動強度、光照強度等。

Split Node: 會將輸入向量 In 拆分為四個 Float 輸出 R、G、B 和 A。

這些輸出對應於輸入 In 向量的各個通道:

  • R (紅色通道)
  • G (綠色通道)
  • B (藍色通道)
  • A (Alpha 透明度通道)
  • 如果輸入向量 In 的維度小於 4(即不是 Vector4),則缺少的輸出通道將預設為 0。

生成的程式碼

1
2
3
4
float _Split_R = In[0];
float _Split_G = In[1];
float _Split_B = 0;
float _Split_A = 0;

參考: https://docs.unity3d.com/Packages/com.unity.shadergraph@17.0/manual/Split-Node.html


Transform Node: 用來將輸入從一個座標空間轉換到另一個座標空間。可以用來處理位置 (Position)、方向 (Direction) 或法線 (Normal) 等資料的變換。

  • 位置 (Position) 會受 平移、旋轉、縮放 影響。
  • 方向 (Direction) 只受 旋轉縮放 影響,不會受 平移 影響。

當轉換的不是 Position(位置)時,Unity 建議使用 World 選項,而不要使用 Absolute World,否則可能會產生非預期行為。
例如,當轉換方向(Direction)或法線(Normal)時,Camera Relative(相機相對世界) 可能會影響計算結果,因此 World 會更適合。

參考: https://docs.unity3d.com/Packages/com.unity.shadergraph@17.0/manual/Transform-Node.html


對於計算機圖形學中的應用中,噪聲應該是偽隨機的,也就是說兩次調用應得到同樣的結果。

Gradient Noise (梯度噪聲): 梯度噪聲產生的紋理具有連續性,因此常用於模擬自然現象(如雲層、山脈、火焰等)。

  • Perlin 噪聲(Perlin noise,又稱為柏林噪聲)是梯度噪聲的一種。由Ken Perlin開發的自然噪聲生成算法,具有在函數上的連續性,可在多次調用時給出一致的數值。該噪聲可以用來模擬人體的隨機運動,螞蟻行進的線路等。另外,還可以通過計算分形和模擬雲朵,火焰等非常複雜的紋理。

Gradient Noise Node :梯度噪聲節點,根據輸入 UV 生成梯度噪聲(Gradient Noise)或 Perlin 噪聲(Perlin Noise)。

  • 可調整 Scale 來控制噪聲的大小與細節。

輸入

  • UV : 為 Vector2 , UV 位置作為噪聲的「種子」,可透過偏移、縮放來改變噪聲分佈
    • UV + 偏移(Offset) → 平移噪聲圖案
    • UV * 縮放(Scale) → 改變噪聲細節
    • UV 變形(Distortion) → 產生扭曲效果
  • Scale : 為 Float , 可改變噪聲的細節程度
    • 較大值 → 細節更密集,較小值 → 細節較稀疏
      輸出
  • Output : 為 Float , 輸出範圍為 0.0 到 1.0

Simple Noise Node : 根據輸入的 UV 可以產生 簡單 (Simple) 或是 Value 雜訊。

參考:


UV Node : UV 節點 用來獲取頂點或片段的 UV 坐標。Unity 允許你在網格的數據中處理多個紋理座標集,因此可以透過 Channel 下拉選單來選擇從四組 UV 坐標中擷取資料。大多數網格通常只會使用 UV0,但你也可以利用其他通道來隱藏更多數據。
需要注意的是,Shader Graph 有一個限制,就是它只能存取 UV0 到 UV3,而 UV4 到 UV7 則只能在著色器程式碼中訪問。這意味著如果需要更多的 UV 通道,Shader Graph 本身無法直接處理,但你仍然可以在手寫的著色器代碼中處理更高的 UV 通道。


Position Node: 根據此節點所在的 Shader 階段 (Shader Stage)來決定,此節點是存取 網格頂點 (Vertex) 或片段 (Fragment) 的位置 (Position) 。
可以使用 Space (空間) 下拉選單來選擇輸出值的座標空間。

Ports

名稱 描述 類型 綁定 描述
Out 輸出 Vector3 網格頂點 (Vertex) 或片段 (Fragment) 的位置 (Position)

Controls

名稱 類型 選項 描述
Space 下拉選單 Object, View, World, Tangent, Absolute World 為這個 Position 節點的輸出選一個座標空間(coordinate space)

World 與 Absolute World
Position 節點 提供 World (世界) 和 Absolute World (絕對世界) 兩種座標空間選項:

  • Absolute World (絕對世界座標): 在所有 Scriptable Render Pipeline (SRP) 中,始終返回物件在場景中的絕對世界位置。
  • World (世界座標): 返回所選 SRP 預設的世界座標。

不同渲染管線的 World 預設行為:

  • High Definition Render Pipeline (HDRP) 預設使用 Camera Relative (相機相對) 世界座標。
  • Universal Render Pipeline (URP) 預設使用 Absolute World (絕對世界座標)。

舊版本

  • Shader Graph 6.7.0 或更早版本,如果 Position 節點 使用 World 空間,則會自動升級為 Absolute World,以確保計算結果不變。
  • HDRP 中,如果之前使用 World 空間 手動計算 Camera Relative 世界座標,現在可以直接選擇 World,系統會自動使用相機相對的世界座標。

參考: https://docs.unity3d.com/Packages/com.unity.shadergraph@7.1/manual/Position-Node.html


Tiling And Offset Node(平鋪與偏移節點): Tiling And Offset Node 用於調整紋理(Texture)或 UV 坐標的平鋪(Tiling)和偏移(Offset),允許你在 Shader Graph 中動態改變紋理的大小與位置。

  • Tiling 輸入是 Vector 2,它控制紋理在物件上複製的次數(即平鋪的數量)。 UV * Tilling
  • Offset 輸入是 Vector 2,它用來在任何方向上移動(滾動)紋理。 UV + Offset
  • UVs 輸入是原始的 UV 座標,平鋪和偏移會應用到這些座標上。

UV 乘以一個數值就是縮放 (Tiling)
UV 加減一個值,就是移動 (Offset)

產生的程式碼

1
2
3
4
void Unity_TilingAndOffset_float(float2 UV, float2 Tiling, float2 Offset, out float2 Out)
{
Out = UV * Tiling + Offset;
}

Absolute Node : 將 輸入 取絕對值後 輸出。


Power Node : Power Node 就是次方的意思,當輸入 A 、 B, 輸出為 A的B次方, A^B

1
2
3
4
void Unity_Power_float4(float4 A, float4 B, out float4 Out)
{
Out = pow(A, B);
}

Sample Texture 2D :

  • 有三個輸入:
    • Texture:要取樣的紋理(Texture 2D)。
    • UV coordinate:紋理的取樣座標,這決定了紋理中哪個位置的顏色將被取樣。
    • Sampler State:決定如何取樣紋理的採樣器狀態。
  • 這個節點還有兩個額外選項:
    • Type:這個選項決定節點的取樣行為:
      • 當選擇 Default 時,該節點會取樣紋理的顏色(顏色值)。
      • 當選擇 Normal 時,該節點會取樣法線圖(Normal Map),這樣可以獲得法線的資訊來用於光照計算等效果。
    • Space:這個選項只有在 Normal 模式下有效,決定輸出的法線信息應該處於哪個空間:
      • Object:???。
      • Tabgent:???。

在 SpriteRenderer 有時候會有 Material does not have a _MainTex texture property. It is required for SpriteRenderer 的警告,這表示 你的 Shader 沒有 _MainTex 屬性。可以這麼理解:在 Shader Graph 中,如果你設定了一個 Texture2D 屬性,並將它的 Reference 設為 _MainTex,那麼,當這個 Shader 被應用到 Sprite Renderer 的 Material 上時,Sprite Renderer 會自動把它的 Sprite 貼圖傳遞給 _MainTex。這樣 Shader 就能正確使用 Sprite 的貼圖,而不需要手動指定 Texture。


Time Node (時間節點) : 用來提供 時間資訊

  • Time: 返回自場景(scene)開始以來的時間(以秒為單位)。這個值隨著場景運行而增加。
  • Sine Time: sin(Time),產生 -1 到 1 之間的循環值,這個輸出經常用於創建周期性或擺動的效果。
  • Cosine Time: cos(Time),效果類似於 Sine Time,但它的波形會有不同的相位(即開始的點不同),通常用於不同的波動模式。
  • Delta Time: 返回自上一幀以來經過的時間(以秒為單位)。這個值用於幀率無關的動畫或運動計算,確保無論運行速度如何,行為都保持一致。
  • Smooth Delta: 類似於 Delta Time,但它會對多幀的時間差進行平滑處理,通過平均多個幀的時間差來減少突變,使過渡更加平滑。

當希望物件可以持續的動,或者 Shader 需要依賴時間來運作時,就可以使用 Time 節點,可以嘗試使用 Time 節點 來做 動畫漸變(Gradient)顏色(Color)紋理(Texture),以創造獨特的 Shader 效果。

下圖是一個簡單的使用方式,如果你想要產生 0 到 1 之間循環的數值,可以這樣做。

參考:


評論