转载:http://blog.sina.com.cn/s/blog_5b6cb9500101cplo.html
1.为什么要用Lightmapping?
简单来说就是实时灯光计算十分耗时,随着光源越多会倍增计算耗时。使用Lightmap模拟灯光带来的效果,便不用去计算灯光,会带来性能上的大大提升。当然你不用灯光效果也是没问题的,具体还是看项目需求。最简单的直接在3dmas或maya里面烘培完贴图顶点色也行。
2.为什么要使用LightProbes?
因为场景中都是假光,动态的物体或角色没有受光会很突兀,显得格格不入。若觉得没关系便不需要管了,想要角色也有这样的效果就需要用到LightProbes。
3.Lightmapping入门
这部分我就不写了,我写也不完整,便将自己觉得不错的文章贴出来让大家参考学习。
官方教程:
Lightmapping基本使用方式:
http://docs.unity3d.com/Documentation/Manual/Lightmapping.html
深入了解Lightmapping各种设置的说明:
http://docs.unity3d.com/Documentation/Manual/LightmappingInDepth.html
自定义烘培的默认参数:
http://docs.unity3d.com/Documentation/Manual/LightmappingCustomSettin
gs.html
深入Lightmapping的UV:
http://docs.unity3d.com/Documentation/Manual/LightmappingUV.html
模拟光源(差值计算):
http://docs.unity3d.com/Documentation/Manual/LightProbes.html
相对应的圣典有翻译,若英文不大好的同学可以去搜搜。
http://game.ceeger.com/Manual/
风宇冲相关几篇个人觉得不错的,只是丢图现象比较严重:
第一讲光影烘焙:
http://blog.sina.com.cn/s/blog_471132920101etyp.html
第二讲AreaLight:
http://blog.sina.com.cn/s/blog_471132920101fe6z.html
第三讲LightProbes:
thttp://blog.sina.com.cn/s/blog_471132920101fe71.html
第四讲脚本控制(在不同的地方给动态角色不同的颜色叠加):
http://blog.sina.com.cn/s/blog_471132920101fe7b.html
4.动态加载Lightmap方案
若场景是动态生成的,则需要用到动态Lightmap方案。若是静态的话,不需要理解这部分。
首先需要知道的是,每个GameObject的Renderer信息都会有记录自己是否有用到lightmap和用到lightmap的哪部分的记录,这个记录是可以读取和修改的。这两个参数分别是lightmapIndex和lightmapTilingOffset,前者是用到了那张索引的lightmap,后者则是记录用的是lightmap的哪部分。
大家可以测试下这些信息,我写了个脚本直接输出。当然没有lightmap信息的物体会error警告。
以下脚本(BatchOperation.cs)放到Editor下便可以用了,选择想要查看的物体,点击菜单栏的Batch/测试Lightmapping信息便能直接输出结果。
using UnityEditor;
using UnityEngine;
using System.Collections;
public class BatchOperation : EditorWindow
{
}
知道原理后就好办了。
用JSON保存所有场景的position,rotation,scale信息,若有lightmap的话需要保存lightmapIndex和lightmapTilingOffset信息。实例化的时候重新赋值就好了。
具体整个流程太长了,我也不多说了。
需要注意的是:
1.可能会有很多冗余的lightmap信息,这个需要每个场景去处理。相同的lightmap信息不要去多次生成。
2.动态加载lightmap的时候的索引要自己定义好,或找个方法分类好。
3.动态加载完之后需要调用一下StaticBatchingUtility.Combine(parent)来将整个场景静态化,使得batching能正常使用。