博客 / 詳情

返回

【URP】Unity[內置Shader]光照着色器Lit

【從UnityURP開始探索遊戲渲染】專欄-直達

Lit Shader的作用與原理

Lit Shader是Unity通用渲染管線(URP)中的核心着色器,專門用於實現基於物理的渲染(PBR)效果。它能以照片級質量渲染真實世界的表面材質,如石頭、木材、玻璃、塑料和金屬,使光照和反射在各種光照條件下(如明亮的陽光或黑暗的洞穴)都能呈現逼真效果。

工作原理

Lit Shader採用物理正確的光照模型,考慮了能量守恆和微表面理論。它通過以下核心參數控制材質表現:

  • 金屬度Metallic‌: 控制材質是金屬(1)還是非金屬(0),金屬材質具有更強烈的鏡面反射
  • 光滑度Smoothness‌: 決定表面粗糙程度,影響高光反射的擴散範圍
  • 法線貼圖Normal Map‌: 增加表面微觀細節的視覺表現
  • 環境光遮蔽Ambient Occlusion‌: 模擬表面縫隙和凹陷處的陰影效果

URP中的Lit Shader通過SubShader和多個Pass實現渲染,每個Pass都有特定用途(如主光源、附加光源、陰影等)。與內置渲染管線不同,URP不需要為每個附加光源創建額外Pass,而是通過優化後的單Pass前向渲染實現高效多光源處理。

發展歷史

Lit Shader隨着Unity渲染管線的發展經歷了幾個關鍵階段:

  • 內置渲染管線時期‌:Unity最初提供標準着色器(Standard Shader),採用類似PBR的工作流程,但性能開銷較大
  • LWRP階段‌:Unity推出輕量級渲染管線(LWRP),包含簡化版的Lit Shader,專注於移動平台優化
  • URP階段‌:LWRP升級為通用渲染管線(URP),Lit Shader成為核心着色器,支持更廣泛平台並優化性能
  • 持續優化‌:Unity不斷改進Lit Shader,增加功能如透明混合模式、雙面渲染等,同時保持高性能

具體使用方法

基本設置步驟

  • 在項目中創建或選擇材質
  • 在材質檢查器窗口中選擇Shader為"Universal Render Pipeline > Lit"
  • 配置材質屬性:

    Surface Options:
      - 表面類型(不透明/透明)
      - 渲染面(正面/雙面)
      - 混合模式(Alpha/Premultiply/Additive/Multiply)
    
    Surface Inputs:
      - 基礎顏色
      - 金屬度
      - 光滑度
      - 法線貼圖
      - 高度圖等

示例:創建金屬材質

  • 新建材質並應用Lit Shader
  • 設置Surface Type為Opaque
  • 調整Base Color為金屬色調(如銀灰色)
  • 將Metallic滑塊調至1(完全金屬)
  • 調整Smoothness控制反射清晰度
  • 添加法線貼圖增加表面細節

Shader Graph中的應用

雖然Lit Shader本身是代碼實現的,但可以在Shader Graph中創建類似效果:

示例:在Shader Graph中創建PBR材質

  • 創建新的Shader Graph,選擇URP模板
  • 添加以下節點:

    • PBR Master‌節點(核心光照模型)
    • Sample Texture 2D‌節點(基礎貼圖)
    • Normal From Texture‌節點(法線貼圖)
    • Slider‌節點(控制金屬度和光滑度)
  • 連接節點:

    • 基礎貼圖連接到Albedo
    • 法線連接到Normal
    • 金屬度和光滑度滑塊連接到相應輸入
  • 導出為Shader並應用到材質

高級示例

透明玻璃效果

  • 在Shader Graph中設置PBR Master的Surface Type為Transparent
  • 設置Blend Mode為Alpha
  • 添加Fresnel Effect節點模擬玻璃邊緣反射
  • 使用Vertex Position節點驅動折射效果
  • 通過Time節點添加動態反射變化

基礎配置

  • 創建材質並選擇Lit Shader

    在材質Inspector中選擇Shader路徑為Universal Render Pipeline > Lit,這是URP下實現物理渲染的基礎着色器。

  • 設置表面類型為透明

    Surface Options中將Surface Type從默認的Opaque改為Transparent,此時會激活Blending Mode選項。

  • 選擇混合模式

    • Alpha模式‌:適用於普通半透明效果,通過Alpha值控制透明度(0完全透明,1不透明),計算公式為OutputRGBA = (SourceRGB × SourceAlpha) + DestinationRGB × (1 − SourceAlpha)
    • Premultiply模式‌:適合保留高光和反射的透明材質(如玻璃),可減少邊緣偽影。

進階調整

  • 深度寫入與雙Pass優化

    若出現透明物體內部穿模問題,可通過雙Pass解決:第一個Pass僅寫入深度(ZWrite On + ColorMask 0),第二個Pass關閉深度寫入並啓用混合(ZWrite Off + Blend SrcAlpha OneMinusSrcAlpha)。

  • 折射效果增強

    使用GrabPass捕獲屏幕紋理,結合模型UV偏移模擬折射。示例代碼片段:

    hlsl
    GrabPass { "_GrabTexture" }
    sampler2D _GrabTexture;
    float4 frag(v2f i) : SV_Target {
        float2 offset = /* 基於法線或高度的偏移計算 */;
        return tex2D(_GrabTexture, i.uvgrab + offset);
    }

    此方法需配合透明材質和混合模式使用。

  • 菲涅爾效應

    在片元着色器中加入視角相關透明度變化,增強邊緣高光:

    hlsl
    float NDotV = saturate(dot(worldNormal, viewDir));
    float fresnel = pow(1 - NDotV, _FresnelPower);
    alpha *= fresnel;

    通過調整_FresnelPower控制效果強度。

性能注意事項

  • 透明渲染會禁用Early-Z優化,建議控制透明物體數量。
  • 複雜效果(如折射)可能需自定義Shader變體,URP Lit的Surface TypeBlending Mode已覆蓋多數基礎需求

金屬材質

  • 工作流模式‌:選擇"Metallic"模式,通過調整Metallic滑塊控制金屬度(1.0為全金屬效果)
  • 光滑度‌:增加Smoothness值(0.8-1.0)可獲得鏡面反射效果
  • 基礎貼圖‌:使用帶有金屬質感的基礎顏色貼圖,建議配合法線貼圖增強細節

頭髮材質

  • 多層結構‌:使用兩個材質球(Front+Transparent)組合,Transparent材質需開啓Alpha混合和雙面渲染
  • 參數配置‌:

    • Front材質:Surface Type=Opaque, Render Face=Front
    • Transparent材質:Alpha=0.3-0.5, Render Face=Both

雪地材質

  • 世界法線混合‌:通過法線貼圖的Y軸值作為蒙版,混合雪地與原材質
  • 參數設置‌:

    • BaseMap:使用雪地紋理
    • Smoothness:0.4-0.6模擬濕雪反光
    • Normal Map:增強表面凹凸細節

岩石/混凝土

  • 工作流模式‌:選擇"Specular"模式更易控制非金屬反射
  • 表面細節‌:

    • 使用高對比度法線貼圖
    • Smoothness=0.1-0.3保持粗糙質感
    • 開啓Height Map實現視差遮擋

動態效果實現

  • 對於火焰/水球等特效,建議通過ShaderGraph擴展Lit Shader:

    • UV擾動‌:使用Voronoi噪點+Time節點驅動UV動畫
    • 進度控制‌:通過腳本動態調整Cutoff參數實現填充效果
  • 關鍵參數組位置:

    • Surface Options:定義材質基礎類型和渲染方式
    • Surface Inputs:配置紋理和物理屬性
    • Advanced Options:控制渲染優化選項

【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.