【從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開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)