[Unity3D]Lightmapping使用及动态加载lightmap方案

转载: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
{
    [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能正常使用。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值