unity5 烘培场景变白.X的场景烘培速度慢到令人发指是什么原因

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之Unity5.x运行时动态更新烘培贴图(八十七)
Unity3D研究院之Unity5.x运行时动态更新烘培贴图(八十七)
围观17554次
编辑日期: 字体:
前段时间我研究过这个问题,但是没有解决只好作罢。今天刚好有人又问我这个问题,我得空查了一下还是找到了解决办法。另外也感谢问我的人,解答问题的同时也是我学习的过程。
运行时更新烘培贴图分两种情况
1、场景的物件没有发生变化(也就是说没有运行时加载在场景上的Prefab)此时可以直接更换烘培贴图。
1234567891011121314151617181920212223242526
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour {& //烘培烘培贴图1 public Texture2D greenLightMap; //烘培贴图2 public Texture2D redLightMap; void OnGUI() {
if(GUILayout.Button("green"))
LightmapData data = new LightmapData();
data.lightmapFar = greenLightMap;
LightmapSettings.lightmaps = new LightmapData[1]{data};
if(GUILayout.Button("red"))
LightmapData data = new LightmapData();
data.lightmapFar = redLightMap;
LightmapSettings.lightmaps = new LightmapData[1]{data};
2.场景的烘培贴图已经更新,但是有些物件prefab想运行时加载进来。如果直接Instance的话 这个Prefab是没有烘培信息的。(灰颜色的)
解决这个问题我查到了 一篇大大的文章,它带了例子大家可以下载下来。
代码在这里,把如下代码挂在GameObject上。当场景烘培结束后,把他保存成prefab,运行的时候直接加载进来就行了。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
#if UNITY_EDITORusing UnityEditor;using System.IO;#endifusing UnityEngine;using System.Collections.Generic;[DisallowMultipleComponent,ExecuteInEditMode] public class PrefabLightmapData : MonoBehaviour{&&&&[System.Serializable]&&&&struct RendererInfo&&&&{&&&&&&&&public Renderer renderer;&&&&&&&&public int lightmapIndex;&&&&&&&&public Vector4 lightmapOffsetScale;&&&&} &&&&[SerializeField]&&&&RendererInfo[] m_RendererInfo;&&&&[SerializeField]&&&&Texture2D[] m_Lightmaps;&&&&[SerializeField]&&&&Texture2D[] m_Lightmaps2; &&&&const string LIGHTMAP_RESOURCE_PATH = "Assets/Resources/Lightmaps/"; &&&&[System.Serializable]&&&&struct Texture2D_Remap&&&&{&&&&&&&&public int originalLightmapIndex;&&&&&&&&public Texture2D originalLightmap;&&&&&&&&public Texture2D lightmap0;&&&&&&&&public Texture2D lightmap1;&&&&} &&&&static List&Texture2D_Remap& sceneLightmaps = new List&Texture2D_Remap&(); &&&&void Awake()&&&&{&&&&&&&&ApplyLightmaps(m_RendererInfo, m_Lightmaps, m_Lightmaps2);&&&&} &&&&static void ApplyLightmaps(RendererInfo[] rendererInfo, Texture2D[] lightmaps, Texture2D[] lightmaps2)&&&&{&&&&&&&&bool existsAlready = false;&&&&&&&&int counter = 0;&&&&&&&&int[] lightmapArrayOffsetIndex; &&&&&&&&if (rendererInfo == null || rendererInfo.Length == 0)&&&&&&&&&&&&return; &&&&&&&&var settingslightmaps = LightmapSettings.lightmaps;&&&&&&&&var combinedLightmaps = new List&LightmapData&();&&&&&&&&lightmapArrayOffsetIndex = new int[lightmaps.Length]; &&&&&&&&for (int i = 0; i & lightmaps.Length; i++)&&&&&&&&{&&&&&&&&&&&&existsAlready = false;&&&&&&&&&&&&for (int j = 0; j & settingslightmaps.Length; j++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&if (lightmaps[i] == settingslightmaps[j].lightmapFar)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&lightmapArrayOffsetIndex[i] = j;&&&&&&&&&&&&&&&&&&&&existsAlready = true;&&&&&&&&&&&&&&&&}&&&&&&&&&&&&} &&&&&&&&&&&&if (!existsAlready)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&lightmapArrayOffsetIndex[i] = counter + settingslightmaps.Length;&&&&&&&&&&&&&&&&var newLightmapData = new LightmapData();&&&&&&&&&&&&&&&&newLightmapData.lightmapFar = lightmaps[i];&&&&&&&&&&&&&&&&newLightmapData.lightmapNear = lightmaps2[i];&&&&&&&&&&&&&&&&combinedLightmaps.Add(newLightmapData);&&&&&&&&&&&&&&&&++counter;&&&&&&&&&&&&}&&&&&&&&} &&&&&&&&var combinedLightmaps2 = new LightmapData[settingslightmaps.Length + counter];&&&&&&&&settingslightmaps.CopyTo(combinedLightmaps2, 0); &&&&&&&&if (counter & 0)&&&&&&&&{&&&&&&&&&&&&for (int i = 0; i & combinedLightmaps.Count; i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&combinedLightmaps2[i + settingslightmaps.Length] = new LightmapData();&&&&&&&&&&&&&&&&combinedLightmaps2[i + settingslightmaps.Length].lightmapFar = combinedLightmaps[i].lightmapFar;&&&&&&&&&&&&&&&&combinedLightmaps2[i + settingslightmaps.Length].lightmapNear = combinedLightmaps[i].lightmapNear;&&&&&&&&&&&&}&&&&&&&&} &&&&&&&&ApplyRendererInfo(rendererInfo, lightmapArrayOffsetIndex); &&&&&&&&LightmapSettings.lightmaps = combinedLightmaps2;&&&&} &&&&static void ApplyRendererInfo(RendererInfo[] infos, int[] arrayOffsetIndex)&&&&{&&&&&&&&for (int i = 0; i & infos.Length; i++)&&&&&&&&{&&&&&&&&&&&&var info = infos[i];&&&&&&&&&&&&info.renderer.lightmapIndex = arrayOffsetIndex[info.lightmapIndex];&&&&&&&&&&&&info.renderer.lightmapScaleOffset = info.lightmapOffsetScale;&&&&&&&&}&&&&} #if UNITY_EDITOR&&&&[MenuItem("Assets/Update Scene with Prefab Lightmaps")]&&&&static void UpdateLightmaps()&&&&{&&&&&&&&PrefabLightmapData[] prefabs = FindObjectsOfType&PrefabLightmapData&(); &&&&&&&&foreach (var instance in prefabs)&&&&&&&&{&&&&&&&&&&&&ApplyLightmaps(instance.m_RendererInfo, instance.m_Lightmaps, instance.m_Lightmaps2);&&&&&&&&} &&&&&&&&Debug.Log("Prefab lightmaps updated");&&&&} &&&&[MenuItem("Assets/Bake Prefab Lightmaps")]&&&&static void GenerateLightmapInfo()&&&&{&&&&&&&&Debug.ClearDeveloperConsole(); &&&&&&&&if (Lightmapping.giWorkflowMode != Lightmapping.GIWorkflowMode.OnDemand)&&&&&&&&{&&&&&&&&&&&&Debug.LogError("ExtractLightmapData requires that you have baked you lightmaps and Auto mode is disabled.");&&&&&&&&&&&&return;&&&&&&&&} &&&&&&&&Lightmapping.Bake();&
string lightMapPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(),LIGHTMAP_RESOURCE_PATH);&
if(!Directory.Exists(lightMapPath))
Directory.CreateDirectory(lightMapPath);&&&&&&&&&sceneLightmaps = new List&Texture2D_Remap&(); &&&&&&&&//var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
var sceneName =Path.GetFileNameWithoutExtension(EditorApplication.currentScene) ;
var resourcePath = LIGHTMAP_RESOURCE_PATH + sceneName;
var scenePath = System.IO.Path.GetDirectoryName(EditorApplication.currentScene) + "/" + sceneName + "/";
&&&&&&&&PrefabLightmapData[] prefabs = FindObjectsOfType&PrefabLightmapData&(); &&&&&&&&foreach (var instance in prefabs)&&&&&&&&{&&&&&&&&&&&&var gameObject = instance.gameObject;&&&&&&&&&&&&var rendererInfos = new List&RendererInfo&();&&&&&&&&&&&&var lightmaps = new List&Texture2D&();&&&&&&&&&&&&var lightmaps2 = new List&Texture2D&(); &&&&&&&&&&&&GenerateLightmapInfo(scenePath, resourcePath, gameObject, rendererInfos, lightmaps, lightmaps2); &&&&&&&&&&&&instance.m_RendererInfo = rendererInfos.ToArray();&&&&&&&&&&&&instance.m_Lightmaps = lightmaps.ToArray();&&&&&&&&&&&&instance.m_Lightmaps2 = lightmaps2.ToArray(); &&&&&&&&&&&&var targetPrefab = PrefabUtility.GetPrefabParent(gameObject) as GameObject;&&&&&&&&&&&&if (targetPrefab != null)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//Prefab&&&&&&&&&&&&&&&&PrefabUtility.ReplacePrefab(gameObject, targetPrefab);&&&&&&&&&&&&} &&&&&&&&&&&&ApplyLightmaps(instance.m_RendererInfo, instance.m_Lightmaps, instance.m_Lightmaps2);&&&&&&&&} &&&&&&&&Debug.Log("Update to prefab lightmaps finished");&&&&} &&&&static void GenerateLightmapInfo(string scenePath, string resourcePath, GameObject root, List&RendererInfo& rendererInfos, List&Texture2D& lightmaps, List&Texture2D& lightmaps2)&&&&{&&&&&&&&var renderers = root.GetComponentsInChildren&MeshRenderer&();&&&&&&&&foreach (MeshRenderer renderer in renderers)&&&&&&&&{&&&&&&&&&&&&if (renderer.lightmapIndex != -1)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&RendererInfo info = new RendererInfo();&&&&&&&&&&&&&&&&info.renderer = renderer;&&&&&&&&&&&&&&&&info.lightmapOffsetScale = renderer.lightmapScaleOffset; &&&&&&&&&&&&&&&&Texture2D lightmap = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapFar;&&&&&&&&&&&&&&&&Texture2D lightmap2 = LightmapSettings.lightmaps[renderer.lightmapIndex].lightmapNear;&&&&&&&&&&&&&&&&int sceneLightmapIndex = AddLightmap(scenePath, resourcePath, renderer.lightmapIndex, lightmap, lightmap2); &&&&&&&&&&&&&&&&info.lightmapIndex = lightmaps.IndexOf(sceneLightmaps[sceneLightmapIndex].lightmap0);&&&&&&&&&&&&&&&&if (info.lightmapIndex == -1)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&info.lightmapIndex = lightmaps.Count;&&&&&&&&&&&&&&&&&&&&lightmaps.Add(sceneLightmaps[sceneLightmapIndex].lightmap0);&&&&&&&&&&&&&&&&&&&&lightmaps2.Add(sceneLightmaps[sceneLightmapIndex].lightmap1);&&&&&&&&&&&&&&&&} &&&&&&&&&&&&&&&&rendererInfos.Add(info);&&&&&&&&&&&&}&&&&&&&&}&&&&} &&&&static int AddLightmap(string scenePath, string resourcePath, int originalLightmapIndex, Texture2D lightmap, Texture2D lightmap2)&&&&{&&&&&&&&int newIndex = -1; &&&&&&&&for (int i = 0; i & sceneLightmaps.Count; i++)&&&&&&&&{&&&&&&&&&&&&if (sceneLightmaps[i].originalLightmapIndex == originalLightmapIndex)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&return i;&&&&&&&&&&&&}&&&&&&&&} &&&&&&&&if (newIndex == -1)&&&&&&&&{&&&&&&&&&&&&var lightmap_Remap = new Texture2D_Remap();&&&&&&&&&&&&lightmap_Remap.originalLightmapIndex = originalLightmapIndex;&&&&&&&&&&&&lightmap_Remap.originalLightmap = lightmap; &&&&&&&&&&&&var filename = scenePath + "Lightmap-" + originalLightmapIndex; &&&&&&&&&&&&lightmap_Remap.lightmap0 = GetLightmapAsset(filename + "_comp_light.exr", resourcePath + "_light", originalLightmapIndex, lightmap);&&&&&&&&&&&&if (lightmap2 != null)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&lightmap_Remap.lightmap1 = GetLightmapAsset(filename + "_comp_dir.exr", resourcePath + "_dir", originalLightmapIndex, lightmap2);&&&&&&&&&&&&} &&&&&&&&&&&&sceneLightmaps.Add(lightmap_Remap);&&&&&&&&&&&&newIndex = sceneLightmaps.Count - 1;&&&&&&&&} &&&&&&&&return newIndex;&&&&} &&&&static Texture2D GetLightmapAsset(string filename, string resourcePath, int originalLightmapIndex, Texture2D lightmap)&&&&{&&&&&&&&AssetDatabase.ImportAsset(filename, ImportAssetOptions.ForceUpdate);&&&&&&&&var importer = AssetImporter.GetAtPath(filename) as TextureImporter;&&&&&&&&importer.isReadable = true;&&&&&&&&AssetDatabase.ImportAsset(filename, ImportAssetOptions.ForceUpdate); &&&&&&&&var assetLightmap = AssetDatabase.LoadAssetAtPath&Texture2D&(filename);&&&&&&&&&var assetPath = resourcePath + "-" + originalLightmapIndex + ".asset";&&&&&&&&var newLightmap = Instantiate&Texture2D&(assetLightmap); &&&&&&&&AssetDatabase.CreateAsset(newLightmap, assetPath); &&&&&&&&newLightmap = AssetDatabase.LoadAssetAtPath&Texture2D&(assetPath); &&&&&&&&importer.isReadable = false;&&&&&&&&AssetDatabase.ImportAsset(filename, ImportAssetOptions.ForceUpdate); &&&&&&&&return newLightmap;&&&&}#endif }
点击 Assets/Bake Prefab Lightmaps 进行烘培, 这样它的脚本里会把index 和 offset保存在prefab里。它还会保存上当前烘培场景的Lightmap,如果运行时想更换的话,你可以加一些自己的逻辑进行切换。
最后欢迎大家测试,欢迎大家提出宝贵意见,我们一起把unity这个坑填了!
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!【Unity5 烘焙】Unity5烘焙的问题,这是Bug吗?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:61,598贴子:
【Unity5 烘焙】Unity5烘焙的问题,这是Bug吗?收藏
如图,测试unity5的烘焙,发现一个问题,单面物体烘焙后阴影效果不准确,不知大家发现这个问题没。我们项目用的是简模,一些看不到的面都是不做出来的,但结果就是在unity4内烘焙没问题,到了unity5烘焙就出现黑面。经过测试,似乎确实是单双面的问题。如图,模型都是用内部的cube和plane拼凑的,上方的两个横面一个实单面(单个plane)一个实双面(两个位置相同,方向相反的plane),结果双面投影,正常,单面投影出现严重色斑。估计原因是unity5阴影计算方式是模拟真实的光线折射计算的,而现实中是不存在“单面”物体的,所以造成光线折射不准确。不知大家遇到过没?这个算是Bug吗?有没有解决方法呢?
火星时代unity3d,争当游戏大触,月薪过万小意思,手绘技能,概念设计,商业应用一步到位,你与u3d游戏特效设计师只差一步,赶快点击吧!
@只待苍霞如图,这是我测试的场景,所有东西都烘焙了,包括中间黑色的部分都是烘焙出来的光影,都是静态。中间面和Cube下半部的光影都不正常。按这样建一个场景就行了,中间一个Cube,加上三个unity5内部的Plane就可以,其他灯光和烘焙都可以用默认的参数。就能重现这个问题。如果把三个plane改成双面的模型(复制一个,反转180度也行),光影就都正常了。
所有物体都是Static, 光源选择Mixed, 烘焙之后我这里没有任何问题.
要是还找不出问题你就新建一个工程,重现你的问题然后保存成一个场景, 把这个小工程打包发给我.
方便截图下 烘焙参数?
我把Precomputed Realtime GI关闭了.
路过帮顶,表示我也遇到了类似的问题
我想问下 你烘焙这样的测试场景 耗时多久
unity3d,学习专业的游戏引擎-unity3d.达内游戏主程培训,一般要4-16周,就可掌握.变高端游戏达人-薪资翻番.unity3d费用根据培训课时定,上海官方咨询-unity3d.
请问Unity5只有b版吗?我下载的很不稳定总卡死
就这个参数 花了几个小时 不知道哪里出错了
这确实是个问题呢 我们场景花草树木很多 都做成双面会费很多资源的。这个难道真的解决不了吗
哦 找到了 隐藏的好深 。谢谢咯。
default parameters 这个点进去可以设置在里面
我也遇到这个问题,试试设置看能不能解决问题
看到最后还是没找到- -,default parameters里没有啊,调哪个参数
你好我也在研究烘焙,请问有unitylabs 那个包吗。求一份就是官方5.0室内的那个
Windows-Lighting-Scene-General GI-Default Parameters-Create New...-Edit-Backface Tolerance
看大家都是研究Unity5,现在帖子这么久了,楼主还能回复了吗我的工程文件在导入模型时候勾选生成UV;然后导入到工程中后,设置物体为静态时,一直报错,提示无albedoUV 是怎么个回事?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 1923|回复: 6
unity5.0 烘培 特别慢求救
111/50排名<font color="#FF昨日变化83主题帖子积分
注册看看, 积分 11, 距离下一级还需 39 积分
注册看看, 积分 11, 距离下一级还需 39 积分
在线时间5 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
最近用上.0版本 烘培一些场景非常非常慢 ,设置和一起4.0半年设置基本一样,现在经常是烘培一天都卡在
QQ截图39.png (16.97 KB, 下载次数: 0)
16:15 上传
求救下大神怎么解决&&已经疯了这是FBX设置
qq.png (43.67 KB, 下载次数: 0)
16:17 上传
这是Scene设置
2222.png (55.57 KB, 下载次数: 0)
16:17 上传
烘培;unity5unity5.3烘培;unity5烘培前后不一样;unity5.0 烘培;unity5.3 fbx
每日推荐:
17/50排名<font color="#FF昨日变化83主题帖子积分
注册看看, 积分 7, 距离下一级还需 43 积分
注册看看, 积分 7, 距离下一级还需 43 积分
在线时间1 小时
我也有类似问题,帮你顶顶··············
每日推荐:
4457/500排名<font color="#FF昨日变化2主题帖子积分
四处流浪, 积分 457, 距离下一级还需 43 积分
四处流浪, 积分 457, 距离下一级还需 43 积分
在线时间105 小时
unity5.0烘焙优化请查看:
每日推荐:
4457/500排名<font color="#FF昨日变化2主题帖子积分
四处流浪, 积分 457, 距离下一级还需 43 积分
四处流浪, 积分 457, 距离下一级还需 43 积分
在线时间105 小时
5.0烘焙请查看
每日推荐:
4334/500排名<font color="#FF昨日变化3主题帖子积分
四处流浪, 积分 334, 距离下一级还需 166 积分
四处流浪, 积分 334, 距离下一级还需 166 积分
蛮牛币2298
在线时间131 小时
indirect开的太大了
每日推荐:
3262/300排名<font color="#FF昨日变化19主题帖子积分
偶尔光临, 积分 262, 距离下一级还需 38 积分
偶尔光临, 积分 262, 距离下一级还需 38 积分
在线时间133 小时
告诉你个办法,百试百灵:你先把所有数字都设到最小,先烘焙一遍,然后在调到自己满意的数值,就会快不少
每日推荐:
116/50主题帖子积分
注册看看, 积分 16, 距离下一级还需 34 积分
注册看看, 积分 16, 距离下一级还需 34 积分
在线时间12 小时
其实网上蛮多帖子,其实还是蛮害人的。preserve UV针对的是realtime GI。这个功能如果你烘培lightmap无需勾选,即便是烘培realtime gi,要不要勾这个功能,还得看情况。即便是不勾选,如果你烘培的lightmap,unity也会根据UV1的信息来合并贴图的。
每日推荐:
社区QQ达人
使用QQ帐号登录论坛的用户unity3d (手机网游开发问题总结)(35)
事情起因是这样的,以前我们都是用的unity4x ,新项目我们准备采用unity5x,而5x一个重大的改进就是烘焙已经完全和之前不同了。
新的烘焙技术叫 Realtime GI . 简单说下能达到的效果就是更牛&#36924;了,牛&#36924;在实时过程中会生成一张间接的光照图,会记录物体表面受到的间接的光照信息,这样会有更真实的效果。(暂时没有实验过,后面补上,反正感觉是很牛&#36924;了~~)
回到主题~~
今天我们场景在烘焙的时候其中有一个树,带有动作文件(树在摆动),然后一直烘焙不上去。找了下原因,最终了解了下实时光照。&这篇文章了解实时光照。
经过测试我得到如下的结论
如果你的场景中动态图很多~~要么就使用混合烘焙,要么动态的物体就选择不受光影响的shader。
效率比较的话: 实时烘焙 和 不烘焙 基本不考虑了,具体其他情况我觉得都是可以接受的。看情况而定,目前我们项目采用了 静态烘焙 &#43; shader组合,这样效率最高。毕竟我们这种arpg游戏不是重点表现场景的,能为其他重点表现腾出资源就够了
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:215531次
积分:3019
积分:3019
排名:第9221名
原创:191篇
评论:55条
(5)(5)(2)(3)(1)(6)(8)(5)(4)(2)(3)(1)(5)(1)(1)(3)(1)(3)(10)(11)(9)(3)(16)(30)(10)(1)(6)(2)(1)(2)(38)(2)

我要回帖

更多关于 unity 启动速度慢 的文章

 

随机推荐