阅读量:0
预制绑定光照贴图,网上解决方案很多,已下是要点:
//烘培完场景之后,保存光照贴图信息 void StoreLightmapData() { lightMap.Clear(); LightmapData[] lds = LightmapSettings.lightmaps; foreach (LightmapData data in lds) { CustomLightMapData cd = new CustomLightMapData(); cd.lightMapDir = data.lightmapDir; cd.shadowMask = data.shadowMask; cd.lightMapColor = data.lightmapColor; lightMap.Add(cd); } } //因为预制不保存光照信息 //保存预制中MeshRenderer 的光照信息到存储列表 private void GetChildData(Transform parent) { if (parent.gameObject.isStatic) { var render = parent.GetComponent<MeshRenderer>(); if (render != null && render.lightmapIndex >=0) { datas.Add(new RenderLightmapData(render, render.lightmapIndex, render.lightmapScaleOffset)); } } for (int i = 0; i < parent.childCount; i++) { GetChildData(parent.GetChild(i)); } } //加载预制是执行脚本方法 public void SetAllLightmapData() { SetRenderSetting(); LightmapData[] lightmapDatas = new LightmapData[lightMap.Count]; for (int i = 0; i < lightMap.Count; i++) { CustomLightMapData cd = lightMap[i]; LightmapData ld = new LightmapData(); ld.lightmapDir = cd.lightMapDir; ld.lightmapColor = cd.lightMapColor; ld.shadowMask = cd.shadowMask; lightmapDatas[i] = ld; } LightmapSettings.lightmaps = lightmapDatas; for (int i = 0; i < datas.Count; i++) { if (datas[i]._renderer == null) { Debug.LogError("redner is null index="+i); continue; } datas[i]._renderer.lightmapIndex = datas[i]._lightmapIndex; datas[i]._renderer.lightmapScaleOffset = datas[i]._lightmapScaleOffset; } }
以上大致代码,思路就是烘培完之后把光照信息绑定到脚本上,加载预制时脚本再还原光照信息
其中遇到的问题就是,加载完预制还原光照信息后,物体变白
原场景烘焙之后效果图:
加载到其他场景效果图:
显示效果变的特别白
问题的原因
问题原因及结论:
如果烘培场景光照贴图选择定向模式(Directional),那么使用预制场景可以设置定向或者非定向都可以
如果烘培场景光照贴图选择了非定向模式(Non-Directional),那么使用预制场景只能设置为非定向模式
我遇到的问题是烘培场景选择了Non-Directional ,但使用场景使用了定向模式