【从UnityURP开始探索游戏渲染】专栏-直达
Unity URP 光照贴图技术通过预计算静态物体的光照信息并存储为纹理,实现高效的光照效果渲染。
光照贴图技术演进
- 早期阶段Unity 5.x之前采用Enlighten光照系统,仅支持静态物体烘焙,动态物体需依赖Light Probe间接光照。
- URP引入URP整合了轻量级烘焙管线,支持混合光照模式(Mixed Lighting),允许静态物体烘焙阴影与动态物体实时交互。
- HDRP协同发展HDRP引入更高精度的光照贴图UV生成和分辨率控制,URP随后适配简化版流程,如自动生成Lightmap UVs功能。
静态物体解决方案
核心步骤:
- 标记静态属性在Mesh Renderer中勾选
Contribute GI
,并启用Lightmap Static
标识。 - UV准备模型导入时勾选
Generate Lightmap UVs
(Project视图 > Model选项卡)。 - 参数调整
Scale In Lightmap
:控制分辨率(值越大细节越精细)。Lightmap Resolution
:全局设置(建议30-100 texels/unit)。
示例场景:
csharp
// 静态物体Cube烘焙设置
public class StaticBaker : MonoBehaviour {
void Start() {
GetComponent<MeshRenderer>().lightmapScaleOffset = new Vector4(1, 1, 0, 0);// 默认UV缩放
GetComponent<MeshRenderer>().lightmapIndex = 0;// 绑定光照贴图索引
}
}
动态物体解决方案
技术组合:
- Light Probes在场景中布置探针组,动态物体通过
LightProbeProxyVolume
获取周围烘焙光照数据。 - 混合光照模式光源设为
Mixed
模式,静态阴影烘焙到光照贴图,动态物体接收实时阴影。
- Light Probes在场景中布置探针组,动态物体通过
示例代码:
csharp // 动态物体Sphere适配光照 public class DynamicLighting : MonoBehaviour { void Update() { LightProbes.GetInterpolatedProbe(transform.position, GetComponent<Renderer>(), out var probe); GetComponent<Renderer>().additionalLightmapSettings.lightProbeVolume = probe; } }
跨场景预制体烘焙
通过PrefabLightmapsData
脚本保存光照贴图数据,动态加载时恢复:
- 预制体根节点挂载脚本,烘焙后自动记录贴图索引和UV偏移。
- 新场景中实例化预制体时,脚本在
Awake
阶段重新绑定光照贴图。
性能优化建议
- 分层控制:使用
Rendering Layer Mask
限制光源影响范围。 - 分辨率分级:远景物体降低
Scale In Lightmap
值。 - 分块烘焙:大场景分区域烘焙后合并。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)