原址: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能正常使用。
先前写过一篇关于动态加载Lightmap方案的文章,本想在先前那篇补充的,不过想了下还是新开个文章,因为这个问题让我烦恼了两三天,我觉得应该是非常值得重视的问题。因为这种问题虽然很少遇到,但是一旦遇到连官方都救不了你,因为连你自己都无法知道到底问题是出在哪里。
先前的文章:《Lightmapping使用及动态加载lightmap方案 》
项目背景:
场景加载方式:
为每个物体生成PREFAB,将所有PREFAB打包成一系列ASSETBUDNLE,读取ASSETBUNDLE中的每一个PREFAB储存在HASHTABLE里面,然后场景由一个个PREFAB实例化而成。
读取场景方式:
读取一个关于场景的JSON文件,这个JSON文件包涵了每一个GAMEOBJECT的顶点位置、旋转、缩放、LIGHTMAP索引、LIGHTMAP的OFFSET信息。然后将HASHTABLE里面的一个个物件根据JSON的相应信息实例化成GAMEOBJECT。
读取LIGHTMAP方式:
1.设UV2,自己生成或者U3D勾选导入设置面板生成的都可以。
2.设静态GAMEOBJECT烘培LIGHTMAP。
3.将LIGHTMAP加载进场景。采用ASSETBUNDLE和RESOURCES.LOAD的方法都行。
4.LIGHTMAP赋值,实例化每一个GAMEOBJECT的RENDERER里面有lightmapIndex,lightmapTilingOffset信息,实例化的时候直接赋值就行。
好了, 一切背景就绪,这个结果会发现WINDOWS一切正常!!
但是ANDROID和IOS却会发现各种LIGHTMAP信息错乱。
然后你上官方论坛谷歌等网站搜索会发现!讨论的都是MAC和PC的不一样的原因,让你各种REIMPORT资源,重新烘培啥的。竟然没有解决方案!!因为太少人这样做了。
当你研究半天的时候,会发现,LIGHTMAP信息错乱并不是没有加载到正确的LIGHTMAP和UV错乱的问题,而是由于没有UV2信息导致的。但是糟糕的是WINDOWS系统下却是有UV2的!!为什么其它平台没有?
然后你会怀疑是不是ASSETBUNDLE里面没有将UV2打包进去。
然后你各种尝试,反复尝试UV,甚至自己在3DMAX里面生成一个正确的UV2,一个个去测试。然后你发现有的是对的,但是同样情况有的又是错的,这天杀的BUG肯定是U3D的BUG,你开始这样想。
傻了吧?!
我也傻了两天。
无意中,我重新生成了一个PREFAB,妈蛋竟然可以了?!!
我无法解释具体原因是什么,但我认为应该是U3D的PREFAB里面记录了模型原本是否具有UV2的信息,而WINDOWS下不需要任何操作便能自动识别是否具有,而在IOS和ANDROID下却要重新APPLY一下PREFAB,告诉引擎这个是有UV2的。这个UV2才能打包进ASSETBUNDLE里面。
WTF!!
我觉得这已经算是U3D的一个BUG了,如果不是无意中试出来了,我觉得我们项目需要改变加载LIGHTMAP的方式了。
改变的方式有两种,一种是所有模型在MAX或MAYA等重新生成一个UV2,再重新生成PREFAB。
另一种是放弃动态加载的方式,直接一个关卡一个场景,由U3D自行处理其中的关系。