博客 / 詳情

返回

【URP】Unity[內置Shader]烘焙光照BakedLit

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

BakedLit Shader的作用與原理

BakedLit是Unity URP(Universal Render Pipeline)中的一種着色模型,專門用於處理預烘焙光照的場景對象。它的核心作用是利用預計算的光照信息,避免實時光照計算的開銷,從而提高渲染性能。

工作原理‌:

  • BakedLit Shader完全依賴烘焙的光照貼圖(Lightmap)和光照探針(Light Probe)數據,不進行任何實時光照計算
  • 它通過採樣預烘焙的光照信息來模擬全局光照(Global Illumination)效果
  • 適用於靜態場景對象,要求物體標記為Static並設置光照模式為Baked或Mixed

與標準Lit Shader相比,BakedLit的優勢在於性能開銷極低,特別適合移動平台或需要大量靜態物體的場景。

發展歷史

BakedLit Shader隨着Unity的渲染管線演進:

  • Built-in Render Pipeline時期‌:Unity早期版本已支持光照烘焙,但實現方式較為分散
  • URP引入2018年左右‌:將BakedLit作為標準着色模型之一,統一了跨平台實現
  • URP持續優化‌:隨着URP成熟,BakedLit增加了對HDRP的兼容性,並優化了與光照探針的交互
  • Shader Graph支持‌:後期版本允許通過Shader Graph節點訪問烘焙光照數據

具體使用方法

基本設置步驟

  • 將場景中需要烘焙的物體標記為Static
  • 在Window > Rendering > Lighting中配置烘焙參數
  • 生成光照貼圖(Bake Lightmap)
  • 為材質選擇URP > BakedLit着色器

代碼示例

代碼説明:

  • 這是一個簡化的BakedLit Shader示例
  • 主要依賴URP的Lighting.hlsl庫處理烘焙光照
  • 實際使用時URP內置的BakedLit Shader已包含完整功能
  • BakedLitExample.shader

    Shader "Custom/BakedLitExample"
    {
        Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            Pass
            {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    
                struct Attributes
                {
                    float4 positionOS : POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                struct Varyings
                {
                    float2 uv : TEXCOORD0;
                    float4 positionCS : SV_POSITION;
                };
    
                sampler2D _MainTex;
    
                Varyings vert(Attributes input)
                {
                    Varyings output;
                    output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                    output.uv = input.uv;
                    return output;
                }
    
                half4 frag(Varyings input) : SV_Target
                {
                    half4 col = tex2D(_MainTex, input.uv);
                    return col;
                }
                ENDHLSL
            }
        }
    }
  • BakedGI_Example.shadergraph

    {
        "m_Nodes": [
            {
                "m_Id": "bakedgi_node",
                "m_Type": "UnityEditor.ShaderGraph.BakedGINode",
                "m_Position": { "x": 0, "y": 0 }
            },
            {
                "m_Id": "texture_sample",
                "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode",
                "m_Position": { "x": -200, "y": 100 }
            },
            {
                "m_Id": "multiply",
                "m_Type": "UnityEditor.ShaderGraph.MultiplyNode",
                "m_Position": { "x": 200, "y": 0 }
            },
            {
                "m_Id": "master",
                "m_Type": "UnityEditor.ShaderGraph.UnlitMasterNode",
                "m_Position": { "x": 400, "y": 0 }
            }
        ],
        "m_Edges": [
            {
                "m_OutputSlot": "bakedgi_node_Output",
                "m_InputSlot": "multiply_A",
                "m_OutputNode": "bakedgi_node",
                "m_InputNode": "multiply"
            },
            {
                "m_OutputSlot": "texture_sample_Output",
                "m_InputSlot": "multiply_B",
                "m_OutputNode": "texture_sample",
                "m_InputNode": "multiply"
            },
            {
                "m_OutputSlot": "multiply_Output",
                "m_InputSlot": "master_Color",
                "m_OutputNode": "multiply",
                "m_InputNode": "master"
            }
        ]
    }

Shader Graph中的應用

在Shader Graph中使用BakedLit效果主要有兩種方式:

方法1:直接使用BakedLit Master節點(舊版)

  • 創建Shader Graph時選擇"BakedLit"模板
  • 系統會自動生成基於BakedLit的着色器圖

方法2:使用Baked GI節點(新版)

  • 創建常規的Unlit或Lit Shader Graph
  • 添加"Baked GI"節點獲取烘焙光照數據
  • 將節點輸出連接到主節點的適當輸入端口

Shader Graph示例

代碼説明:

  • 此JSON結構展示了Shader Graph中使用Baked GI節點的基本配置
  • Baked GI節點輸出與紋理採樣結果相乘,最終連接到主節點的Color輸入
  • 實際使用中可通過Unity編輯器可視化構建此關係
  • BakedLitExample.shader

    Shader "Custom/BakedLitExample"
    {
        Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            Pass
            {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
    
                struct Attributes
                {
                    float4 positionOS : POSITION;
                    float2 uv : TEXCOORD0;
                };
    
                struct Varyings
                {
                    float2 uv : TEXCOORD0;
                    float4 positionCS : SV_POSITION;
                };
    
                sampler2D _MainTex;
    
                Varyings vert(Attributes input)
                {
                    Varyings output;
                    output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                    output.uv = input.uv;
                    return output;
                }
    
                half4 frag(Varyings input) : SV_Target
                {
                    half4 col = tex2D(_MainTex, input.uv);
                    return col;
                }
                ENDHLSL
            }
        }
    }
  • BakedGI_Example.shadergraph

    {
        "m_Nodes": [
            {
                "m_Id": "bakedgi_node",
                "m_Type": "UnityEditor.ShaderGraph.BakedGINode",
                "m_Position": { "x": 0, "y": 0 }
            },
            {
                "m_Id": "texture_sample",
                "m_Type": "UnityEditor.ShaderGraph.SampleTexture2DNode",
                "m_Position": { "x": -200, "y": 100 }
            },
            {
                "m_Id": "multiply",
                "m_Type": "UnityEditor.ShaderGraph.MultiplyNode",
                "m_Position": { "x": 200, "y": 0 }
            },
            {
                "m_Id": "master",
                "m_Type": "UnityEditor.ShaderGraph.UnlitMasterNode",
                "m_Position": { "x": 400, "y": 0 }
            }
        ],
        "m_Edges": [
            {
                "m_OutputSlot": "bakedgi_node_Output",
                "m_InputSlot": "multiply_A",
                "m_OutputNode": "bakedgi_node",
                "m_InputNode": "multiply"
            },
            {
                "m_OutputSlot": "texture_sample_Output",
                "m_InputSlot": "multiply_B",
                "m_OutputNode": "texture_sample",
                "m_InputNode": "multiply"
            },
            {
                "m_OutputSlot": "multiply_Output",
                "m_InputSlot": "master_Color",
                "m_OutputNode": "multiply",
                "m_InputNode": "master"
            }
        ]
    }

實際應用場景

  • 靜態場景光照‌:如室內環境的牆壁、地板等靜態物體
  • 移動平台優化‌:對性能敏感的平台,使用BakedLit替代實時光照
  • 光照探針適配‌:動態物體在烘焙光照環境中的光照效果適配

BakedLit Shader是URP管線中實現高性能靜態光照的關鍵工具,合理使用可以顯著提升場景渲染效率,特別是在移動設備或大型場景中


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

發佈 評論

Some HTML is okay.