【从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
cShader "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
c{ "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
cShader "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
c{ "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开始探索游戏渲染】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)