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 void TestLightmapingInfo()
      {
            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("Lightmaping Offset: " + tempObject[i].renderer.lightmapTilingOffset);
                  }
            }
      }
}

知道原理后就好办了。

用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自行处理其中的关系。












  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值