news 2026/5/1 8:14:46

【光照】Unity[光照烘焙]的原理与具体流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【光照】Unity[光照烘焙]的原理与具体流程

URP光照烘焙介绍

Unity通用渲染管线(URP)的光照烘焙系统是用于预计算全局光照(GI)的核心技术,它将静态光源的光照效果预先计算并存储在光照贴图(Lightmap)中,运行时直接采样使用以提高性能。URP支持三种光源模式:

‌Realtime实时模式‌:

完全动态计算,不生成光照贴图,适用于高频移动光源或需要实时互动的场景。

‌Baked烘焙模式‌:

完全离线烘焙到光照贴图中,运行时无实时计算,适合静态环境光。

‌Mixed混合模式‌:

结合烘焙与实时计算的优势,包括三种子模式:

Baked Indirect:烘焙间接光照,直接光和阴影实时计算

Subtractive:烘焙直接光和阴影,动态物体通过Light Probe接收光照

Shadowmask:烘焙间接光+阴影贴图,实时计算直接光

历史发展

URP的光照烘焙技术源自Unity传统的Enlighten和Progressive光照系统,经过多次迭代:

早期版本主要依赖Enlighten光照系统

2018年后引入Progressive光照烘焙器(CPU/GPU)

URP 7.x版本开始支持StructuredBuffer优化光源处理

最新版本支持Shadowmask混合模式,平衡效果与性能

内部实现原理与数学公式

光照烘焙核心算法

光照烘焙主要基于辐射度算法(Radiosity)和光子映射(Photon Mapping),核心数学公式包括:

‌辐射传输方程‌:

$L_o(x,ω_o) = L_e(x,ω_o) + ∫_Ω f_r(x,ω_i,ω_o)L_i(x,ω_i)(n·ω_i)dω_i$

其中:

$L_o$:出射辐射度

$L_e$:自发光辐射度

$f_r$:双向反射分布函数(BRDF)

$L_i$:入射辐射度

$(n·ω_i)$:余弦项

‌光照贴图采样‌:

float3 SampleLightMap(float2 lightMapUV) {

#if defined(LIGHTMAP_ON)

return SampleSingleLightmap(TEXTURE2D_ARGS(unity_Lightmap, samplerunity_Lightmap),

lightMapUV, float4(1.0, 1.0, 0.0, 0.0),

#if defined(UNITY_LIGHTMAP_FULL_HDR)

false,

#elsetrue,

#endif

float4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0, 0.0));

#elsereturn 0.0;

#endif

}

动态物体光照处理

动态物体通过Light Probe接收烘焙光照,采样使用球谐函数(SH):

float3 SampleLightProbe(Surface surfaceWS) {

#if defined(LIGHTMAP_ON)

return 0.0;

#elseif(unity_ProbeVolumeParams.x) {

return SampleProbeVolumeSH4(TEXTURE3D_ARGS(unity_ProbeVolumeSH, samplerunity_ProbeVolumeSH),

surfaceWS.position, surfaceWS.normal, unity_ProbeVolumeWorldToObject,

unity_ProbeVolumeParams.y, unity_ProbeVolumeParams.z,

unity_ProbeVolumeMin.xyz, unity_ProbeVolumeSizeInv.xyz);

} else {

float4 coefficients[7];

coefficients[0] = unity_SHAr;

coefficients[1] = unity_SHAg;

coefficients[2] = unity_SHAb;

coefficients[3] = unity_SHBr;

coefficients[4] = unity_SHBg;

coefficients[5] = unity_SHBb;

coefficients[6] = unity_SHC;

return max(0.0, SampleSH9(coefficients, surfaceWS.normal));

}

#endif

}

具体流程与手动计算示例

光照烘焙流程

‌场景准备‌:

标记静态物体(勾选Static)

生成光照贴图UV(Generate Lightmap UVs)

设置光源模式(Baked/Mixed)

‌烘焙参数设置‌:

间接光反弹次数(Max Bounces,通常设为5)

光照贴图分辨率

启用环境光遮蔽(AO)

‌执行烘焙‌:

CPU或GPU渐进式烘焙

降噪处理

生成光照贴图和光照探针

手动计算示例

假设一个简单场景,计算某点P的烘焙光照:

‌直接光照计算‌:

$L_direct = I * max(0, n·l) / (d² + 1)$

其中:

I:光源强度

n:表面法线

l:光源方向

d:距离光源的距离

‌间接光照计算‌:

$L_{indirect} = Σ (L_{bounce} * albedo / π)$

其中:

$L_{bounce}$:来自其他表面的反射光

albedo:表面反射率

‌最终光照‌:

$L_{final} = L_{direct} + L_{indirect} + L_{emission}$

常见问题与优化

‌黑斑问题‌:因模型没有光照贴图坐标或UV重叠导致,需勾选Generate Lightmap UVs并调整Pack Margin。

‌硬边问题‌:因UV在光照图中比例太小,需调大Scale In Lightmap参数。

‌性能优化‌:

使用Shadowmask模式平衡效果与性能

控制附加光源数量(PC平台最多8个)

合理设置阴影距离(Shadow Distance)

URP的光照烘焙系统通过结合预计算和实时计算,在保持良好视觉效果的同时显著提升了渲染性能,特别适合移动端和中低端硬件平台

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 13:58:28

21、邮件配置中的重写规则与特殊 m4 配置详解

邮件配置中的重写规则与特殊 m4 配置详解 1. 重写规则理解 重写规则在邮件处理中起着核心作用,它主要用于匹配输入地址并根据特定模式进行重写。下面通过几个测试来详细说明其工作原理。 1.1 模板键值测试 模板使用 @ 加上 $2 的值作为键。例如,当键为 @imaginary.c…

作者头像 李华
网站建设 2026/4/24 16:24:10

多线程相关面试题-线程安全相关问题-锁相关问题

问题 1:什么是进程?什么是线程?二者的核心区别是什么? 问题 2:Java 中创建线程的三种方式是什么?分别举例说明。问题 3:start () 方法和 run () 方法的区别是什么?问题 4&#xff1a…

作者头像 李华
网站建设 2026/4/26 21:22:11

在亚马逊云上解决RDS、MariaDB 与 Aurora MySQL复制延迟实战指南

在高吞吐量的数据库系统中,复制延迟(Replica Lag)一直是个棘手的难题。在 MySQL 生态圈内,传统的异步复制架构由于其单线程应用事务的性能瓶颈,严重限制了从库(Replica)的处理能力 (1)。特别是在…

作者头像 李华
网站建设 2026/4/22 7:46:50

Java八股文合集来了,彻底解决一线大厂面试难题

纵观今年的技术招聘市场, Java 依旧是当仁不让的霸主 !即便遭受 Go 等新兴语言不断冲击,依旧岿然不动。究其原因: Java 有着极其成熟的生态,这个不用我多说;Java 在 运维、可观测性、可监 控性方面都有着非…

作者头像 李华
网站建设 2026/4/30 20:51:34

5个实用技巧:轻松在Vim中查看文件属性

5个实用技巧:轻松在Vim中查看文件属性 【免费下载链接】vim-galore :mortar_board: All things Vim! 项目地址: https://gitcode.com/gh_mirrors/vi/vim-galore 作为一名Vim用户,你是否曾经需要快速了解文件的修改时间、大小或权限信息&#xff1f…

作者头像 李华
网站建设 2026/4/30 18:45:45

Unity网络请求终极指南:RestClient快速上手与实战技巧

在Unity开发中,处理网络请求是每个开发者都会遇到的挑战。传统的UnityWebRequest虽然功能强大,但代码结构往往复杂冗长。RestClient for Unity应运而生,这款基于Promise的REST和HTTP客户端彻底改变了Unity异步编程的游戏规则,让HT…

作者头像 李华