精华内容
下载资源
问答
  • 用于ThreeJS + react-three-fiber的实验性Lightmap Baker 在ThreeJS + react-fiber-fiber中快速,便宜地进行全局照明光照贴图烘焙。 。 在此处查看屏幕截图和简要说明: : 。 要在本地尝试实验性光照贴图显示,...
  • 不同预制体在不同场景烘焙,使用方法:https://blog.csdn.net/qq_26318597/article/details/113652985
  • React三光图 浏览器内的光照贴图和环境光遮挡(AO贴图)烘焙器,用于三纤维和ThreeJSReact。 。 地方发展 git clone git@github....cd react-three-lightmap yarn yarn storybook 笔记 基于。
  • Unity动态加载LightMap(2)

    2019-04-19 20:53:12
    动态加载lightmap,当场景比较大时,场景中的静态物件是逐步加载的。因此每个物件要单独存储自己的lightmap信息。
  • Unity动态加载LightMap(1)

    2019-04-19 18:18:56
    动态加载LightMap。需要事先烘焙好lightmap,并保存。
  • Unity的Terrain分割,分块后的各Terrain各自保存自己的Lightmap信息。
  • 该工具旨在在运行时在静态场景上切换预烘焙的光照贴图和实时光照。 根据平台或内容的不同,切换可能不是即时的,而是要花几秒钟的时间,如果您只想更改照明,此脚本仅允许您避免重复场景。 此版本与unity 2017.4及...
  • lightmap

    2018-05-07 11:46:50
    http://www.hiwrz.com/2016/05/18/unity/199/
    展开全文
  • Unity3D之Lightmap入门

    2014-07-28 11:53:55
    一个比较基础的烘培,但有别于U3D内部烘焙。
  • Lightmap HDR Light Studio 用户手册
  • Save lightMap in prefab

    2015-09-26 15:27:25
    改Demo完美解决了如何将光照贴图保存在prefab中,为场景资源的动态加载提供了有力支持,下载后可以直觉运行,绝对是福利哦!
  • mc基岩版的光影,此文件适用于1.5以下的基岩版,1.5以上无解!
  • http://blog.csdn.net/yulinxx/article/details/72720944
  • Unity3D Lightmap贴图、加载、替换与切换Unity3D Lightmap贴图、加载、替换与切换
  • 资料收集于网络如有侵权请联系网站删除 Unity3D 之 Lightmap 详解使用烘焙贴图场景技巧 作者李志健 Unity 完全集成了光照贴图 可以通过编辑器创建完整的光照贴图 你完全不用担心 所有材质 会自动获得光照贴图光照...
  • unity3d之Lightmap详解

    2013-06-11 16:37:21
    unity 3d关于lightmap的详解、烘培贴图、场景技巧。
  • three.js光照贴图内部测试 一个简单的three.js演示场景,其中测试了使用插件Lightmapper在Blender中生成的光照贴图。 通过对环境地图进行盒子投影,可以实现地面反射。 环境地图也是在Blender中生成的。...
  • unity5 LightMap_shader支持透明贴图 可调亮度 LightMap_shader支持透明贴图
  • 动态加载Lightmap

    千次阅读 2019-06-18 17:48:19
    D:/OGL/terrain_proj-master/terrain_proj-master/Assets/StreamingAssets\race_track_lake2_lightmap.ab 然后是www加载: WWW www = new WWW ( path ) ; yield return www ; AssetBundle ...

    https://gitee.com/langresser_king/terrain_proj

    本文主要是总结上文中代码中的关于光照贴图的代码和加载的方法。

    首先是GameController类中的方法:

    TerrainLoadMgr.sington.LoadLM
    

    然后是:

    public IEnumerator LoadLM(Action finish)
    {
           string scene = SceneManager.GetActiveScene().name;
           string path = Path.Combine(Application.streamingAssetsPath, scene + "_lightmap.ab");
    

    得到当前打开场景的名字:
    D:/OGL/terrain_proj-master/terrain_proj-master/Assets/StreamingAssets\race_track_lake2_lightmap.ab

    然后是www加载:

    WWW www = new WWW(path);
    yield return www;
    
     AssetBundle curBundleObj = www.assetBundle;
     TextAsset text = curBundleObj.LoadAsset<TextAsset>(scene);
     MemoryStream ms = new MemoryStream(text.bytes);
     ms.Position = 0;
     BinaryReader reader = new BinaryReader(ms);
     int cnt = reader.ReadInt32();
     string[] lmcolors = new string[cnt];
     string[] lmdirs = new string[cnt];
     LightmapData[] datas = new LightmapData[cnt];
    

    加载完毕之后取得www中的包,然后获取其中的场景信息说明文件,读到内存流中去。
    使用二进制进行读取。

    读取一个int,得到数量。
    然后是创建光照贴图的颜色数量、方向图数量、光照贴图数据数组。

    for (int i = 0; i < cnt; i++)
    {
        lmcolors[i] = reader.ReadString();
        lmdirs[i] = reader.ReadString();
        LightmapData data = new LightmapData();
        if (!string.IsNullOrEmpty(lmcolors[i]))
        {
            data.lightmapColor = curBundleObj.LoadAsset<Texture2D>(lmcolors[i]);
        }
        if (!string.IsNullOrEmpty(lmdirs[i]))
        {
            data.lightmapDir = curBundleObj.LoadAsset<Texture2D>(lmdirs[i]);
        }
        datas[i] = data;
    }
    

    对光照贴图数据进行初始化。

     lightmap_data.SetUp();
    

    它是个属性,如下:

        XLightmapData lightmap_data
        {
            get
            {
                if (_lightmap_data == null)
                {
                    _lightmap_data = GameObject.FindObjectOfType<XLightmapData>();
                }
                return _lightmap_data;
            }
        }
    

    这个类中有一个方法SetUp,是对光照贴图的属性进行设置。

    public void SetUp()
    {
    	LoadLightmap();
    
    private void LoadLightmap()
    {
         for (int i = 0; i < terrainsRendererInfo.Length; i++)
         {
             if (terrains[i] != null)
             {
                 terrains[i].lightmapScaleOffset = terrainsRendererInfo[i].lightmapOffsetScale;
                 terrains[i].lightmapIndex = terrainsRendererInfo[i].lightmapIndex;
                 Debug.Log("lightmap scale: " + terrainsRendererInfo[i].lightmapOffsetScale+" index: " + terrainsRendererInfo[i].lightmapIndex);
             }
         }
    

    遍历数组terrainsRendererInfo
    对地形的terrains[i]进行光照贴图的索引和采样位置进行设置。
    lightmapIndex标记的是使用第几个光照贴图;lightmapScaleOffset从这个光照贴图的何处采样。

    if (m_RendererInfo.Count > 0)
    {
         foreach (var item in m_RendererInfo)
         {
             item.renderer.lightmapIndex = item.lightmapIndex;
             item.renderer.lightmapScaleOffset = item.lightmapOffsetScale;
         }
     }
    

    对凡是有Render组件的物体设置其光照贴图设置。

    ok,我们回忆下刚才做的事情分为两个步骤。

    第一是从包里读取贴图数据;第二步是根据之前物体使用的光照设置进行光照采样的设置。
    再用通俗的话来说,就是加入物体A在烘焙之前,使用的是第1个光照贴图jpg1,也就是lightmapIndex = 1,采样的位置是(0,0,20,20),也就是lightmapScaleOffset=(0,0,20,20)。

    那么从包里读取贴图数据则是得到jpg1。
    有了数据之后,还需要对物体的光照信息设置包括lightmapIndex和lightmapScaleOffset,这些信息是保存的在序列化资源上的。

    一切就绪之后,最后一步则是使用:

     LightmapSettings.lightmaps = datas;
    

    使其光照贴图生效。

    LoadLightmapOffsetInfo(reader);
    

    这个就是读取每个物体使用的光照贴图的信息。

    总结这个函数的目的是,对动态物体、地形的光照信息进行读取。

    reader.Close();
    ms.Close();
    www.Dispose();
    if (finish != null) finish();
    

    读取完毕之后,就进行回调。

    下面是举例说明,光照贴图的打包与加载。

    项目在:https://gitee.com/yichichunshui/Lightingmap.git

    准备场景:

    在这里插入图片描述

    场景中的Cube、Sphere、Capsule、Plane都为静态物体。
    Directional Light为唯一一盏灯,其模式为:
    在这里插入图片描述

    ok,然后烘焙参数为:
    在这里插入图片描述

    烘焙之后的结果为:
    在这里插入图片描述

    由于选择了Directional Mode 为Directionnal,所以有一个方向贴图。

    如果场景中的物件比较多,那么颜色贴图可能会大于一个。

    观察一个烘焙之后的物体的光照属性:
    在这里插入图片描述
    如cube,它的烘焙贴图的索引为0,另外还有平铺以及缩放参数,这些都是要记录好的。否则不知道从哪个光照贴图,哪个位置采样。

    接下来就是打包处理。

    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    
    public class BuildBundle : EditorWindow
    {
        [MenuItem("Tools/BuildLightmap")]
        public static void BuildLightmap()
        {
            string inDir = Application.dataPath + "/Scenes/SampleScene";
            string outDir = Application.dataPath + "/StreamingAssets/Scenes/SampleScene";
    
            if (!Directory.Exists(inDir))
            {
                return;
            }
    
            if (!Directory.Exists(outDir))
            {
                Directory.CreateDirectory(outDir);
            }
    
            DirectoryInfo dirInfo = new DirectoryInfo(inDir);
            FileInfo[] files = dirInfo.GetFiles();
    
            AssetBundleBuild[] ab = new AssetBundleBuild[1];
            ab[0].assetBundleName = "smaplescene";
            List<string> assetNames = new List<string>();
            for (int i = 0; i < files.Length; ++i)
            {
                if (files[i].FullName.EndsWith(".meta")) continue;
                string assetName = files[i].FullName.Substring(files[i].FullName.IndexOf("Assets"));
                assetNames.Add(assetName);
            }
            ab[0].assetNames = assetNames.ToArray();
            BuildPipeline.BuildAssetBundles(outDir, ab, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
        }
    }
    

    下面就是使用这个光照贴图了:

     private void OnClickLoad()
        {
    
            Init();
            AssetBundle ab = AssetBundle.LoadFromFile(bundleRootPath + "smaplescene");
            if (ab != null)
            {
                LightmapData[] data = new LightmapData[1];
                data[0] = new LightmapData();
                Object[] objs = ab.LoadAllAssets();
                for (int i = 0; i < objs.Length; ++i)
                {
                    if (objs[i].name.Contains("dir"))
                    {
                        data[0].lightmapDir = (Texture2D)objs[i];
                    }
                    else
                    {
                        data[0].lightmapColor = (Texture2D)objs[i];
                    }
                }
    
                SetLightmapInfo();
                LightmapSettings.lightmaps = data;
            }
            else
            {
                Debug.LogError("ab is null " + bundleRootPath + "samplescene");
            }
        }
    

    这里写的不太灵活,但是大体是那么个意思。

    经过这个之后,我们发,物体并没有亮起来,原因是:
    在这里插入图片描述
    这个在删除光照贴图数据之后,光照信息就丢失了,所以我们还要能够把光照信息序列化起来。

    [Serializable]
    public class LightmapInfo
    {
        public int lightmapIndex;
        public Vector4 lightmapOffset;
    }
    
    
    public class LightmapInfoScript : MonoBehaviour
    {
        public LightmapInfo info;
    }
    
       [MenuItem("Tools/SaveLightmapInfo")]
        public static void SaveLightmapInfo()
        {
            GameObject[] gos = FindObjectsOfType(typeof(GameObject)) as GameObject[];
            for (int i = 0; i < gos.Length; ++i)
            {
                Renderer render = gos[i].GetComponent<Renderer>();
                if (render != null && gos[i].isStatic)
                {
                    LightmapInfoScript comp = gos[i].GetComponent<LightmapInfoScript>();
                    if(comp == null)
                    {
                        comp = gos[i].AddComponent<LightmapInfoScript>();
                    }
                    comp.info = new LightmapInfo();
                    comp.info.lightmapIndex = render.lightmapIndex;
                    comp.info.lightmapOffset = render.lightmapScaleOffset;
                }
            }
        }
    

    这样我们在烘焙之后,保存光照信息、打包光照数据之后,才能删除光照数据,物体记录数据之后:
    在这里插入图片描述

    在加载完光照贴图之后,还需要重新设置每个物体的光照信息:

        public void SetLightmapInfo()
        {
            GameObject[] gos = FindObjectsOfType(typeof(GameObject)) as GameObject[];
            for (int i = 0; i < gos.Length; ++i)
            {
                Renderer render = gos[i].GetComponent<Renderer>();
                //Debug.LogError("ab is  render = " + render + "   isStatic=" + gos[i].isStatic);
                if (render != null /*&& gos[i].isStatic*/) //这个注释掉因为在android手机上被标记为static竟然为false,不可思议
                {
                    LightmapInfoScript comp = gos[i].GetComponent<LightmapInfoScript>();
                    if(comp != null)
                    {
                        render.lightmapIndex = comp.info.lightmapIndex;
                        render.lightmapScaleOffset = comp.info.lightmapOffset;
                    }
                }
            }
        }
    

    最终还原出来的结果如下:
    在这里插入图片描述

    而烘焙的结果是:
    在这里插入图片描述

    不晓得问题出现在哪里,可能还有很多的小细节没有注意到,后面再补充。

    总体来说,光照信息的序列化、打包、加载、应用基本过程已经讲解完毕。

    补记:
    1、当发布到android手机上的时候,发现被标记为static的物体,其输出结果依然为false,所以像代码中一样,去除static属性判断。
    2、当发布到手机上的时候,发现加载光照贴图正常,设置索引正常,但是依然是黑色的,百度之后,发现Edit=>Project Settings=>Graphics关于Lightmap Modes改为Custom才可以正常发布。
    在这里插入图片描述
    参考:https://www.cnblogs.com/verlout/p/5734390.html

    以上是关于打包和加载一个光照贴图的方法。

    下面我们做个实验:
    1、准备一个大地形500x500的地形,然后将其分割为5x5的小地形
    2、分割后对地形进行烘焙,也就是说现在对分割后的5x5的小地形单独烘焙,观察其烘焙贴图结果
    3、使用9宫格加载周围的地形,并且加载其烘焙贴图
    4、尝试使用寻路到隔壁的地形

    在这里插入图片描述
    准备上面的地形

    分割之后:
    在这里插入图片描述

    然后,设置烘焙参数,进行烘焙。

    然后序列号每个小地形上的光照贴图索引和偏移。

    打包这些烘焙的贴图。

    展开全文
  • 怎么在Unity2019中烘焙lightmap

    千次阅读 多人点赞 2019-08-16 13:57:41
    本文将就如何在Unity2019中烘焙lightmap的话题,以实例的方式与网友展开讨论,相关实例截图如下: 干活! ● Unity日景烘焙 首先小姐姐以著名的斯蓬扎宫模型场景为例,和大家一起探讨一下正午时分的光影布光方法及...

    本文将就如何在Unity2019中烘焙lightmap的话题,以实例的方式与网友展开讨论,相关实例截图如下:
    在这里插入图片描述

    干活!

    ● Unity日景烘焙

    首先小姐姐以著名的斯蓬扎宫模型场景为例,和大家一起探讨一下正午时分的光影布光方法及烘焙过程。3dMax模型情况如下图所示(由图可见,模型的面数为6万多(见截图左上角),模型一定要采用精简的单面建模,否则这个场景的面数会多达几百万,甚至上千万的面,如此多的面数,Unity是吃不消的,无论烘焙过程的展UV,还是烘焙,甚至烘焙之后的场景运行,都会陷入无休止的等待、假死机和卡顿状态,毕竟烘焙之后也会个场景带来一些负载,而且最终作品要在用户机器或手机上运行,所以从模型的面数方面,必须充分考虑给场景留出足够的裕度)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    1. 模型导出
    无论你用3dMax、Maya、C4D、Blender或Sketchup建的模型,建议都以fbx格式导出,因为Unity3d对fbx格式兼容的最好,这也是官方的建议,导出时一定要勾选“EmbedMedia”(嵌入媒体),否则在导入Unity时会成为无贴图的“裸模”
    在这里插入图片描述
    2. 模型导入Unity

    ⑴ 在导入模型前,按下图所示,勾选掉Unity3d的“Auto Generate”(自动烘焙)选项,好多人一打开Unity3d,不知道怎么啦,总感觉系统处于运算状态,就是因为Unity默认这个选项是勾选的,当导入模型后,什么还没做,就一直陷入莫名的忙机,也是这个原因,所以导入前取消这个选项。
    在这里插入图片描述
    在这里插入图片描述
    ⑵ 按下图所示将刚才从3d软件导出的FBX模型拖入Unity3d的Assets文件夹,2017版之后,可能出于别的考虑,Unity不再直接导入材质和贴图,所以很多人发现模型导入后总是无材质和贴图的裸模,这里还需要做一点设置,看下一步。
    在这里插入图片描述
    在这里插入图片描述
    ⑶ 选中刚导入的FBX模型,点击inspector面板的Materails按钮,我们发现下面的所有材质都显示“none”,这就是裸模的根源,有童鞋说,前面不是说导出FBX时不勾选“Embedmedia”选项,就会出现裸模,这都勾选了,怎么还是裸模呢?这里需要说一下,如果前面不勾选,这里一定是裸模,但是,勾选之后,还需要一点点设置,否则依然会裸模,也就是前面和现在的设置缺一不可。
    在这里插入图片描述

    ⑷ 继续,此时拉开“location”后面的下拉框,将设置改为第一项,也就是“use external materails(legacy)”,意思是使用外部材质,如下图所示:
    在这里插入图片描述

    ⑸ 接下来还需要将“naming”后面的下拉框改为“from model‘s materails’”,如下图所示,意思是贴图名称取自模型材质,然后点击下面第二张图中所示的“apply”(应用)按钮,这时unity就稀里哗啦地将所有材质和贴图真正导入Unity。
    在这里插入图片描述
    在这里插入图片描述
    ⑹ 导入材质和贴图后,unity的assets文件夹中会多出“materails”和与FBX同名的后缀为".fbm"的两个文件夹,一个存放的是材质,一个用来存放贴图,如下图所示。
    在这里插入图片描述
    ⑺ 接下来将assets中的FBX模型拖入“Herarcy(层级面板)”,此时我们可以看到,FBX模型连同材质和贴图被完美地导入了Unity,如下图所示。
    在这里插入图片描述
    到此模型导入完毕,从下面的图可以看到,在unity3d默认灯光的照射下,场景看起来很苍白,没有一点层次,你的作品功能再强大,场景没有出色的视觉美感,所有功夫全白费,受众是不能接受这样的作品,这就是烘焙的重要意义!考虑到一些童鞋导入模型都成问题,所以前面啰嗦了一堆,熟悉的童鞋可以跳过。接下来就进入unity3d烘焙的正题。
    在这里插入图片描述
    在这里插入图片描述
    3. Unity3d场景布光及光照参数设置

    无论是游戏,还是VR场景,烘焙前首先要做的事是灯光的布设,因为烘焙的主要任务是渲染灯光的光影效果,没有灯光,烘焙也就无从谈起。unity3d的布光原则,和其他3D软件并无二样,也就是要根据所要表现的意境和气氛来决定如何打灯。一开始我们就说要烘焙正午时分的场景,下面我们就按正午时刻的光照来布设灯光。大家都知道,正午时分,阳光明媚,光照明暗分明,太阳光近乎垂直投射,但是,这个场景只有顶部一个可进光的开口,其他部分都是密闭的,表现正午的气氛,如果灯光垂直向下投射,阴影会与场景物体重合,所以我们不能垂直打灯,因此将灯光调至与地面夹角大约60-80度,合理的灯光布设是场景光影出彩和营造气氛的先决条件,不同的时间段,灯光角度不同。

    ⑴ 下面我们用平行光来模拟太阳光,作为主光源(照亮场景的主要光源)照亮场景的部分区域(也就是迎光面),产生光斑,与此同时,在其他区域产生阴影。照亮区和阴影区必须形成强烈的反差,才能显示出阳光的明媚,很多人烘焙的场景平淡,就是因为明暗对比不强烈,该亮的不亮,该暗的不暗。非洲人之所以看起来牙齿很白,是因为黑色脸部的衬托所致,因此要表现优秀的阳光效果,光照明暗反差要大,但暗区也不能死黑一片。Unity一创建新的场景,就默认为我们创建了一盏平行光,现在我们将其调至如下图所示的投射角度,既要考虑让一二层都有阳光投射的痕迹,又不至于灯光垂直入射。
    在这里插入图片描述
    ⑵ 接下来选中平行光(Directional Light),将inspector面板中的灯光强度(intensity)调至2,如下图所示,默认值是1,很多人马上说灯光已经曝光了,但必须调大,因为我们最终要的是烘焙光照,不是实时光照,现在只是实时光照曝光了,因为烘焙光照的算法和实时光照不同,不调大,烘焙后阳光不够强烈。另外,顺便将灯光的模式“Mode”改为“baked(烘焙模式)”,如下面第二张图所示。其他值
    在这里插入图片描述
    在这里插入图片描述
    ⑶ 主光源设定之后,我们还需要考虑阴影区域的照亮,虽然阴暗区相对照亮区较暗,但也不能有伸手不见五指的感觉,正午阳光充足的时候,在强光的照射对比下,阴影区会显得比较暗,但物体还是能看清,而且有层次感的,这主要是天光的贡献,因此我们需要开启Unity的天光作为辅助光源来照亮阴暗区域,与此同时,主光源照射到迎光面后,反射到周围的物体上,这些物体又作为二次光源照亮其他物体,多次反弹后到达阴暗区,也起到光照的作用,因此,这个场景的辅助光源除了天光,还有主光源-太阳光多次反弹光,或者说两者的综合效果作为辅助光,共同照亮阴影区。现在我们打开光照面板,点击window/lingting/settings,如下图所示,弹出光照面板,然后按下面第二张图所示,将光照面板的标签拖至inspector面板标签之后,使其和inspector面板并排,这样节省屏幕空间,如下面第三张图所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ⑶ 接下来将光照面板(Lighting)下场景(Scene)标签中的环境反射(Environment Reflections)的反弹次数改为5,这个值越大,光线会充分传递到阴暗区,亮度越亮,但亮度不会超过照亮区。然后将实时光照(RealTime Lighting)下实时全局光照(RealTime Global ILLumination)后的复选框取消勾选,也就只进行烘焙全局光照计算。接着将混合光照(Mixed Lighting)的光照模式(Lighting Mode)后的下拉框中的选项改为烘焙间接光(Baked Indirect),最后再将光照贴图设置(Lightmapping Setings)下的光照运算器(Lightmaper)后的下拉框选项改为渐进式(Progressive),如下图所示。还需要勾选环境遮蔽(Ambient Occlusion),也就是AO,如下第二张图所示,这个选项会在物体或物体间内转角或内转折处产生软阴影,例如墙内凹角,对于表现细节很有帮助。至此场景的辅助光和光照参数就设好了。
    在这里插入图片描述
    在这里插入图片描述
    4. 烘焙模型设置

    做完以上的设置之后,还需要对模型进行必要的设置。选中层级面板中所有需要烘焙的模型物体,勾选Inspector面板右上角的Static,将所有物体设定为静态,如下图所示,否则烘焙之后没有阴影和任何效果,切记!然后在assets面板中,选中导入的所有FBX模型,勾选inspector面板模型(model)下的创建光照贴图坐标(Generate Lightmap UVs)复选框,如下第二张图所示,否则烘焙后,模型会遍布黑斑,其实是光照图错乱,因为没有贴图坐标,光照图不知道怎么贴。
    在这里插入图片描述
    在这里插入图片描述
    5. 烘焙

    完成上面的设置,就可以进行场景烘焙了。点击下图所示的“Generate Lighting(生成光照)”按钮,即可开始光照烘焙
    在这里插入图片描述
    说明:最近Unity2019版的正式版发布,由于一直在测试破版的稳定性,所以到现在才更新,请童鞋们谅解!下面就改用2019版来和大家继续探讨Unity3d的光照烘焙。

    接上面的步骤,烘焙完成共耗时7.5分钟,且无任何报错提示,如下图所示:
    在这里插入图片描述
    下面从不同角度来看看烘焙的效果,由下列截图可见,烘焙成果非常干净,未见很多童鞋所说的黑斑、白斑、麻点、漏光、漏阴影、撕裂、破面、硬边等现象,而且烘焙速度非常快。一般情况下,最终的正式渲染烘焙,很多人都得1,2个小时,大部分没经验的童鞋,得5,6个小时,甚至几十个小时,还有的童鞋陷入了无休止的死机状态。无论质量好坏,有的童鞋想看一眼效果,一时半会都看不到,搞得非常心塞。前面说过,我们此次的目标是烘焙正午时分的光照效果,大家看看有没有正午的效果?小姐姐个人认为,整个场景明暗对比强烈,阴暗区域虽然很暗,但是层次还是很清晰的。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    我们再来看看细节效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下面我们用视频看看烘焙的效果

    6. 没经验的初学者烘焙的情况

    初学者或者没经验的童鞋,将烘焙参数设的稍高一些,即如下图所示,将”Bounce(反弹次数)“设为4,Lightmap Resolution(光照贴图分辨率)”设为20,“Lightmap Size(光照贴图尺度)”设为2048,烘焙时屏幕右下角的ETA(剩余时间,也就是烘焙完成需要的时间)一开始显示为3个多小时,然后不断增加,甚至几十个小时,经历漫长的等待之后,直接心理奔溃,明明做个简单的例子烘焙挺快的,为什么一到实际项目就让人这么心塞呢?
    在这里插入图片描述
    这些童鞋不甘心,又降低烘焙参数,如下图所示,将”Bounce(反弹次数)“设为1,Lightmap Resolution(光照贴图分辨率)”设为10,“Lightmap Size(光照贴图尺度)”设为2048,烘焙时屏幕右下角的ETA(剩余时间)为1个多小时,同时状态栏提示“There are 5 objects in scene with overlapping UV’s…(场景中有5个物体UV坐标重叠)
    在这里插入图片描述
    烘焙的结果惨不忍睹,劣迹斑斑,仿若火灾之后的情景,如下图所示,
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    童鞋们常见的烘焙缺陷就不再一一列举了,那么为什么小姐姐使用很高的烘焙参数,完成高品质烘焙只用了7.5分钟,而童鞋们使用稍高点的参数就陷入了无休止的假死机?甚至把参数降得很低,烘焙都比小姐姐花费的时间多的多,而且烘焙的质量还非常差呢?对于小姐姐不到8分钟的高品质渲染烘焙时长,很多童鞋有点大跌眼镜,似乎不大相信,因为自己从来就没有在几分钟内完成一个场景的烘焙,而且还需要一次又一次的反复测试,每次都有各种问题,一出现问题,就一头雾水,不知道如何排除,即使等待漫长的时间有了结果,也是黑斑、白斑、漏光、漏阴影、破面、亮边、硬边等现象严重,搞得都失去了信心,下面就烘焙超慢以及烘焙过程出现的问题分别进行深度分析,仅为小姐姐个人的观点,请高手砖拍。

    7. 烘焙渲染超级缓慢的原因分析及解决方案

    ⑴ 模型面数超高是Unity3d烘焙超慢的罪魁祸首

    大家都知道,光照烘焙的实质是将模型的每个面上所受光照渲染到其展开的对应UV区块上的过程,大家可以自己试验一下,在自己熟悉的3D软件中创建一个简单的立方体和一个面模型,然后导入Unity3d进行烘焙,速度会非常快,但是当复制10万个立方体,再导入Unity3d烘焙的时候,速度就非常慢,由这个简单的例子可以得出结论,模型的面数越多,烘焙所消耗的时间越长,所以降低模型面数是加速烘焙的首选方案,换言之,模型面数超高是造成Unity光影烘焙缓慢的主要原因,也就是在保证模型外观不变的情况下,应尽可能地降低模型面数。

    很多童鞋之前从事效果图或3D动画,转入VR之后,仍然沿用效果图和动画的建模习惯,将每个面建的很精细,很光滑,即使模型规模再大都不用担心,因为这些童鞋的机器配置都很高,但是VR不同于效果图和动画,效果图和动画最终作品只需给用户提交几张图片或视频(图片序列),而VR最终作品是要给用户提交一个能够在配置不高的用户机或手机上实时运行的3D场景文件,所以制作VR或游戏作品,无论你的机器配置多高,都应尽可能优化场景模型面数。模型面数不仅影响烘焙速度和质量,同时也影响最终作品的实时运行效率。

    简单地说,VR和游戏建模,应放弃传统的实体建模习惯,改用精简的低面数最优化单面建模方法,也就是poly(多边形)建模,这样才能有效降低模型面数。对于使用3dmax建模的童鞋,如果不会使用单面建模,可参看小姐姐编制的“基于Unity3d的3dMax低面数精简单面建模实战视频教程”,希望小姐姐的教程对一些童鞋大幅降低模型面数有所帮助。具体如何构建模型,就不赘述了,这里只给出一些原则,也就是在保证模型外观的前提下,应尽可能降低曲面光弧度(段数),一些细节采用贴图来表现,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    有些童鞋认为曲面精度太低,看起来太粗糙,大家看看上两图所在位置经过烘焙后的效果,由图可见,虽然降低了曲面精度(光滑度),烘焙后并不失真。
    在这里插入图片描述
    在这里插入图片描述
    另外对于护栏、铁艺、女儿墙之类比较费面的模型,可采用镂空贴图来表现。踏步较多时,也可采用贴图表现,门窗之类也用贴图,这样就可以大幅度降低模型面,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ⑵ 模型交叉也是导致烘焙渲染超级缓慢不容忽视的因素
    有的童鞋非常偏执,不愿意用单面建模方法,说自己的模型面数并不高,可渲染烘焙还是很慢,原因是他的场景中有很多下图所示的模型交叉(或穿插)结构,烘焙时会计算图中所示的2处阴影和AO,大家都知道,烘焙的过程中阴影计算是最耗时的,不合理的建模,会让系统花大量时间计算无意义的阴影,如果采用单面建模方法改造成如下第二张图所示的结构,只需计算一处的阴影,如果类似的这种交叉结构在场景中大量存在,烘焙肯定会很缓慢。而在改成单面模型后,烘焙会大幅加速
    在这里插入图片描述
    在这里插入图片描述
    ⑶ 面重叠(Overlapped faces)也是导致烘焙渲染缓慢的重要因素

    一些童鞋确实使用poly单面建模构建的场景,但是由于疏忽或误操作,一些顶点未被焊合,或其他原因,造成很多重叠的面,从外观上看,都是单个的面,而实际在这些面的后面重叠了好多面,这些面在烘焙渲染过程中,都会被展开,并要一一被烘焙,而实际后面重叠的面都毫无意义,白白花费了很长时间在烘焙无用的东西,所以建模完成后,应排查重叠面和重叠的顶点。关于重叠面后面会进行图解。

    ⑷ 不合理的lightmap UV布局将大幅增加烘焙渲染时间

    由于Unity3d自带的lightmap UV’s拆分(展开)算法的硬伤,在指定的UV尺度下,物体的光照UV常常集聚在一张lightmap的局部区域,使大量的UV空间白白浪费,如下图所示。为了增大UV所占的比例,很多童鞋通过增加下面第二张图中的“Scale in Lightmap”参数反复测试,时间都花在了一次又一次的测试中,少则几个小时,多则几天,得不偿失。而且当增加“Scale in Lightmap”参数时,原来一些UV区块又相应缩小,为了让所有的UV区块都增大,每个物体的“Scale in Lightmap”都得增加,此时烘焙时间成倍剧增。原本想让所有UV区块占满一张lightmap,可是unity并不听使唤,不仅没有充分利用lightmap有效空间,而且又增加了lightmap的数量,每张lightmap和刚才那个lightmap一样,都浪费很多UV空间。经过多次长时间的烘焙测试后,烘焙缺陷虽然消除了,可lighmap所消耗的内存空间惊人,这给作品后续的实时运行增加了很大负担。因此不合理lightmap UV布局也是导致烘焙缓慢的重要因素。所以小姐姐强烈建议不要使用Unity3d自带的Lightmap UVs展平功能,也就是不要勾选下面第三张图中的“Generate Lightmap UVs(自动展平Lightmap UV坐标)”,不勾选这个选项则系统会利用建模软件中拆分(展平)的通道2中的UV坐标。这个数据保存在FBX文件中,Unity3d是可以识别的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    8. 影响烘焙渲染质量的因素分析及解决方案

    前面我们一起讨论了造成烘焙渲染缓慢的原因和解决方案,下面我们继续剖析造成很多烘焙缺陷原因及解决方案,前面所讨论的渲染烘焙缓慢的原因也是造成各种烘焙缺陷的根源,接下来我们逐一进行分析。

    ⑴ 模型面数超高是影响烘焙质量的重要因素

    有耐心的童鞋,硬着头皮等待了很长时间,烘焙完了整个场景,结果却发现到处是黑斑、亮斑、硬边、漏光、漏阴影、破面、撕裂、亮面、黑面等缺陷,整个场景看上去很脏,一下就懵圈了,全然不知如何解决。根据小姐姐个人经验,要解决上述的烘焙缺陷,首要问题应该降低模型面数,也就是在保证模型外观情况下,尽可能使用较少的面来构建场景。大家可以试想一下,两个一样的模型,一个面数很高,另一个面数很低,当他们被拆分(展平)在相同分辨率的lightmap UV贴图坐标中时,相对于低面模型来说,高面模型的每个面只有缩得很小才能被容纳在这个lightmap中,当某些面小到不足以表现这些面所受的光照的细节时,偏暗的像素就会积聚成黑块,偏亮的像素就会集聚成白块。进而当这些lightmap包裹到对应的模型面上时,就出现了黑斑或白斑,如下图所示。而低面模型相对高面模型来说,在相同分辨率的lightmap中,每个面所占的比例就大的多,足以表现每个面所受的光照的细节,因此烘焙的结果清晰、干净。

    大家继续来看下面第二张图,一些面原本需要在下面左图所示的大小的UV区块上来表现光照,但由于模型面数太多,Unity3d展平UV后,自动分配给这些面的实际UV区块,只有中间图所示的大小,烘焙完成后,这些面对应的光照图要包裹到1:1的模型面上,需要放大很多倍。大家都知道,当一个很小的图被放大很多倍时,Unity会以插值法来弥补像素,弥补的像素RGB值是原本相邻的两个像素RGB的平均值,即右图所示的结果,当这张图的“色带”的分界线贴在某个面上时,就出现常见的“硬边”缺陷,当深色的“条带”贴在某个面上时,就出现了常见的“黑面”缺陷,同理,当浅色的“条带”贴在某个面上时,就出现了常见的“亮面”缺陷。总之,如果不采用精简的低面数最优化单面建模,而使用传统的实体建模方法,模型面数会很高,烘焙时,不仅耗时,而且会出现各种各样的缺陷。在这里插入图片描述在这里插入图片描述
    ⑵ 面重叠也是影响烘焙质量不可忽视的因素

    面重叠对烘焙质量的影响比较隐蔽,常常被很多人忽视,甚至有些童鞋压根就不知道面重叠会影响烘焙质量,但它对烘焙质量的影响确实不容忽视。为了让童鞋们了解什么是面重叠,我们还是以前面烘焙的场景为例进行图解,小姐姐将这个场景的poly合并成了3层和一组配饰模型,分别为1_F、2_F、3_F,为了方便大家搞清关系,小姐姐将模型拉开显示了,如下图所示:
    在这里插入图片描述
    这里我们先不解释什么是面重叠,而是先讨论如何检测面重叠,对于使用3dmax建模的童鞋,可以按照下图所示的步骤打开面重叠检测功能。
    在这里插入图片描述
    打开之后,屏幕显示如下图所示的信息,其中“Overlapping Faces:”的意思是重叠面的数量,因为刚打开,没有选择物体,所以后面显示“Not Applicable(不适用)”。“Click here to Configure”意思是点击这儿来配置相距多远算作重叠,一般设为0.0001,也就是相距很近很近。“Click to Update”意思是点击这儿来更新,当选择物体后,点击这个按钮来显示重叠面的数量。
    在这里插入图片描述
    下面我们就以3_F,也就是三层的模型为例来检测重叠的面,首先点击“点击这儿来配置”,设置间距为0.0001视为重叠,如下图所示:
    在这里插入图片描述
    接下来在场景中选择3_F,然后点击“Click here to Update”,此时“Overlapping Faces”的数量显示为16,也就是3_F中有16个面重叠,如下图所示。
    在这里插入图片描述
    接下来我们看看到底面是怎么重叠的,按Alt+Q隔离3_F,旋转视图观察,没有发现重叠面提示,有时候确实很难发现重叠的面,但是大家都知道,面的重合,必然伴随着顶点的重合,所以我们将面重叠改成顶点重叠检测,按下图所示的图示步骤打开顶点检测功能。
    在这里插入图片描述
    和前边面重叠检测的操作一样,配置间距容差为0.0001,然后点击“Click here to Update”,屏幕信息显示38个顶点重合,如下图所示。
    在这里插入图片描述
    与此同时,场景中显示很多绿色顶点,这些绿色的点就是重叠的38个顶点,现在我们就来看看这些绿色的顶点到底是什么回事,要选择和编辑顶点,我们得进入poly的顶点层级,然后选择一个绿色的顶点,旋转视图观察,如下图所示
    在这里插入图片描述
    将选中的这个绿色顶点沿y轴向后移动,得到如下图所示的结果,至此,小姐姐就不用解释什么是面重叠了,从下图中可见,确实在这点处有面重叠。
    在这里插入图片描述
    移除这个顶点,或者和刚才位置的顶点焊合,然后再次检测顶点重叠和面重叠,重叠的顶点数和重叠的面数分别降低为36和14,如下图所示。
    在这里插入图片描述
    由此可见,通过移除或焊合,可消除顶点重叠或面重叠,以此类推,可消除所有重叠的顶点和重叠的面。
    通过以上的图解,大家已经知道如何找到重叠的面和重叠的顶点,以及如何消除重叠面和重叠的顶点,同时也了解了什么是面重叠和顶点重叠,那么到底面重叠对Unity3d的光影烘焙质量有什么影响呢?下面我们就一起来讨论一下。

    前面我们已经讨论过模型面数超高对Unity3烘焙质量的影响,而且得到结论,面数太高,会导致所有面展平后在lightmap中所占的比例大幅减小,进而使烘焙后出现各种各样的缺陷,面重叠和模型面数超高一样,展平后,那些重叠在有效面后面、对场景造型没有任何贡献的毫无意义的多余面也会挤占有效面的UV空间,使得有效面在lightmap中的比例缩小,所以必须清除重叠面。重叠面不仅对场景造型没有任何贡献,而且展平后还会为渲染烘焙这些毫无意义的面消耗很长的时间,同时因为挤占了有效面的lightmap的UV空间,使得有效面的UV空间相应减小,从而导致前面所述的各种烘焙缺陷,所以要加速烘焙、提高烘焙质量,清除重叠面是不容忽视的。对于使用Cinema4D和Maya建模的童鞋,都可以在自己习惯的建模软件中找到检测重叠面的功能,大家可自己去尝试,这里就不一一赘述了。

    ⑶ lightmap UV布局也是影响Unity3d烘焙质量最重要的因素

    虽然降低模型面数、消除面重叠都会加速烘焙渲染和提高烘焙质量,但是如果有效面的Lightmap UV的布局如果不合理,最终的烘焙依然会很耗时、烘焙质量依然会很差。那么什么叫Lightmap UV布局不合理呢?一方面是Lightmap UV没有充分利用lightmap UV空间,所有UV区块集聚在lightmap UV的某一部分,使大量的UV空间都白白浪费。另一方面就是Lightmap UV的布局因根据面的大小调整对应UV区块的比例,使得lightmap在所有物体上均匀分布,这个可能有些童鞋不大理解,这么来说吧,所谓的不均匀,就是光照图在一些物体的某些面很清晰,而在另一些面很模糊,大家在贴材质时经常会遇到,贴图在物体不同面上的大小不同,这就是贴图的UV分布不均匀造成的,和这个道理一样,lightmap UV的布局也应考虑均匀分布,为了消除烘焙缺陷,如果极端地使用每个物体的“Scale in Lightmap”来调整物体的UV比例,是无法做到Lightmap UV的均匀分布的。

    如下图所示的Lightmap UV布局使得所有UV区块都聚集到了这个ligtmap UV的左下角,这使得所有面在整个lightmap UV中所占的比例都很小,导致有些面所受的光影效果无法充分表现而造成最终的烘焙缺陷,同时为了消除烘焙缺陷,只能定性地增大“Scale in Lightmap”这个参数反复测试,无法精确控制UV的布局,而且随着每个物体“Scale in Lightmap”参数的增加,烘焙渲染越来越慢,因此小姐姐个人认为,Unity3d的lightmap UVs展平功能有致命的缺陷,所以强烈建议童鞋们使用自己习惯的3D建模软件来展平lighmap UV,例如3dMax、Maya、C4D等。在这里插入图片描述
    下图是小姐姐在3dmax中展平的前面烘焙的案例场景的lightmap UV,从下图可见,四张lightmap的UV布局充分利用了UV空间,没有像Unity3的展平那样,全部集聚在某一局部,而是均匀地分布在整个lightmap UV空间中,同时所有面的UV大小也是均匀分布的,烘焙后不会出现lightmap局部清晰或模糊现象。更不会出现任何烘焙缺陷。
    在这里插入图片描述
    下图是将在3dmax中展平的lightmap 导入Unity3d,并经高质量烘焙后得到的光影图,由图可见,Unity3d老老实实地按照3max展平的UV高质量地烘焙出了整个场景的光照图。一气呵成,无任何缺陷,且总共用时7.5分钟。从前面的截图大家都已经看到,整个场景没有任何烘焙缺陷,而且光影图非常清晰,明暗层次分明。

    在这里插入图片描述
    由以上的图解可见,lightmap UV的布局,的确会影响着烘焙的质量,也就是合理的UV布局,不仅会加速烘焙,而且可以提高烘焙质量,不合理的UV布局,不仅会导致烘焙缓慢,而且很难保证烘焙质量。
    正是小姐姐在模型阶段采用了3dmax最优化低面数精简建模方法构建的整个场景,并在3d中排除了所有的重叠面,同时在3d中合理地拆分(展平)了lightmap UV,所以在Unity3d中仅用了7.5分钟就快速高质量地烘焙出了整个场景。当然,一些童鞋会说,自己烘焙一些实例,也是几分钟完成了,也没什么烘焙缺陷,那是因为你所用的案例模型都是很简单的,并且经过优化处理的,当然烘焙很快,而且没有任何问题,但是一换成实际的项目场景,立即就卡住不动了,少则几个小时,多则几天烘焙不出来。所以只要按照小姐姐上述的方法,可在几分钟内快速完成实际项目的烘焙渲染。当然其中会涉及到一些经验。

    9. 分步/分批次烘焙渲染

    一些童鞋的机器可能配置太低,整个场景一键烘焙可能吃不消,或者烘焙太慢,此时可以分步烘焙渲染,也就是一次烘焙一个或一组物体。有时只有某些物体有烘焙缺陷,通过分步/分批次烘焙,可避免无缺陷物体的重复烘焙时间。下图所示为单独烘焙1层的情况下,仅用时2分多钟。依照这样的方法,然后分别选择2层、3层进行单独烘焙,每次只选择一个或一组物体来烘焙,前面已经烘焙完成的物体不会受影响,这样不仅会减轻一次烘焙的机器负载,而且避开了一些物体的重复烘焙,尤其是当某个物体烘焙出现问题的时候,可将排查范围锁定在所选择的物体内。对于机器配置较低的童鞋,无需再为升级硬件支付额外的成本,这个功能是小姐姐个人的一些经验所得。在这里插入图片描述
    10. 烘焙渲染分类

    烘焙渲染根据灯光和物体的状态可分为静态灯光下静态物体的烘焙、静态灯光下动态物体的烘焙、动态灯光下静态物体的烘焙、动态灯光下动态物体的烘焙四种。对于早先从事3D动画的童鞋,肯定不理解为什么要有这四种分类呢,因为动画只需将场景中的所有物体渲染成图片序列(视频),终端用户只需要播放就可以了,而VR和游戏是需要用户和场景进行交互操作的,两者的机理有本质的区别,作为VR和游戏的开发程序,Unity自然有自己独特的烘焙渲染方式。下面我们就这四种烘焙渲染方法一一展开讨论,为了简化问题,我们设定一个比较简单的场景,如下图所示:
    在这里插入图片描述
    ⑴ 静态灯光下静态物体的烘焙

    前面我们讨论的斯蓬扎宫的烘焙就是静态灯光下静态物体烘焙的典型实例。之所以称之为“静态灯光下静态物体的烘焙”,是因为除相机外,灯光的状态(位置、方位角、颜色、强度等)以及物体的状态(位置、方位角、比例、材质等)相对时间恒定不变,简单地说,就是灯光和物体的状态不随时间变化。这种烘焙的设置前面提到过,这里我们再讨论一下,其设置如下图,即第一步先将产生阴影的主光源的灯光模式(Mode)设定为“baked(烘焙模式)”。第二步将需要烘焙的物体设定为“Static(静态)”,如果不设定为静态,烘焙之后没有任何效果。第三步将lighting(光照)面板中Realtime Lighting(实时光照)下的Realtime Global ILLumination(实时全局照明)选项取消勾选,保留Mixed Lighting(混合照明)下的Baked Global ILLumination(烘焙全局照明)选项的勾选。然后进行必要的其他设置,烘焙上面的场景就得到上图的静态灯光下静态物体的烘焙效果。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这种烘焙方式在烘焙完成后,所有直接光照和全局光照完全被转移到光照贴图中,此时无论如何调整灯光(灯光强度、灯光颜色、灯光角度),甚至将灯光模式改为mixed或realtime,或者勾选"realtime Global Illumination",都对场景无任何影响,也就是说,这种方式烘焙的场景,运行时灯光是不能改变的(如下图所示),大家可以自己试一试。
    在这里插入图片描述
    有童鞋可能会问,这种烘焙方式,场景中是不是不能有运动物体,当然不是啦,只是运动物体就像被烘焙忽略一样,没有任何光影效果而已,但运动在场景中是存在的,并且保持着原有的运动效果,简单地说,这种烘焙方式不适合有运动物体的场景。

    下面是“斯蓬扎宫”应用这种方式烘焙的正午时分的截图,其效果可以与Vray的渲染效果媲美,当然这需要一些经验。
    在这里插入图片描述

    本想用视频向大家展示这种烘焙运行时的效果,折腾了好多天,可是这里不支持链接视频,而且Gif动态图像有5M限制,所以没法在这里给大家展示,要看这种方式烘焙的场景运行时的效果,可以去http://v2-restudy.com/custom/1455.html看视频。

    ⑵ 静态灯光下动态物体的烘焙

    这种方式适合灯光静止且有运动物体的场景(如马路上行驶汽车的城市场景)。为了演示静态灯光下动态物体的烘焙,我们在上面的场景中,添加一个Cube(立方体),用它来代替运动的物体,它可能是一辆汽车、一个角色,或者是其他的运动物体,总之,为了简化,这里用一个运动的立方体来表示,位置如下图所示,按照前面的概念,要烘焙这个立方体,也得勾选“Static”,否则烘焙后没有效果。所以选中这个立方体,然后勾选“Static”,设定这个立方体为静态(运动的物体是不该设为静态的),然后重新烘焙整个场景。
    在这里插入图片描述
    下面用一个Gif动态图像来看看整个场景烘焙后的情况:
    在这里插入图片描述
    由上图可见,立方体的烘焙是错误的:1. 立方体投射的阴影没有跟随立方体运动;2. 立方体所接受的阴影没有变化;3. 立方体进入暗区和亮区光照没有变化。

    由此可见,除了相机,如果场景中有运动的物体,不适合使用静态灯光下静态物体的烘焙方式,而应改用“静态灯光下动态物体的烘焙”方式,具体步骤如下:首先将运动物体解除“Static”设定,或者说,运动物体不要勾选“Static”选项;接下来将主光源的灯光模式(Mode)设定为Mixed(混合)模式;然后将lighting(光照)面板中Realtime Lighting(实时光照)下的Realtime Global ILLumination(实时全局照明)选项取消勾选,保留Mixed Lighting(混合照明)下的Baked Global ILLumination(烘焙全局照明)选项的勾选。最后将Mixed Lighting(混合照明)下的Lighting Mode(光照模式)改为“Shadowmask(阴影遮罩)”,这样实时光照的阴影就可以和烘焙阴影很好地融为一体(这里特别说明一下,所谓实时光照的阴影和烘焙阴影融为一体,是指两者阴影的亮度一模一样)。有些童鞋想用3dmax、C4D或Maya自带的烘焙模块来为Unity3d烘焙场景,对于静态灯光下静态物体的烘焙,这是完全可以的,但是一旦有运动物体,就要用到实时光照,此时实时灯光的实时阴影亮度很难做到与其他3D软件中烘焙的阴影亮度完全一样,当两者重叠在一起时,实时阴影很暗,看上去就像挖了一个黑洞一样的感觉,这个大家自己去试试就知道了,有了这样的尝试之后,大家就理解什么叫“实时光照的阴影和烘焙阴影融为一体”的概念了,如果用其他3D软件来烘焙,导入Unity3d后,阴影很难融为一体,所以建议大家不要使用其他3d软件来烘焙Unity3d场景,免得白白浪费时间。

    Unity静态灯光下动态物体的烘焙设置步骤如下四图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    最后还需要为运动物体设定“Light Probe Group(光探测器组)”,用来收集运动物体可能到达处的环境光照信息,以保证运动物体在不同位置的正确光照。也就是在Heirarchy面板的空白处右键点击,在弹出的菜单中点击light下的“Light Probe Group(光探测器组)”,场景中就会出现带有四个顶点的立方体网格,这就是光探测器。具体步骤图解如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下图为调整光探测器的过程,其中需要不停地选择和使用“Duplicate Selected(复制选择的)”命令,然后移动顶点,最终让光探测器的顶点密布运动物体的运动范围,范围比实际要大些。
    在这里插入图片描述
    光探测器器布置好后,清除之前烘焙的数据(Clear Baked Data),然后重新烘焙(Generate Lighting),如下图所示:
    在这里插入图片描述
    重新烘焙后得到如下图所示的结果,由图可见,运动物体的光影这回正确了。
    在这里插入图片描述
    这种烘焙完成后,改变灯光的光强度、颜色或角度以及运动物体的状态,场景会相应变化,简单地说,这种方式烘焙完成的场景,运行时可以改变灯光和运动物体的状态(但运动物体必须在光探测器组范围之内),如下图所示:
    在这里插入图片描述
    有童鞋马上会问,不是在说静态灯光下动态物体的烘焙嘛,灯光能改变,就不是静态灯光了,是的,之所以演示这种烘焙后灯光可以改变,是因为在实际应用中,肯定有童鞋会发现这个现象,但是还是建议这种烘焙后不要改变灯光,因为会发生一些怪异的现象,比如,场景中会出现双光斑和颜色不一致,具体大家自己可以去尝试,正是因为这个原因,所以小姐姐把这种方式归类到静态灯光之列,用于静态灯光下静态物体的烘焙,并在运行时不要改变灯光。

    下面是应用这种方式烘焙的“斯蓬扎宫”的截图,要浏览这种方式烘焙的场景运行时的效果,可以去前面的网址看视频。
    在这里插入图片描述
    ⑶ 动态灯光下静态物体的烘焙

    如果灯光在运行时需要改变且场景中无运动物体(如窗帘慢慢拉开时阳光投逐渐射进室内的照明、涵洞中的油灯照明等),就需要使用这种方式来烘焙。这种烘焙方式的设置如下图所示:
    在这里插入图片描述
    下图是这种方式烘焙的效果及烘焙后改变灯光状态时场景的变化情况,由图可见,这种方式烘焙的场景在运行时可改变灯光。在这里插入图片描述
    下图是应用这种方式烘焙的“斯蓬扎宫”的两张截图,要浏览这种方式烘焙的场景运行时的效果,可以去前面的网址看视频。在这里插入图片描述
    在这里插入图片描述
    ⑷ 动态灯光下动态物体的烘焙

    对于灯光在运行时需要改变且有运动物体的场景用这种方式来烘焙,设置方法与动态灯光下静态物体的烘焙设置相同,如下图所示,所不同的是,需要为运动物体设定光探测器组,方法同静态灯光下动态物体烘焙中的光探测器组的设定,这种方式烘焙的效果如下图所示。
    在这里插入图片描述
    这种方式烘焙的场景在运行时灯光也可改变,详见上一方式中的动态Gif图。

    下面是这种方式烘焙的“斯蓬扎宫”的截图,要想浏览这种方式烘焙的场景运行时的效果,可以去前面的网址看视频。
    在这里插入图片描述
    ⑸ 四种烘焙方式的比较

    上面只是和大家孤立地讨论了四种烘焙方式的设置和烘焙效果,下面对四种方式进行横向比较,以方便童鞋们对四种方式有更深入的理解,这里我们设定如下所示的场景,墙壁、地面、四个球体为静态,四个立方体做活塞运动。

    下图为静态灯光下静态物体的烘焙方式(即baked+baked Glaobal Illumination)烘焙完成的场景,有同学肯定有点懵圈,前面说的静态灯光下静态物体的烘焙从来没提到过运动物体,这个怎么会有运动物体呢,其实这种方式是可以有运动物体的,只不过这里也为运动物体引入了光探测器组,运动物体是用烘焙到光探测器组中的光照数据照明的,前面之所以没提运动物体,是为了特别强调静态物体的“静态”!由下图可见静态灯光下静态物体的烘焙方式,静态物体表面的光影和AO非常精细,烘焙结果相对其它方式来说,对硬件的开销最小,但静态物体和动态物体表面均不会产生高光,且运动物体不产生投影,运动物体进入明暗区域表面只有明暗变化,并没有接受真正的阴影。如果对于运动物体的光影要求不高,可优先采用这种烘焙方式。
    在这里插入图片描述
    下图为静态灯光下动态物体的烘焙(Mixed+Baked Global Illumination)结果,由图可见,这种方式烘焙的场景,除了静态物体的表面的光影和AO精细之外,静态物体和动态物体均有高光,动态物体不仅接受阴影,而且产生真实的投影,相对于上一种方式来说,机器开销稍大一些,这种方式使用的最多的烘焙方式。更正:下图中注释“烘焙(Mixed)应为混合(Mixed)”。在这里插入图片描述
    下图为动态灯光下静态物体和动态物体两种烘焙方式的混合体,这种方式烘焙,静态物体和动态物体表面均有真实的高光和阴影,且灯光在运行时可改变,但静态物体表面的光影没有其它方式精细,对于运行时需要改变灯光的场景,可采用动态灯光下静态物体的烘焙或动态灯光下动态物体的烘焙。
    在这里插入图片描述
    好了,至此对于四种烘焙方式就和大家讨论完了

    ● Unity夜景烘焙

    前面小姐姐以“斯蓬扎宫”日景的烘焙作为切入点,和大家一起讨论了3D模型导入Unity3d的方法、Unity3d的简单布光和烘焙,并介绍了Unity3d常见的烘焙缺陷及其解决方案和加速烘焙的方法,逐步深入到Unity3d的四种烘焙方式,通过实例的图解,相信童鞋们对unity3d的烘焙已经有了进一步的理解。实际应用中除了日景的烘焙,也常常涉及到夜景的烘焙。下面还是以“斯蓬扎宫”的场景为例,和童鞋们继续讨论夜景的烘焙。前面的例子都只使用了一盏模拟太阳的平行光,在下面的例子中将使用多盏灯光来烘焙。

    1. 灯光布设

    和3D场景一样,Unity3d的场景布光也要有主光源,也就是照亮场景的主要光源,其作用除了点亮场景外,还起着主控场景意境和气氛的作用。相信大家对“斯蓬扎宫”的场景强控已经很熟悉了,对于这个场景,小姐姐认为夜景应保持一份神秘和静谧,因此考虑在两层回廊布设适当适量的“宫灯”,灯光颜色采用暖色调。

    在场景中添加如下图所示的“宫灯”模型,置于回廊顶部,具体位置如下图所示
    在这里插入图片描述
    2. 烘焙设置

    为“宫灯”模型添加对应的灯光,将等类型设为点光源“Point”,灯光强度设为1,灯光颜色设为橙色,灯光模式设为混合(Mixed),灯光范围设为9左右,为灯光设置Cookie,并将灯光置于“宫灯”模型下部的地面附近,如下图所示:
    在这里插入图片描述
    将“宫灯”模型及其灯光一起选中,通过复制,每层左右两边各布置两组,然后向二层复制四组,如下图所示:
    在这里插入图片描述
    3. 夜景烘焙

    勾选下图所示的Mxied Lighting下的“Baked Global Illumination”(也就是采用静态灯光下动态物体的烘焙方式进行烘焙),然后点击右下角的“Generate Lighting”进行烘焙。
    在这里插入图片描述
    烘焙后的效果如下图所示,烘焙用时6.8分钟(408.155秒)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    8个点光源共同作为主光源点亮了整个场景,各自产生了限定在一定范围包内的柔和阴影,但是作为主景的狮头雕还不够突出,所以考虑在狮头的上方布设两盏模拟射灯的点光源,同时在狮头前方的地面上也布设一盏模拟射灯的点光源,三盏点光源共同作为场景的辅助光源一起点亮狮头,但不宜过亮。具体设置如下图所示:
    在这里插入图片描述
    另外,为了强调另一端的两个装饰鼎,分别在其附近各布设一盏点光源,作为装饰性的辅助光,照亮场景局部,具体设置如下图所示:
    在这里插入图片描述
    然后重新烘焙,结果如下图所示,烘焙用时7.4分钟(448.196秒),要浏览这种烘焙运行时的动态效果,可以去前面的网址看视频。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ● Unity混合烘焙

    前面讨论了四种基本的烘焙形式,但实际应用中,既有静态灯光,又有动态灯光,既有静态物体,又有动态物体,这种情况下的烘焙就叫混合烘焙。

    前面的例子在烘焙时,要么只选择光照模式为Realtime Lighting下的Realtime Global Illumination,要么只选择光照模式为Mixed Lighting下的Baked Global Illumination,而系统默认两项都被选择,如下图所示,那么到底是该都选择呢,还是只选择一项呢?下面给出官方的一段建议,原文如下:

    The most flexible way to use the lighting system is to use Baked GI and Realtime GI together. However, this is also the most performance-heavy option. To make your game less resource-intensive, you can choose to disable Realtime GI or Baked GI.

    其意思是:使用照明系统最灵活的方法是一起使用Baked GI和Realtime GI(也就是两项都选择),但是,这也是性能最沉重的选择。为了减少资源和时间消耗,您可以选择禁用Realtime GI或Baked GI(也就是只选择一项)。

    根据上面官方的建议,静态灯光下静态物体的烘焙,静态灯光选择Baked的模式,光照模式只选择Baked Global Illumination;静态灯光下动态物体的烘焙,静态灯光选择Mixed模式,光照模式也只选择Baked Global Illumination,并为动态物体在其运动范围内添加光探测器组;动态灯光下静态物体的烘焙,动态灯光选择Realtime模式,光照模式只选择Realtime Global Illumination;动态灯光下动态物体的烘焙,动态灯光选择Realtime模式,光照模式也只选择Realtime Global Illumination,并为动态物体在运动范围内添加光探测器组。这样的匹配方式烘焙场景最节省硬件开销和时间。但对于混合烘焙方式,静态灯光就选择Mixed模式,动态灯光选择Realtime模式,也就是在一个场景的多盏灯光中,有的灯光设为Mixed,有的灯光设为Realtime模式,而光照模式Baked GI和Realtime GI两项都要同时选择,这样Mixed灯光自动对应Baked GI,Realtime灯光自动对应Realtime GI。此时有童鞋会问了,不是说同时选择两种GI方式,会增加硬件开销吗,为什么还要同时选择呢,为了得到更真实的复杂光影效果,混合烘焙必须同时选择两种GI,但有方法来优化场景来缓解额外的硬件开销。
    在这里插入图片描述
    上面的意思简单地图示如下
    在这里插入图片描述
    在这里插入图片描述
    对于一般用户来说,静态灯光下动态物体的烘焙方式足够用了,这是用的最多的一种烘焙。

    火车或汽车出入隧道、室内外出入、游戏角色出入涵洞、室内开关灯这样的场景,使用混合烘焙,光感会更好。当然小姐姐个人认为,使用前面所说的四种基本烘焙方式之一代替,也能获得好的效果。

    有了前面知识的铺垫,混合烘焙不再是问题,这里就不进行图解了,有兴趣的童鞋可以自己去尝试。

    ● Unity室内烘焙

    下面以一个小客厅为例,和童鞋们一起讨论Unity3d的室内烘焙,一方面是对前面知识的综合应用,另一方面满足以下做装修童鞋的学习需求。

    话不多说,开工!这个例子的3D场景如下图所示:
    在这里插入图片描述
    拆分好的UV如下图所示
    在这里插入图片描述
    导入Unity3d后的场景情况如下图所示:
    在这里插入图片描述
    这个场景比较简单,一个窗户、一个沙发、一个茶几、一个书柜、两个落地灯、一个墙面装饰、还有一个挂画、茶几上一个杯子、两盆绿植,这里我们设想将场景烘焙成阴天的白昼气氛,也就是没有直射太阳光,室外光线完全是大气折射的太阳光,所以我们确定这个场景的主光源为从窗户投射的光线,可以使用Unity3d的面光源置于窗户附近,但我们这里选用Unity3d的材质灯光,也就是将某个模型的材质勾选“自发光”,这个模型就成了灯光了。选中窗户玻璃,勾选其材质中的自发光(Emission),将自发光强度设为1.5,发光颜色设为白色,如下图所示:在这里插入图片描述
    因为这个场景不可能有运动物体,光线也不会变化,所以选用静态灯光下的静态物体的方式烘焙场景,所以将自发光材质的Global Illumination(全局光照)设为Baked,勾选光照面板中的“Baked Global Illumination”,然后烘焙,得到如下图所示的结果(烘焙用时5分钟):
    在这里插入图片描述
    在这里插入图片描述
    从上图可见,场景太暗,但明暗关系已经有了,如果反复烘焙,太浪费时间,我们设想通过photoshop来调色,需要说明的是,这里所说的调色不是简单的图片调色,而是对整个场景调色。如下图所示,将一个特殊的色带文件与相机关联起来,对这个文件调整,就会调整相机中的场景,这样我们将这个文件(png图片)用ps打开,然后截取一张相机视图的图片,按照图片调色的方法,对截取的图片调色,然后将图片调整的参数应用于那个色带文件,保存色带文件后,Unity3d的场景就回作相应的调整,关系就是这样。
    在这里插入图片描述
    下面我们就来调色,首先抓取相机视图的图片,然后在ps中打开,同时也将刚所说的色带文件也用ps打开,如下图:
    在这里插入图片描述
    首先调一下截取的相机视图图片的亮度和对比度,亮度88,对比度-50,如下图所示:
    在这里插入图片描述
    然后对色带也做这样的调整,如下图所示:
    在这里插入图片描述
    然后保存色带文件,Unity的相机视图就会作相应的调整,调整后如下图所示:
    在这里插入图片描述
    原理大家都明白了吧,这样就是以用ps灵活地为Unity3d场景调色了,只要Unity3d烘焙出场景的明暗关系,剩下的就交给ps了,这样可以节省大量反复测试烘焙的时间。按照上面的方法对相机视图进行色相饱和度、色彩平衡等调整后,相机视图的场景如下:
    在这里插入图片描述
    在这里插入图片描述
    好了,场景调色就到这里。

    木地板应该有反射,所以我们需要引用Unity3d的“Reflection Probe(反射探测器)”,在层级面板空白处右键单击,在弹出的菜单中选择light下的“Reflection Probe”命令,场景中会出现一个四面体线框,如下图所示,在反射探测器的检视面板中按下节点命令,四面体的四个面上会出现黄色下把手,拖动可以调节探测器的大小,按下探测器检视面板中的移动按钮,可以调整探测器的位置,用这两个命令配合,将探测器调至和房间一样大,或者说让探测器完全包络这个房间,烘焙的时候,会将整个房间烘焙成一个比较小的全景图贴在探测器上,供具有反射的材质映射来实现真实反射。这里说明一下,当场景比较复杂时,可以用多个反射探测器拼合来满足场景的外形,场景中不需要反射的地方,就不需要布置反射探测器了。
    在这里插入图片描述
    反射探测器布置好后,需要重新烘焙,反射数据是通过烘焙获得的。如果熟悉了,烘焙之前就布置好反射探测器,免得重复烘焙。烘焙之后结果如下
    在这里插入图片描述
    上图反射效果不太好,下面我们为木地板加一个实时反射,效果如下:
    在这里插入图片描述
    在这里插入图片描述

    现在我们将玻璃的材质灯光关闭,用平行光来模拟阳光,重新烘焙(用时6分钟左右)并开启反射后效果如下:
    在这里插入图片描述
    在这个例子中引入了ps的后处理调色,以避免为达到好的色调和颜色及明暗对比反复烘焙浪费很多时间,好了,这个例子就讨论到这。

    ● Unity沙漠庭院烘焙

    下面和童鞋们再讨论一个“沙漠庭院(The Courtyard)”的烘焙,也算是对Unity烘焙的综合应用,其3D场景如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    因为拆分的UV比较多,这里就不上图了,导入Unity后的场景如下图所示:

    在这里插入图片描述
    在这里插入图片描述

    日景烘焙,按下图设置模拟太阳的平行光和光照参数
    在这里插入图片描述
    为场景中模型灯设置材质灯光参数如下图,这里第二次用到材质灯光,然后点击光照检视面板中的“Generate Lighting”,开始烘焙场景。
    在这里插入图片描述
    噔噔蹬蹬,经历28分钟的烘焙,结果如下
    在这里插入图片描述
    这个场景是官方的。没有提供3D模型,小姐姐想了很多办法才导出FBX文件,面数高达300多万,测试烘焙了几次,光照图好多都设到了4096x4096,总有问题,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    那这些烘焙缺陷如何消除呢?前面小姐姐说过,模型面数太多是导致烘焙缺陷的重要因素,因为同样分辨率的光照图,模型面数越多,分配给每个面的区块就越小,模型面数越少,分配给每个面的区块就越大,区块越大,光照图越清晰,区块越小,光照图被拉扯得越严重,缺陷就会越多。下图为官方的模型:
    在这里插入图片描述
    下图为小姐姐用低面数最优化精简单面建模方法重新构建的模型(花了两天时间,总面数50万,降低了6倍),
    在这里插入图片描述
    另外,小姐姐烘焙这个场景后,发现模型的贴图有问题,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    上面这些贴图问题其实是很多人经常遇到的,现在我们回到3d中,看看3d中的情况,如下图所示
    在这里插入图片描述
    由上图可见,3dmax场景打开后,模型显示破破烂烂,这也是很多网友提问的问题,网上解答的不是让修改显示驱动,就是模型偏离原点太远,小姐姐认为不是这些原因造成的模型破烂,按上图的标注勾选背面去除,立即就消除了模型的显示破烂,如下图所示:
    在这里插入图片描述
    由下图可见,Unity中的问题在3dmax场景中也存在
    在这里插入图片描述
    在这里插入图片描述
    另外,贴图的分辨率为4096X4096,精度很高,为什么在Unity中很虚呢?这里不得不和大家讨论一下UV问题,通常情况下,很多人在3dmax中习惯用UVW map来调整模型的材质贴图,对于简单的模型,这种方法没问题,但是对于复杂的模型,用标准的平面、圆柱、球面等贴图坐标,横竖都不正确,就像上面的图示一样,这种现象称为UV扭曲或拉伸,这是不正常的贴图。要解决UV扭曲、拉伸或挤压,必须掌握UV拆分(也称为“展UV”,通俗地讲就是展平UV),前面提到过拆分UV,一听到拆分UV,很多童鞋一个头两个大,觉得拆分UV很难掌握,这里小姐姐不想对拆分UV进行深解,只是通过对比,让大家对UV拆分有个大概的概念。

    为了找到上面例子中贴图被扭曲和拉伸的原因,我们将模型的贴图换成棋盘格,因为上面例子中的贴图不容易看出问题,棋盘格材质是所有3D软件用来显示UV排列的一种方式。

    下图是上面的实例场景模型贴图换成棋盘格的情况
    在这里插入图片描述
    下面我们一块一块来图示分析
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    棋盘格的排列代表模型的UV坐标情况,或者说棋盘格的排列是由模型的贴图坐标控制的,棋盘格排列有问题,贴图一定也会有问题。从上面的图解可见,场景贴图的UV坐标是不正确的,棋盘格线性排列,贴图纹理一定会朝一个方向;棋盘格错乱,贴图纹理也一定错乱;棋盘格扭曲,贴图纹理也一定扭曲;棋盘格密集(挤压)或拉伸,贴图纹理一定会变虚,因为拉伸会导致纹理被拉大,挤压会导致纹理皱皱巴巴,这两种情况都会使贴图变得模糊。上面的图示中模型贴图局部密集,相信大家都遇到过。

    为了矫正不正确的贴图坐标,模型必须使用3dmax的Unwrap UVW修改器进行手工UV拆分,或者叫手工展UV(展平UV坐标),如下图所示。对于材质的纹理贴图坐标,使用系统自动拆分UV,常常是不正确的,所以必须使用手工来拆分。对于使用C4D、Maya、犀牛、Su的用户,也有相应的功能,这里就不赘述了。
    在这里插入图片描述
    拆分或展平的UV坐标是被保存在贴图通道中的,贴图通道设置在Unwrap uvw和材质面板各有一个,如下图所示。
    在这里插入图片描述
    Unwrap uvw面板的贴图通道(Map Channel)用来设置拆分的UV坐标保存在哪个通道,通道可以有8个。材质面板中的贴图通道(Map Channel)用来设置这个材质贴图的排列受哪个UV坐标的贴图通道控制,系统默认固有色(或过度色)贴图受通道1(即Map channel 1)控制,展UV(Unwrap uvw)修改器面板的贴图通道(Map Channel)默认是2,因为一般情况下都是用UVW Map调整贴图坐标,这个UV坐标占据通道1,有的童鞋使用展平修改器时,发现模型的贴图没有变化,是因为展平修改器的贴图通道和材质的贴图通道不一致,模型的贴图没有受到你正在使用的材质贴图展平UV的控制,如下图所示:
    在这里插入图片描述
    展平修改器一般情况下是用于控制光照贴图的(也就是控制烘焙贴图),光照贴图默认占据通道2,所以展平修改器的通道默认是2,有时因为模型的贴图坐标不正确,需要手工拆UV,也就是需要使用一下展平修改器,此时必须将通道改为1,这个大家必须注意,否则拆了半天,材质贴图没变化。

    刚才小姐姐说,贴图通道可以有8个,通道1默认是分配给材质固有色贴图的,通道2默认是分配给光照贴图的,其他6个可以用来展平法线贴图、高光贴图、阴影贴图、AO贴图等等,一般我们只需要过度色贴图和光照贴图两个通道。

    UV展平后有两种用途,一种用于美工在photoshop中绘制贴图,另一种用于控制纹理贴图,没有美术功底的童鞋,当然不会绘制贴图啦,那就用展平的UV坐标来控制纹理贴图好了。

    我们手工展UV是为了矫正不正确的纹理贴图,所以展平UV的贴图通道就改为1。

    展平UV大家可以想象成拆盒子一样,要拆盒子,得有缝,没有缝,是拆不开的,拆UV,一般也得有缝,UV缝可以系统自动定义,也可以手工绘制,系统定义的缝经常不是我们所想要的,所以对于控制材质贴图的UV,我们一般都是手工来绘制拆缝的,这里就不具体绘制拆缝了。拆缝绘制好后,就可以展UV了。展平UV修改器的展平方式很多,如下图所示:
    在这里插入图片描述
    正确拆分(或展平)的UV,棋盘格应该是方方正正(长宽相等或近似相等),排列整齐,这样贴图贴上去才没问题,如下图所示,绝对不允许排列错乱、扭曲、拉伸或挤压,否则就像上面的例子一样。
    在这里插入图片描述
    在这里插入图片描述
    另外在一个物体中,对于一种材质,棋盘格的密度必须相等,除非特殊要求。棋盘格的除了长宽相等、排列规整外,还必须合理,什么是合理呢?例如下图中的回转体,网上很多例子都将其端面的棋盘格排列成下图所示:
    在这里插入图片描述
    小姐姐个人认为回转体的端面,应该让棋盘格绕环向(或圆周方向)排列,为什么呢,假设这个物体是个木头,端面的纹理应该是一圈一圈的年轮,按照上图的排列,木纹贴上去,纹理肯定是线性的,这是不正确的,再假设这个物体是一个机械零件,端面的纹理应该是车削加工的刀纹,一圈一圈的,按照上面的排列,金属纹理贴上去,也不会又一圈一圈的刀纹,而是线性纹理,这是不合理的UV拆分,为什么在这里要强调这个问题呢,因为我们前面所讨论的场景,好多UV坐标有问题的物体就是回转体。

    小姐姐对上面例子的模型重新拆分贴图UV,并使用“条带展平”拆分后得到下图所示的效果,错误的UV坐标得到了矫正,而且上下面的棋盘格沿圆周方向排列,这才是合理的,如果贴上砖纹,纹理自然会环向分布。由图可见,UV坐标消除了错乱、扭曲、拉伸和挤压
    在这里插入图片描述
    同理,对其他有问题的模型重新拆分贴图UV后,效果如下:
    在这里插入图片描述
    在这里插入图片描述
    通过手工拆分UV之后,错乱、扭曲、拉伸的UV得到了矫正。这里说明一下,对于一个物体,材质相同的部分,除了UV坐标正确、合理之外,棋盘格大小必须一致,也就是UV坐标的密度必须相同,如果UV密度不同,就像你的手心手背一样。另外同一场景中的不同物体,如果材质及贴图相同,UV密度也必须相同,这样才看上去协调。

    那么如何让一个物体的所有面的UV密度相同呢?按照下图所示的方法来完成:
    在这里插入图片描述
    一个物体各个面的UV密度统一了之后,那材质和贴图相同的不同物体如何统一呢?很简单,选择每个物体,点击上图中第六步的图标,所有物体的UV就全部均匀一致了,如下图所示:
    在这里插入图片描述
    将贴图去换回原本的贴图后,贴图不再有错乱、扭曲、拉伸和挤压现象了,如下图所示:
    在这里插入图片描述

    UV正确拆分后,不需要太高分辨率的贴图就可以让模型的贴图很清晰,贴图分辨率太高,烘焙和实时运行时机器负载太大。

    手工拆分贴图UV后,也可以将其应用于光照贴图,这就需要通过贴图通道的复制将材质贴图的UV复制给通道2,当然也可以用机器自动展平光照贴图的UV。

    好了,废话就说到这里,矫正了模型的贴图坐标之后,下面我们就来重新烘焙上面的例子,按之前设定的参数,重新烘焙后结果下(有时约12分钟):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    添加灯光辉光和地面模糊反射之后的效果如下:
    在这里插入图片描述

    由图可见,先前的问题都已经消除掉了。

    这个场景的夜景烘焙后续会补充,下面大家一起来看看一个小区室外场景的烘焙

    ● 社区室外日景烘焙

    这个案例的3D场景截图如下所示,这个场景原本900多万面,小姐姐用单面建模方法重新构建模型,只用了4.5万面,用于VR和游戏的场景必须用精简建模,以保证手机端的流畅运行。
    在这里插入图片描述
    在3D软件中拆分每个物体的UV于通道2,一般童鞋一个物体拆分一个UV,实际上多个物体可以共享一个光照图的UV,也就是选中多个物体一起拆分,得到一个UV,这样这些物体就共享一个UV了,拆分好UV后倒入U3D,如下图所示:
    在这里插入图片描述
    这个场景日景的灯光比较简单,用一盏模拟太阳光平行光作为主光源,并勾选阴影,用天光和环境光作为辅助光源弥补主光源的盲区,其他参数按前面例子的方法设置,有前面知识的铺垫,相信大家可以自行完成烘焙的相关参数设置,小姐姐烘焙完成的结果截图如下(用时12分钟):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    烘焙完成后大家可按照前面小姐姐介绍的方法用ps对场景进行润色,当然不是对图片调色,而是借用图片的调节,来调整整个场景的颜色,以避免在Unity中重复烘焙。这里小姐姐就不上图了,相信大家都可以自行完成这个操作的。

    ● 社区室外夜景烘焙

    这个场景的夜景灯光相对来说比较复杂,小姐姐设想以建筑的亮化霓虹灯和路灯共同作为主光源照亮场景,用射灯作为辅助性装饰辅助光点缀建筑,同时用微弱的天光和环境光也作为辅助光照亮建筑的边缘,灯光布设截图如下:(待续)

    展开全文
  • LightMap烘焙技巧

    千次阅读 2018-05-23 10:31:47
    前言:弱弱的说我是一个程序猿。另外求粉求赞~知乎链接科普名词解释:全局照明(GI):是指除了直接光之外包括天空,物件之间...LightMap:光照贴图HDR:颜色高动态区间,指颜色亮度可以超过1,移动平台暂且不支持。...

    前言:弱弱的说我是一个程序猿。另外求粉求赞~知乎链接

    科普名词解释:
    全局照明(GI):是指除了直接光之外包括天空,物件之间间接光照的总和。
    环境光遮蔽(AO):是指间接光在物件间相互遮挡反射不充分导致的微弱阴影。通常在直接光照暗部的接缝处才会比较明显。
    天光:从头顶来的天空颜色造成的间接照明,特别是在晴朗的天气。
    LightMap:光照贴图
    HDR:颜色高动态区间,指颜色亮度可以超过1,移动平台暂且不支持。

    间接照明(间接反射):指光源照亮A物体,A物体变亮以后充当间接光源对近距离内B物体有照亮的作用。这种现象只有当物体B在直接光照(比如阳光)的阴影里才会明显。

    足够多的明暗对比

    • 适当打平灯光以增加阴影面积(暗部更多更容易做效果) 
      img

    • 适当增大模型增加阴影面积(暗部更多更容易做效果)
      img

    • 通过只投射不接收来增加假阴影(作假)(不接受投影是因为看不见所以可以节省这种物体的渲染和它占用的litmap面积)
      img

    模拟全局光照

    • 足够充分暗部照明(暗部会有一种明快的感觉,用美术语言说就是暗部很“通透”)
      img

      img

    • 天光的使用:
      • 理论上越晴朗的天气阴影暗部越偏蓝(这就是全局照明的一种,暗部要有光,用美术语言说就是暗部很“通透”)(哪天北京晴空万里的时候去大楼的阴影里看看是不是有蓝色,为了对比饱和度的覆盖问题,可以拿一张白纸)
        img
    • 间接反射夸张
      • 比如守望先锋花村的樱花树下会有很强烈的蓝紫色,实际上是模拟粉红的樱花与天光蓝色的叠加造成的视觉,不过暴雪的美术有更加夸张的表达。(实现方法实际是在暗部增加与区域环境颜色相似的点光,实时GI现在效率跟不上,另外也不可能这么强。)
      • 小幅夸张
        img

      • 更夸张的做法:现实世界中不会有这么强烈的间接反射,就像叶子把光间接反射出来了一样,守望先锋就是例子
        img
    • 其实以上技巧都是借鉴自守望先锋
      • 这是一个人的分析,只要有心去找,仔细去看,去思考,网上有很多文章有可以借鉴的地方(因为实时GI还开销太大,暴雪真是能通过技巧把能用的东西用到最好)
        img原文链接

      • 还有一个对环境光源的理解
        img原文链接

    • 祭上守望先锋的场景,很夸张的暗部间接光照,实际上是通过暗部打烘焙点光来实现的。更多细节请参考我的另外一篇文章
      img

    AO的使用

    • AO能更真实的模拟现实世界,能使暗部有更明显的立体感,用美术的话说就是暗部足够“实”,“不飘”
      • 基础知识请参考这篇文章,这里讲了什么是AO,什么是间接反射等
      • 暗部的接缝处AO效果最明显img

    LightMap面积的优化

    • LightMap面积(精度)说明:(一个格子就是一个像素点,也就是占用在lightmap上面的面积)
      img

      • 通过Scale In LightMap这个参数可以单独调整单个物体的精度
        img
    • 更合理的分配LightMap面积(想要好效果又要节省lightmap面积,就是要研究,并总结经验,没有捷径
      • 只投射不接受的物件Scale In Lightmap填0就行

      • 地面 > 物件,重要物件 > 一般物件, 视觉中心 > 边远地区,大物件 > 小物件
        img

      • 全部(或者几乎全部)在明处或者全部在暗处的可以用最低分辨率烘焙(比如当前光线下的这个椅子和不管影子多么正都是在暗处的这面墙壁,这种情况下,这两个lightmap精度可以填0.01),需要注意的是必须参加烘焙只是精度可以很低(因为纯白或者纯黑被压缩大小是不会损失精度的)
        img

      • 地面以下,地图的侧面,或者根本看不见的东西,烘焙占用面积请控制到最小(最惨的情况请参考下面说的浪费)

    • 避免完全没有必要的浪费
      • 像这种完全在别的物体以下,还参加烘焙的完全没有必要,而且浪费很大
        img

      • 树叶花草等透贴类似的推荐只投射,不接受,而且接受烘焙阴影效果不见得好,会很“脏”
        img

    压缩的效果优化

    • 通过我烘焙的经验,以kasaierxueyuannew场景为例,发现烘焙10-12张1024压缩到512,比直接烘焙2-3张1024的贴图来的精度和效果都更好
      • 10张512 = 2.5张1024,而以之前的烘焙策略烘焙3-4张1024效果没有我这个好
      • 此外通过合理分配lightmap精度,能节省2-3张lightmap,没有仔细分配之前,保证效果的情况下能烘焙14张左右,现在这版只使用了11张,如果还细抠还能省1张甚至更多
        img
    • 从1024压缩到512肯定会损失精度,但是通过仔细的分配lightmap精度能使这种损失达到最小
      • 方法一:地面最有用,所以怎么省都不要吝啬地面的精度,地面不管接受多少阴影,所占用的lightmap面积是一样的,所以多打点阴影(不增加消耗,还可以做效果,何乐而不为)
      • 方法二:纯背光纯亮光区域可以减少lightmap精度,因为压缩不影响(就像纯黑纯白的贴图压缩大小没有损失一样),而复杂的结构并且能同时受到阳光和阴影的影响,则也不需要节省精度,因为如果本来精度就不高,则压缩更惨
      • 方法三:压缩大小比压缩格式带来的损失小,如果压缩格式影响巨大,可以不压缩格式,而在其他地方想想办法怎么省(省的办法参考上面)。所以推荐烘焙高质量的光照图来压大小
      • 方法四(重要):尽量使用大阴影,在不压缩情况下本来就很小很虚的阴影,被压缩了只会更惨,优化方法参考以上
      • 方法五:不推荐使用复杂的结构,酌情使用,在压缩的时候很容易损失过大

    技巧及问题

    • 发现阴影比较虚,不实
      • 检查是否间接光照反弹次数过大(可以理解成有过大的衍射效果)
      • 增加被投影物体的大小(比如放大花盆)(很显然)
      • 增加投影至物体所占lightmap面积(比如树叶投影到地面比较虚,则提高地面的精度)
    • 效果不好或者黑点、漏光过多
      • 检查2u是否打开
      • 检查顶点分布是否有异常,uv分布是否均匀或过少
      • 如果都没问题而且这个物件很重要,则增加精度
      • 自定义2u(高级,不推荐使用)
    • 过小物体效果太差
      • 如果确实过小,先看能不能放大,或者说这么小的东西有没有存在的必要或者是否可替代(很显然)
      • 如果确实需要,可以不参加litmap烘焙,而直接去diffuse贴图上花盆贴图的底部蹭两笔黑的
      • 这个花盆之前参加烘焙会有很大的漏光和黑点,其实不需要参加烘焙,而且效果比烘焙更好,还能节省lightmap
        img

    个人经验

    • 暗部补光,感觉上并不是光越多越好,最好灯光颜色来表达周围环境的间接光照,过多颜色的灯光会让人觉得没有重点和乱
    • 点光通过减小光照强度增加照明范围能得到更好的环境间接光的效果,还能防止有比较突兀的亮斑
    • 个人倾向于用天空材质球来代替全局环境光来烘焙,如果是晴朗天气,用默认纯蓝的天空即可
    • (新)白模的情况下感觉lightmap很舒服而且很干净,而最终效果图的lightmap效果没有那么明朗。所以猜测为diffuse贴图的饱和度问题,因此推荐使用较低饱和度的颜色,否则lightmap的颜色很容易被盖掉(不保证正确,希望美术同学尝试)
    • (新)确定烘焙精度(分辨率)的技巧:可以先确定好地面保证效果情况下的最低精度,因为地面是最重要并且理论上精度应该是最高的,然后其他重要的,次要的物件相应缩小就行。
    • (新)从上面可以看出,阴影面积很重要,于是在设计之时,说服策划,从设计的角度避免太过于空旷没有投影的地面,因为在阳光下很难做效果,而作假投影的方法有一定的局限性。

    跨平台的问题

    • 因为烘焙Lightmap用的exr,也就是HDR颜色编码,而现在手机平台不支持HDR编码,导致在手机平台和PC平台的解码方式不一样,所以不能使用过强的光来烘焙光照图,否则会造成android与pc差异巨大,因此不推荐使用光照强度超过3的灯光来渲染。

    • (新)美术反应android平台烘不亮的问题:主要原因是材质求颜色太黑了,原理是这样,如果材质求本来亮度是在0.2,在pc上因为支持RGBM编码,

      最终颜色 = 0.2 * 颜色贴图的rgb * lightmap的rgb * lightmap的a(也就是系数)

      如果材质求本来很黑,要靠很亮的lightmap才能达到照亮的效果,则会导致lightmap的系数会特别大,比如7-10,但是在android平台上,lightmap的解码方式为

      最终颜色 = 0.2 * 颜色贴图rgb * lightmap的rgb * 2(这个2是固定的,unity内置的解码)

      所以就会造成android平台特别黑。所以如果要避免这个问题,就是要让材质求颜色亮一些,推荐把没有烘焙lightmap时候的颜色大体定在0.5-0.7左右的亮度,这样烘焙进退都可以,而且这样lightmap的系数不会特别夸张的大,这样在pc平台和android基本就能保持一致。
      img

    • 如果出现这种lightmap都发白的情况没有颜色了,就说明很有可能有很大的系数值,也更容易导致android比pc显示的更黑。前面是低材质颜色高灯光颜色,后者是高材质颜色,低灯光颜色,最后的效果没什么区别。
      img

    • (新)另外烘焙的光不要太靠近物体,因为越靠近光强太强,很容易爆掉。在太靠近的位置叠加光也会有相同的问题。比如这里丢失了黄色灯光的颜色就是因为过爆了,就会发白。img

    演示

    • 可以从此处下载演示场景
      • 给一张全貌
        img

      • 这是原来的
        img

    二更

    • 今天给另外一个项目调效果,发现大家对天光和间接反射理解的不够深,或者说理解的不一样,确实光照环境确实可以有不同的审美倾向,但还是解释一下天光的使用,可以通过skybox来烘焙,也可以通过环境光来烘焙,但是颜色需要注意,什么样的场景天气就要对应什么样的天光,晴天的时候天光必然是蓝色的,天气不明朗时则根据环境酌情调整,颜色推荐使用粉色,用粉蓝淡蓝粉蓝紫等等

    • 间接光照,引擎是不提供这个,但实际上大家可以想想,间接光可以通过点光来实现,其实上面我已经说了,只要把点光范围扩大,把点光亮度减少就可以了,很好理解的。

    • 剑侠世界的lightmap倾向其实也很夸张的,剑侠的用色确实是好
      img

    • 旧的,用普通的灰度来烘焙的场景
      img

    • 新的,用更夸张的颜色来烘焙的白天,以模拟自然界的天光,同时加入了比较夸张的红色的间接反射光来得到更大胆的颜色,类似守望先锋花村 
      img

    三更

    • 之前一直讲的是白天的lightmap烘焙,说实话,之前之所以没有提到夜晚的lightmap烘焙,确实是因为我对夜晚的光照理解的太浅了,也没有太过仔细的观察过生活。昨天在找是否也有别人有分享过烘焙技巧的时候,找到一篇帖子,然后看到评论下有人说在看视觉艺术用光,了一眼发现写的很好,一个老外写的,对于白天的光照很多跟我自己刷知乎看守望先锋理解出来的很接近或者说基本是一样的。然后看到晚上和室内的灯光,然后今天看完我又进守望先锋看了一个晚上的地图,然后又参考了一下剑侠世界,算是对夜晚的灯光有点理解了,于是纪录在此。按照我的理解有几个要点或者经验可以分享:
      • 晚上不管是否有月光,最好给一些微弱的阴影,当然晚上的氛围不用说不管是用方向光给还是通过环境光给都应该偏蓝
      • 对点光的理解,晚上的点光,也就是人工照明,是必须有明显的衰减的,这时候就跟白天使用点光当作间接照明的情况不一样了
      • 同样,晚上也有需要通过点光来补充间接照明的地方,虽然不多。同时,面积光,比如商店招牌等等得恰当的使用区域光烘焙
      • 还有一点就是点光阴影的使用,哪些光应该产生阴影,这个在以前美术的使用中感觉很容易忽略,塑造阴影是做效果非常重要的办法
      • 另外一点,完全是从守望先锋过来的经验,也就是,不能出现无源头的光照,因为人会脑补,如果没有光源会觉得不自然
      • 当然还有一些其他的技巧,比如做假贴片,自发光等等技巧,因为不属于lightmap的范畴就不细说了
    • 先看守望先锋和剑侠世界是怎么处理的

      img

      img

    • 参考这两种方式烘焙的效果

      img

    四更

    • 本来觉得应该写的差不多了,不太可能更新了,但是今天试了一下自己展2u,真的太出乎意外了。之前我自己试的时候因为限于不会展uv,虽然知道展2u效果会好很多,但是没有尝试,也觉得这个对于美术工作量太大,所以没有太放在心上。后来挂在gad上的文章后面有人留言说2u烘焙的事情(详见文章评论8楼),再后来一个完美前同事问我问题,也说他们自己展2u,我效果目测确实好很多,于是今天正好跟美术聊说要不试一下,没想到试一下效果真是比我想象中太好了,另外,经我测试,Unity里对于展2u和不展2u的物体烘焙是可以混用的,所以整体说来一些比较平整结构的东西就直接用Unity自己展2u,一些复杂结构和特殊结构(直角、环形、细碎)才自己展2u,这样工作量不会翻太大,这确实是今天的Suprise。

    • 放上测试图

      img
      同时还是无奈的表示TA有多重要,要是我展uv顺手拈来,可能第一次我测试lightmap的时候就用了。

    题外的感悟

    • 记得小时候没有报书法班完全靠兴趣来写毛笔字,起初都是用几块钱的毛笔来写,写不好总会怀疑是不是笔的问题,后来换了30,40的笔感觉会好一些但好的不多,后来看到我三外公用钝头的毛笔写出来的字都很好看(虽然达不到他最高水平,但是笔意还在),后来跌跌撞撞对笔锋,行笔有了更好的理解,发现重新拿原来最开始的几块钱的毛笔都写的不错。
    • 还有比如我高中那会开始玩跑跑卡丁车的时候,刚上来就买了一个好几十的高级车玩,但是在游戏中被一些老手用板车(自带的新手车)碾压(因为根本不会过弯道,要不撞墙,要不减速过多,要不走的不是最佳的漂移路线)。所以好不好用会不会用完全是两回事。不要轻易的因为后者而怪前者。这种例子不胜枚举。世界上的大道理基本都是相通的。多思考,多琢磨,这是一种品质。

    展开全文
  • Unity3D 批处理修改LightMap烘培贴图 使用方法:http://blog.csdn.net/asd237241291/article/details/8487826
  • Unity Lightmap之Terrain和Lightmap分块切割

    千次阅读 2019-04-20 12:18:55
    上一篇 :Lightmap之动态加载单个物件和其对应的Lightmap 本系列前两篇文章,实际上说明了两点: 1.Lightmap是可以根据脚本动态切换。适用于同一场景白天,黑夜的变换。 2.Lightmap是可以分割,以物件为单位, 每...
  • Lightmap shader (glsl)

    2011-07-15 01:31:35
    用于生成lightmap的shader,用glsl编写
  • Unity Lightmap 光照贴图 保存 动态加载
  • Unity大世界LightMap处理

    千次阅读 2020-03-28 11:25:12
    在Unity中,烘焙LightMap采用的是一个场景烘焙一组LightMap。而对于大世界场景来说,没办法把世界上所有的物体在同一场景下烘焙。Unity提供的解决办法是通过SubScene来解决,就是分场景烘焙,然后再通过加载卸载...
  • Lightmap Manager 2

    2012-11-27 10:20:51
    Lightmap Manager 2 comes with advanced features that extend Lightmap Manager Lite with which you can now bake selected objects alone without affecting the rest of the scene lightmaps or losing them, ...
  • 下一篇:Lightmap之Terrain和Lightmap切割 接上一篇,LightMap之动态切换LightMap模拟白天夜晚,介绍了最基本的动态切换。现在问题来了,当场景比较大的时候,我们通常不是一次性把所有的物件都加载,哪怕这个物件...
  • unity2018 lightmap烘焙最佳实践

    千次阅读 2019-08-01 16:55:44
    从Unity 5.0版本我们推出了...现在国内大部分开发者主要都使用Enlighten系统进行Lightmap烘焙。作为Progressive系统极大优势的GPU加速还需要到今年年底才会推出,因此接下来一段时间内大部分国内游戏开发者应该...
  • Lightmap_manager2.5

    2013-11-12 14:11:51
    这个插件补足了Unity内建烘培功能的缺陷,在不影响场景已经烘培的情况下仍可对单一物体进行烘培,并提供了动态的Lightmap效果,演示效果如下: http://www.mixeddimensions.net/LightmapManager2/

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,026
精华内容 2,010
关键字:

lightmap

友情链接: irls.zip