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

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管线中实现高性能静态光照的关键工具,合理使用可以显著提升场景渲染效率,特别是在移动设备或大型场景中

内容概要:本文围绕基于三电平ANPC构网型逆变器的虚拟同步控制策略展开研究,提出了一种融合DPWMA调制、正负序分离锁相与电网电压前馈的复合控制策略,并通过Simulink仿真实现系统建模与多工况验证。研究表明,ANPC三电平拓扑具备开关损耗均衡、中点电位稳定和输出谐波低等优势,结合DPWMA调制可显著提升稳态电能质量;正负序分离锁相技术有效应对电网不平衡工况,确保并网电流对称性与功率稳定性;电网电压前馈控制则增强系统动态响应能力,抑制电压骤变或负载切换引起的冲击。整体策略在稳态精度、电网适应性和动态抗扰方面表现优异,适用于新能源并网与工业大功率变流场景。; 适合人群:具备电力电子、自动控制或电气工程相关背景,从事新能源发电、微电网、逆变器控制等方向的科研人员及研究生。; 使用场景及目标:①用于高比例新能源接入下的并网逆变器控制策略设计;②解决电网不平衡、电压扰动等复杂工况下的并网稳定性问题;③优化逆变器动态响应性能与电能质量,提升系统可靠性。; 阅读建议:建议结合文中提供的Simulink仿真模型与控制框图,逐步复现各模块功能,重点关注DPWMA调制实现、正负序分解算法与前馈-反馈协同控制逻辑,同时可通过修改电网参数测试系统鲁棒性,深化对控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淡海水

感谢支持 共同进步 好运++

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值