【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

    c 复制代码
    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

    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

    c 复制代码
    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

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

相关推荐
SmalBox1 天前
【URP】Unity[内置Shader]非光照Unlit
unity3d·游戏开发·图形学
avi91112 天前
Lua高级语法-第二篇
lua·游戏开发·编程语言·语法糖
SmalBox2 天前
【URP】Unity[内置Shader]简单光照SimpleLit
unity3d·游戏开发·图形学
龙智DevSecOps解决方案4 天前
Perforce《2025游戏技术现状报告》Part 1:游戏引擎技术的广泛影响以及生成式AI的成熟之路
人工智能·unity·游戏引擎·游戏开发·perforce
SmalBox11 天前
【URP】Unity[RendererFeatures]渲染对象RenderObjects
unity3d·游戏开发·图形学
UWA16 天前
Gears 实测室:第六期・《黑色沙漠》手游如何精准决策性能优化
性能优化·游戏开发·uwa·游戏测试
用户2946555091917 天前
在unity中,如何把敌人和玩家之间的碰撞检测的性能优化一下
游戏开发
陈尕六18 天前
从零开始的 Godot 之旅 — EP10:有限状态机(二)
godot·游戏开发
祭璃妖19 天前
关于2D人物冒险游戏闪现逻辑的实现方法
游戏开发