Lightmap Switching Tool技术原理:LevelLightmapData组件源码解析 Lightmap Switching Tool技术原理LevelLightmapData组件源码解析【免费下载链接】lightmap-switching-toolTool that allows switching different baked lightmap sets on a unity scene at runtime.项目地址: https://gitcode.com/gh_mirrors/lig/lightmap-switching-toolLightmap Switching Tool是一款强大的Unity运行时光照切换工具能够帮助开发者在运行时动态切换不同的烘焙光照贴图集为游戏场景带来丰富的光照变化效果。本文将深入解析其核心组件LevelLightmapData的技术原理带您了解光照切换背后的实现机制。LevelLightmapData组件概述LevelLightmapData是Lightmap Switching Tool的核心组件定义在Packages/LightingTools.LightmapSwitcher/Runtime/LevelLightmapData.cs文件中。该组件继承自MonoBehaviour通过[ExecuteInEditMode]特性实现了编辑模式下的实时预览功能为开发者提供了所见即所得的光照编辑体验。核心数据结构LevelLightmapData组件中定义了一个关键的数据结构RendererInfo用于存储渲染器的光照贴图信息[System.Serializable] public class RendererInfo { public Renderer renderer; public int transformHash; public int meshHash; public string name; public int lightmapIndex; public Vector4 lightmapScaleOffset; }这个结构包含了渲染器引用、变换哈希值、网格哈希值、名称、光照贴图索引以及缩放偏移量等关键信息为光照贴图的准确切换提供了数据基础。光照场景数据管理LevelLightmapData组件通过维护一个LightingScenarioData列表来管理不同的光照场景[SerializeField] ListLightingScenarioData lightingScenariosData;每个LightingScenarioData对象包含了特定光照场景所需的所有数据包括光照贴图、方向图、阴影遮罩、渲染器信息以及光照探针等。光照场景加载流程当需要切换光照场景时LevelLightmapData会调用LoadLightingScenario方法该方法是光照切换的核心实现public void LoadLightingScenario(LightingScenarioData data) { if (data.name ! currentLightingScenario) { previousLightingScenario currentLightingScenario; currentLightingScenario data.name; LightmapSettings.lightmapsMode data.lightmapsMode; if (allowLoadingLightingScenes) m_SwitchSceneCoroutine StartCoroutine(SwitchSceneCoroutine(...)); var newLightmaps LoadLightmaps(data); ApplyDataRendererInfo(data.rendererInfos); LightmapSettings.lightmaps newLightmaps; LoadLightProbes(data); } }这个方法首先更新当前和上一个光照场景的名称然后设置光照贴图模式接着异步加载新的光照场景加载光照贴图应用渲染器信息最后加载光照探针数据。光照贴图加载与应用LoadLightmaps方法负责从LightingScenarioData中加载光照贴图数据LightmapData[] LoadLightmaps(LightingScenarioData data) { if (data.lightmaps null || data.lightmaps.Length 0) { Debug.LogWarning(No lightmaps stored in scenario data.name); return null; } var newLightmaps new LightmapData[data.lightmaps.Length]; for (int i 0; i newLightmaps.Length; i) { newLightmaps[i] new LightmapData(); newLightmaps[i].lightmapColor data.lightmaps[i]; if (data.lightmapsMode ! LightmapsMode.NonDirectional) { newLightmaps[i].lightmapDir data.lightmapsDir[i]; } if (data.shadowMasks.Length 0) { newLightmaps[i].shadowMask data.shadowMasks[i]; } } return newLightmaps; }该方法根据光照模式加载对应的光照颜色图、方向图和阴影遮罩构建LightmapData数组并返回。渲染器信息应用ApplyDataRendererInfo方法负责将光照贴图信息应用到场景中的渲染器public void ApplyDataRendererInfo(RendererInfo[] infos) { var hashRendererPairs new Dictionaryint, RendererInfo(); foreach (var info in infos) { var uniquehash info.transformHash info.name.GetHashCode() info.meshHash; hashRendererPairs.Add(uniquehash, info); } var renderers FindObjectsOfTypeRenderer(); foreach (var render in renderers) { // 计算哈希值并查找匹配的RendererInfo if (hashRendererPairs.TryGetValue(... , out infoToApply)) { render.lightmapIndex infoToApply.lightmapIndex; if (applyLightmapScaleAndOffset) render.lightmapScaleOffset infoToApply.lightmapScaleOffset; } } }这个方法通过计算唯一哈希值来匹配场景中的渲染器和存储的RendererInfo确保光照贴图能够准确地应用到对应的物体上。光照探针处理除了光照贴图LevelLightmapData还处理光照探针数据通过LoadLightProbes方法实现public void LoadLightProbes(LightingScenarioData data) { if(data.lightProbesAsset.coefficients.Length 0) { try { LightmapSettings.lightProbes data.lightProbesAsset.lightprobes; LightmapSettings.lightProbes.bakedProbes data.lightProbesAsset.lightprobes.bakedProbes; } catch { Debug.LogWarning(Warning, error when trying to load lightprobes for scenario data.name); } } }这个方法加载光照探针数据确保场景中的间接光照能够正确切换。光照场景数据存储LevelLightmapData还提供了StoreLightmapInfos方法用于存储当前场景的光照信息public void StoreLightmapInfos(int index) { // 创建或获取LightingScenarioData对象 // 收集渲染器信息、光照贴图、方向图、阴影遮罩等数据 // 存储光照探针数据 // 更新lightingScenariosData列表 }这个方法会收集当前场景的光照数据包括渲染器信息、光照贴图、方向图、阴影遮罩和光照探针等并将其存储到对应的LightingScenarioData对象中。Lightmap Switching Tool生成的光照贴图示例展示了场景中不同区域的光照信息总结LevelLightmapData组件通过精心设计的数据结构和方法实现了Unity场景中光照贴图的动态切换。其核心原理是通过存储不同光照场景的光照贴图数据和渲染器信息在运行时动态加载并应用这些数据从而实现光照效果的无缝切换。通过深入理解LevelLightmapData的实现原理开发者可以更好地使用Lightmap Switching Tool为游戏场景创造出更加丰富多样的光照效果提升游戏的视觉体验和沉浸感。无论是日夜交替、天气变化还是特殊光照效果Lightmap Switching Tool都能为您提供简单而强大的解决方案。【免费下载链接】lightmap-switching-toolTool that allows switching different baked lightmap sets on a unity scene at runtime.项目地址: https://gitcode.com/gh_mirrors/lig/lightmap-switching-tool创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本月热点