光照贴图烘焙:原理、流程与优化
什么是光照贴图烘焙
光照贴图(Lightmap)是一张存储静态场景光照信息的纹理。烘焙(Baking)是指离线计算场景中的全局光照(包括直接光、间接光、阴影、颜色反弹等),并将结果保存到光照贴图中。运行时,模型通过 UV 映射采样光照贴图,获得预计算的光照效果,无需实时计算复杂光照,从而大幅提升性能。光照贴图广泛用于移动端和低端设备的游戏开发。
光照贴图的原理
烘焙过程通常使用光线追踪或辐射度算法,模拟光子在场景中的传播,计算每个表面点的入射光照。结果可以存储为:
- **光照贴图**:2D 纹理,记录漫反射光照颜色。
- **光照探针**:用于动态物体的间接光照。
- **反射探针**:记录环境反射信息。
烘焙结果与静态物体绑定,因此要求场景中的静态物体在运行时不能移动。
烘焙流程
在 Unity 和 Unreal 中,光照贴图烘焙通常包括以下步骤:
- **标记静态物体**:将不移动的物体标记为 Static(Unity)或 Mobility 设为 Static(Unreal)。
- **设置 UV**:确保模型有合适的第二套 UV(用于光照贴图),UV 需唯一且不重叠。
- **配置光源**:将光源设置混合模式为 Baked 或 Mixed。
- **调整烘焙参数**:如分辨率、间接光照强度、环境光等。
- **开始烘焙**:引擎离线计算光照,生成光照贴图。
- **应用**:运行时自动采样光照贴图。
- 运行时性能高,无需实时全局光照计算。
- 光照效果逼真,支持软阴影、颜色反弹等。
- 适合移动端和低端硬件。
- 只能用于静态场景,动态物体无法使用。
- 烘焙耗时,修改场景需重新烘焙。
- 光照贴图占用内存和存储空间。
- 无法响应实时变化的光照。
- **降低光照贴图分辨率**:远处或次要物体可以使用低分辨率。
- **使用光照探针**:为动态物体提供近似间接光照。
- **压缩光照贴图**:使用 ASTC、ETC2 等压缩格式减少内存。
- **合并 UV 岛**:优化 UV 布局,减少纹理空间浪费。
- **避免接缝**:确保相邻 UV 岛之间有足够填充,防止渗色。
光照贴图的优缺点
**优点**:
**缺点**:
优化与注意事项
常见问题
光照贴图和实时全局光照有什么区别?
光照贴图是离线预计算,运行时采样;实时全局光照在运行时计算,支持动态变化但性能开销大。
动态物体如何获得光照贴图的好处?
可以使用光照探针,动态物体采样附近探针,获得间接光照的近似。
为什么需要第二套 UV?
第一套 UV 可能重叠或拉伸,第二套 UV 专用于光照贴图,需要唯一且不重叠。
烘焙光照需要多久?
取决于场景复杂度、参数和硬件,可能从几分钟到几小时。
移动端必须使用光照贴图吗?
不必须,但强烈推荐,因为移动端性能有限,光照贴图可以显著提升帧率。
常见问题
光照贴图和实时全局光照有什么区别?
光照贴图是离线预计算,运行时采样;实时全局光照在运行时计算,支持动态变化但性能开销大。
动态物体如何获得光照贴图的好处?
可以使用光照探针,动态物体采样附近探针,获得间接光照的近似。
为什么需要第二套UV?
第一套UV可能重叠或拉伸,第二套UV专用于光照贴图,需要唯一且不重叠。
烘焙光照需要多久?
取决于场景复杂度、参数和硬件,可能从几分钟到几小时。
移动端必须使用光照贴图吗?
不必须,但强烈推荐,因为移动端性能有限,光照贴图可以显著提升帧率。