Shader Graph Block Node 筆記

Block Node

  • 是一種特殊類型的節點,用於 Master Stack 中。每個 Block 代表了 Shader Graph 在最終著色器輸出中使用的單一表面(surface)(或頂點(vertex))描述資料。
  • 內建的 Block 節點 始終可用,
  • 但特定渲染管線的節點僅在該管線中可用。例如,
    • Universal Block 節點 只在 Universal Render Pipeline(URP) 中可用,
    • 而 High Definition Block 節點 只在 High Definition Render Pipeline(HDRP) 中可用。
  • 某些 Block 只有在特定的 Graph Settings 下才會兼容,並且可能會根據你選擇的圖表設置變為啟用或禁用。
  • 你無法對 Block 進行剪切、複製或粘貼操作。
  • 而某些節點只能在 頂點階段(Vertex Stage) 或 片段階段(Fragment Stage) 使用。

Vertex Stage Blocks

在 頂點階段(Vertex Stage),著色器(shader)會對網格 (mesh) 上的每個頂點(vertex)進行處理,並將它們移動到螢幕(screen)上的正確位置。我們可以對頂點進行操作,例如移動它們,或改變光照與它們的互動方式。

Position (Block): Position(位置)區塊 定義了 網格(Mesh)上每個頂點的位置。

  • 如果不進行修改,頂點的位置將與 建模軟體中的原始位置 相同。
  • 我們可以調整這個 Vector3 來改變頂點的位置,使網格實際發生形變,例如海浪效果。
  • 但要注意,我們無法修改單獨的像素(Pixels)或片段(Fragments)的位置,只能操作頂點(Vertices)。

Normal (Block): Normal(法線)區塊 定義了 頂點法線(vertex normal points)的方向(direction)。

  • 這個方向對許多 光照計算 來說非常重要,因此修改它可能會影響 物件與光線的互動方式。
  • 與 Position Block 不同,我們可以在 片段階段(Fragment Stage) 透過其他區塊節點來 逐像素(Per-Pixel)修改法線,而不只是修改頂點的法線。
  • Normal 也是一個 Vector3,用來表示法線的方向。

Tangent (Block) : Tangent(切線)區塊 可以用來 修改切線向量。

  • 切線向量(Tangent vector) 與 頂點法線(Vertex Normal)垂直(perpendicular),在平坦的表面上,它通常會沿著物件的表面方向。
  • 如果你更改了頂點法線(Vertex Normal),建議你也調整切線(Tangent),以確保它仍然與法線保持垂直關係。
  • Tangent 也是一個 Vector3,表示方向。

Fragment Stage Blocks

  • 當 頂點階段(Vertex Stage)完成頂點的變換並確定它們的新位置後,畫面會進行 光柵化(Rasterization),將 3D 資訊轉換成一個片段(Fragment)陣列。
  • 通常,每個片段(Fragment)對應到一個像素(Pixel),但在某些情況下,片段的大小可能會小於像素(例如抗鋸齒技術)。
  • 為了簡化討論,這裡我們將「片段」與「像素」視為相同的概念。
    片段階段(Fragment Stage) 中的區塊(Block Nodes)會對每個像素進行操作,例如決定顏色、透明度、光照等效果。

Base Color (Block)

  • 在某些版本的 Shader Graph 中,這個屬性被稱為 Albedo(反照率)。
    Base Color(基礎顏色) 是物件的純顏色,如果忽略所有光照、透明度與其他效果,物件將會顯示這個顏色。

Normal (Tangent/Object/World) (Block)

  • 在頂點階段(Vertex Stage) 有自己的 Normal(法線)區塊。在這個片段階段(Fragment Stage),我們可以存取這個法線資訊,進一步修改每個像素的法線向量,並將修改後的法線傳回 Unity 的內建光照計算系統。
  • Shader Graph 中有 三種 Normal(法線)區塊,它們的差別在於所使用的座標空間:
    • Tangent Space(切線空間)
    • Object Space(物件空間)
    • World Space(世界空間)
  • 在 Shader 設定中,同一時間只能啟用一種法線空間,你可以在 Graph Settings(圖形設定)中透過 Fragment Normal Space(片段法線空間) 選擇要使用的空間類型。

Emission (Block)

  • 自發光(Emissive)光源 是一種非常適合用來 創建物件周圍的輝光(Bloom)效果 的技術。可以想像像是 霓虹燈、發光火焰 或 魔法咒語 等效果。
  • Emission(發光)區塊 接受 HDR 顏色(高動態範圍顏色),這讓我們能夠將光源的強度 提高到遠超過一般顏色的範圍,產生更亮、更強烈的光效。

Metallic (Block)

  • Metallic(金屬性)區塊 接受一個 浮點數(float) 值。當數值為 0 時,物體的光照效果會像是 完全非金屬(non-metallic),而當數值為 1 時,物體會呈現 完全金屬(totally metallic)。
  • 這個屬性只有在使用 金屬性工作流(Metallic workflow) 時才會生效。你可以在 Graph Settings(圖形設定) 中,使用 Workflow 選項來選擇使用金屬性工作流還是 鏡面反射工作流(Specular workflow),且只有在材質設定為 Lit(有光照) 時,這個選項才會出現。

Specular (Block)

  • 與 Metallic(金屬性) 區塊不同,Specular(鏡面反射) 區塊接收的是 顏色 作為輸入,因為鏡面反射高光(Specular Highlights)可以有不同的顏色。顏色越亮、越接近白色,鏡面反射的高光就越強。

Smoothness (Block)

  • 物體表面越光滑,光照高光的顯示就越明顯。當 Smoothness(光滑度) 為 0 時,物體表面的光照會顯得粗糙且無光澤;而當 Smoothness 為 1 時,物體表面會像 鏡面一樣光滑,反射出明亮的高光。

Ambient Occlusion (Block)

環境遮蔽(Ambient Occlusion,簡稱 AO) 是一種測量像素受到其他場景物體(如牆壁)遮擋,從而減少光源照射的程度。這是一個 浮點數(float) 值,當值為 0 時,該像素應該完全根據照射到它的光源來顯示照明效果;當值為 1 時,光照會被人為減少到最小值。

Alpha (Block)

Alpha 是衡量像素透明度的數值,它的範圍從 0 到 1,其中 0 代表完全透明(totally transparent),而 1 代表完全不透明(fully opaque)。渲染透明物體比渲染不透明物體更消耗計算資源,因此在 Unity 中,我們需要在 Graph Settings 中選擇 Transparent Surface 選項,讓 Unity 正確處理這個著色器。

Alpha Clip Threshold (Block)

Alpha 剪裁(Alpha Clipping),當像素的 alpha 值低於特定閾值時,這些像素會被剔除(culling)。我們可以通過在 Graph Settings 中勾選 Alpha Clip 選項來啟用 Alpha Clip Threshold 區塊。這項技術無論是物體表面設置為透明(Transparent)還是完全不透明(Opaque)都可以使用,因此 Alpha 區塊在不透明材質上也不一定是完全無用的!這在模擬透明效果時非常有用,通常會使用不透明渲染,但會根據一定模式剔除像素,從而創造出透明的假象。


參考

評論