【光照】Unity[光照烘焙]的原理与具体流程
【从UnityURP开始探索游戏渲染】专栏-直达
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的光照烘焙系统通过结合预计算和实时计算,在保持良好视觉效果的同时显著提升了渲染性能,特别适合移动端和中低端硬件平台
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【光照】Unity[光照烘焙]的原理与具体流程的更多相关文章
- Unity光照图UV显示
美术的同学觉得 Unity 光照图烘焙的不够美丽,需要在 ps 里修一修,但是不知道每个物体对应的光照图在哪个区域,UV 是如何分布的,于是要求写一个工具显示,于是有了下面这个: 打开场景自动读取当前 ...
- unity灯光烘焙设置详解
游戏场景中灯光照明的构成 现实生活中的光线是有反射.折射.衍射等特性的.对这些基本特性的模拟一直以来都是计算机图形图像学的重要研究方向. 在CG中,默认的照明方式都是不考虑这些光线特性的,因此出来的效 ...
- 第2章 rsync算法原理和工作流程分析
本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释. 以下是本文的姊妹篇: 1.rsync(一):基本命令和用法 2.rsync(二):ino ...
- SpringBoot启动原理及相关流程
一.springboot启动原理及相关流程概览 springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置.那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 二 ...
- 轻松理解Redux原理及工作流程
轻松理解Redux原理及工作流程 Redux由Dan Abramov在2015年创建的科技术语.是受2014年Facebook的Flux架构以及函数式编程语言Elm启发.很快,Redux因其简单易学体 ...
- rsync算法原理和工作流程分析
本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...
- 【Linux高级驱动】触摸屏工作原理与工作流程
触摸屏工作原理 触摸屏工作流程 @成鹏致远 (blogs:http://lcw.cnblogs.com) (email:wwwlllll@126.com) ) From WizNote
- 漫谈Github与开源,Git介绍以及Git的思想和基本工作原理 Git工作流程
漫谈Github与开源 文字亮点: 为什么这些优秀的工程师会开源自己的项目? 因为开源是一种精神. 无数的软件开发者苦心积虑保护自己的代码不被破解,而还是被聪明绝顶的脚本小子破解了,但破解无数软件的脚 ...
- shiro原理及其运行流程介绍
shiro原理及其运行流程介绍 认证执行流程 1.通过ini配置文件创建securityManager 2.调用subject.login方法主体提交认证,提交的token 3.securityMan ...
- FPGA组成、工作原理和开发流程
FPGA组成.工作原理和开发流程 原创 2012年01月07日 09:11:52 9402 0 4 ********************************LoongEmbedded***** ...
随机推荐
- 无监督学习 Kmeans
无监督学习 自动对输入数据进行分类或者分群 优点: 算法不受监督信息(偏见)的约束,可能考虑到新的信息 不需要标签数据,极大程度扩大数据样本 Kmeans 聚类 根据数据与中心点距离划分类别 基于类别 ...
- [ThingsBoard] 3. 源码解读Actor
一.前言 本文基于 ThingsBoard 4.0.2 编写,对应提交Version set to 4.0.2(01c5ba7d37006e1f8a3492afbb3c67d017ca8dd3). 由 ...
- USB(2.0 / Type-C) to MPSSE(JTAG / SPI / IIC) / UART / FIFO: FT4232 USB-SPI python调试
FT4232 USB-SPI python调试 硬件连接 选择USB自供电模式(无需外部电源), jumper跳线帽设置3.3V; 连接PC电脑. 驱动 Linux/MacOS/Windows大多都能 ...
- mysql事务隔离级别/脏读/不可重复读/幻读详解
一.四种事务隔离级别 1.1 read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务 ...
- 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
目录 前言 什么是内存映射文件(Memory-Mapped File) 如何在 .NET 中使用 MMF 创建内存映射文件 使用 MemoryMappedViewAccessor 来直接读写结构体数据 ...
- Win11纯净版如何修改dns的问题
有很多电脑基地的小伙伴平常在使用电脑的时候会遇到电脑网络无法连接的情况,这时可以尝试通过修改dns地址来解决,不过很多用户不清楚win11纯净版怎么修改dns,其实只要打开网络高级设置就可以了.下面一 ...
- 校验 GPT-4 真实性的三个经典问题:快速区分 GPT-3.5 与 GPT-4
现在已经有很多 ChatGPT 的套壳网站,以下分享验明 GPT-4 真身的三个经典问题,帮助你快速区分套壳网站背后到底用的是 GPT-3.5 还是 GPT-4. 大家可以在这个网站测试:https: ...
- Unity 全系列免手机号全球版下载
低调使用 https://github.com/tylearymf/UniHacker Unity中国
- redis协议以及淘汰策略
- 2020 Multi-University Training Contest 1-1004 Distinct Sub-palindromes
http://acm.hdu.edu.cn/showproblem.php?pid=6754 题意: 字符串由小写字母构成 求 长度为N的 回文子串数量最少的 字符串的个数 思路: 长度为1的串 回文 ...