打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[Unity3D]Lightmapping使用及动态加载lightmap方案
(转载请注明出处,本文会偶尔更新,最近更新于2013.07.17)

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/LightmappingCustomSettings.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
{
    [MenuItem("Batch/" +"测试Lightmapping信息 ")]
    static voidTestLightmapingInfo()
    {
       GameObject[] tempObject;
       if (Selection.activeGameObject)
       {
           tempObject= Selection.gameObjects;
           for (int i= 0; i < tempObject.Length; i++)
           {
              Debug.Log("Object name: " + tempObject[i].name);
              Debug.Log("Lightmaping Index:" + tempObject[i].renderer.lightmapIndex);
              Debug.Log("LightmapingOffset: " + tempObject[i].renderer.lightmapTilingOffset);
           }
       }
    }
}

知道原理后就好办了。

用JSON保存所有场景的position,rotation,scale信息,若有lightmap的话需要保存lightmapIndex和lightmapTilingOffset信息。实例化的时候重新赋值就好了。

具体整个流程太长了,我也不多说了。

需要注意的是:

1.可能会有很多冗余的lightmap信息,这个需要每个场景去处理。相同的lightmap信息不要去多次生成。

2.动态加载lightmap的时候的索引要自己定义好,或找个方法分类好。

3.动态加载完之后需要调用一下StaticBatchingUtility.Combine(parent)来将整个场景静态化,使得batching能正常使用。

有啥问题直接发邮件吧。改天我再来完整这篇文章。

xuzhiping7#qq.com  (#改成@)







本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Unity3D教程宝典之Web服务器篇
?【厚积薄发】揭开Unity AssetBundle庐山真面目(二)
【厚积薄发】技术分享连载(二十)|Animation Clip |图集内存查看...
科学网
八字论命高手推荐(俱是真性情者)
如何让孩子爱上阅读?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服