unity3d 场景文件_unity3d如何把场景模型导出成一个fbx的文件 - CSDN
  • Unity5.3加载场景

    千次阅读 2016-08-01 21:33:18
    IEnumerator loadScene(string sceneName) { string mainPath = "file://" + Application.streamingAssetsPath + "/AssetBundle/" + "AssetBundle"; WWW www1 = new WWW (mainPath); ... i
    IEnumerator loadScene(string sceneName)
    	{
    		string mainPath = "file://" + Application.streamingAssetsPath + "/AssetBundle/" + "AssetBundle";
    		WWW www1 = new WWW (mainPath);	
    		yield return www1;
    		if(www1.error == null)
    		{
    			AssetBundle mainAB = www1.assetBundle;
    			AssetBundleManifest abm = (AssetBundleManifest)mainAB.LoadAsset("AssetBundleManifest");
    			mainAB.Unload (false);
    			if (abm == null) {
    				Debug.Log ("abm is null");
    				yield return null;
    			} else {
    				string[] depNames = abm.GetAllDependencies ("a.assetbundle");
    				Debug.Log ("depNames length = " + depNames.Length.ToString());
    			}	
    		}
    
    		string fileFullPath = "file://" + Application.streamingAssetsPath + "/AssetBundle/" + sceneName+"."+AB_END;
    		WWW www = new WWW (fileFullPath);	
    		yield return www;
    		if (www.error == null) 
    		{
    			AssetBundle abScene=www.assetBundle;
    
    			SceneManager.LoadScene (sceneName);
    		}
    		else 
    		{
    			Debug.LogError ("fileFullPath:"+fileFullPath+" error:" + www.error);
    		}
    		www.Dispose ();
    		www = null;
    	}


    首先加载全部资源的AssetBundle,然后加载依赖,再加载场景文件

    展开全文
  • Unity3d 场景打包与加载

    千次阅读 2015-10-28 10:15:09
    3d游戏中 一个场景往往斗劲大 若是游戏的进行须要下载一个10M甚至更大的场景时 加载所用...那么若是采取unity3d的内置地形作为游戏中的地形时 起首加载地形并显示 再去加载场景中的部件(比如树、房子等) 将会很有须要
    3d游戏中  一个场景往往斗劲大  若是游戏的进行须要下载一个10M甚至更大的场景时  加载所用的时候会导致很大项目组玩家的流失

    我们知道unity3d中的内置地形是应用一张高度图  对其地形进行打包今后  发明<=100KB

    那么若是采取unity3d的内置地形作为游戏中的地形时  起首加载地形并显示  再去加载场景中的部件(比如树、房子等)  将会很有须要

    在加载场景中的部件时  可以按照玩家当前地点的地位  由近到远的去加载

     

    场景中的每个部件实际上并不都是独一无二的  

    比如一棵一模一样的树  可能同一个场景中呈如今很多处所  不合的只是树的地位信息  

    那么在加载场景的时辰则只须要加载一个树的模型  并记录下N个树的transform信息  将会大大的削减场景所占的空间  

    若是模型的重用率较高  那么这个题目的解决将会成倍的削减一个场景所占的空间

    场景在加载时  也只须要下载一个树的模型  并按照transform信息  在指定的地位复制出N棵树即可

     

    在应用unity3d的BuildPipeline进行打包之前  须要遍历一边所选文件夹下的场景文件 

    若是文件的MeshFilter的Mesh为在该文件夹中只呈现了一次  则申明该模型在场景中没有反复  则记录下该模型文件的transform信息  并打包

    若是该Mesh呈现的次数大于一次  则记录下这些和该Mesh雷同的模型的transform信息  打包时包含一个模型和多个transform信息

     

    在unity3d中有个名为ScriptableObject的类  可以哄骗它来存储本身所需的各类百般的资料

     


    public class TransformHolder : ScriptableObject
    {
    public int Length;
    public Vector3[] position;
    public Quaternion[] eulerAngles;
    public Vector3[] localScale;
    }


    如许一来  每一个资料包中都包含一个模型和一个TransformHolder类型的文件
    TransformHolder的Length若为1  则申明该模型在场景中只呈现了一次

    若大于1  则可以按照记录的transform信息轮回生成多个

    本来有几百个资料包  大小有十几兆的场景  

    用该办法后  变成了二十多个资料包  大小削减到不足2M  

    当然这实用于场景中的模型有重用的现象
    展开全文
  • 新建工程,在Assets下新建Scenes文件夹存放场景文件,新建三个Cube,分别命名为Cube、Cube1、Cube2并保存为三个预设,保存新建在ReanAssetbundle.cs脚本,脚本内容如下: using UnityEngine; using System....

    新建工程,在Assets下新建Scenes文件夹存放场景文件,新建三个Cube,分别命名为Cube、Cube1、Cube2并保存为三个预设,保存新建在ReanAssetbundle.cs脚本,脚本内容如下:


    using UnityEngine;
    using System.Collections;


    public class ReanAssetbundle : MonoBehaviour {




        
    // Use this for initialization
    void Start () {
            
    }
        
        


    // Update is called once per frame
    void Update () {

    }


        //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。  
        public static readonly string m_PathURL =
    #if UNITY_ANDROID  
            "jar:file://" + Application.dataPath + "!/assets/";  
    #elif UNITY_IPHONE  
            Application.dataPath + "/Raw/";  
    #elif UNITY_STANDALONE_WIN || UNITY_EDITOR
     "file://" + Application.dataPath + "/AssetBundleLearn/";
    #else  
            string.Empty;  
    #endif


        void OnGUI()
        {
            if (GUILayout.Button("加载分开打包的Assetbundle"))
            {
                StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "Cube.assetbundle"));
                StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "Cube1.assetbundle"));
                StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "Cube2.assetbundle"));


            }


            if (GUILayout.Button("加载打包在一起的Assetbundle"))
            {
                StartCoroutine(LoadGameObjectPackedTogether(m_PathURL + "Together.assetbundle"));
            }        
        }


        //单独读取资源  
        private IEnumerator LoadGameObjectPackedByThemselves(string path)
        {
            WWW bundle = new WWW(path);
            yield return bundle;


            //加载  
            yield return Instantiate(bundle.assetBundle.mainAsset);
            bundle.assetBundle.Unload(false);
        }


        IEnumerator LoadGameObjectPackedTogether(string path)
        {
            WWW bundle = new WWW(path);
            yield return bundle;


            Object one = bundle.assetBundle.Load("Cube");
            Object two = bundle.assetBundle.Load("Cube1");
            Object three = bundle.assetBundle.Load("Cube2");


            //加载  
            yield return Instantiate(one);
            yield return Instantiate(two);
            yield return Instantiate(three);
            bundle.assetBundle.Unload(false);
        }
    }

    把此脚本挂在Main Camera上,将当前场景保存为Cube.unity,保存到Scenes文件夹下。


    Assets文件夹下新建Editor文件夹,在Editor下新建ExportAssetBundles.cs脚本,脚本的内容为

    using UnityEngine;

    using UnityEditor;

    using System.Collections;

     

    public class ExportAssetBundles :EditorWindow

    {

       ///<summary> 

       ///将选中的预制分别打包 

       ///</summary> 

        [MenuItem("AssetBundleDemo/CreateAssetBundles By themselves")]

       static void CreateAssetBundleThemelves()

        {

           //获取要打包的对象(在Project视图中) 

           Object []selects = Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);

           //遍历选中的对象 

           foreach (Objectobjin selects)

            {      

                          //Assets下新建AssetBundleLearn文件夹,存放打包的预设   

               stringtargetPath = Application.dataPath +"/AssetBundleLearn/" +obj.name + ".assetbundle";//文件的后缀名是assetbundleunity都可以 

               if (BuildPipeline.BuildAssetBundle(obj,null,targetPath,BuildAssetBundleOptions.CollectDependencies))

                {

     

                   Debug.Log(obj.name +"ispacked successfully!");

                }

               else

                {

                   Debug.Log(obj.name +"ispacked failly!");

                }

            }

           //刷新编辑器(不写的话要手动刷新,否则打包的资源不能及时在Project视图内显示) 

           AssetDatabase.Refresh();

        }


         ///<summary> 

       ///将选中的预制一起打包 

       ///</summary>

        [MenuItem("AssetBundleDemo/CreateAssetBundles Together")]

       static void CreateAssetBundleTogether()

        {

           //要打包的对象 

            Object[]selects =Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);

           //要打包到的路径 

           stringtargetPath = Application.dataPath +"/AssetBundleLearn/Together.assetbundle";

           if (BuildPipeline.BuildAssetBundle(null,selects, targetPath,BuildAssetBundleOptions.CollectDependencies))

            {

               Debug.Log("Packedsuccessfully!");

     

            }

           else

            {

               Debug.Log("Packedfailly!");

            }

           //刷新编辑器(不写的话要手动刷新) 

           AssetDatabase.Refresh();

        }

     

     

         ///<summary> 

       ///打包场景 

       ///</summary>

        [MenuItem("CustomEditor/Create Scene")]

       static void CreateSceneALL()

        {

           //清空一下缓存

           Caching.CleanCache();

    //打包后的资源名为MyScene.unity3d

           stringPath = Application.dataPath +"/MyScene.unity3d";

    //被打包的场景名字为Cube.unity

           string[]levels = { "Assets/Scenes/Cube.unity"};

           //打包场景

           BuildPipeline.BuildPlayer(levels,Path,BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes);

           AssetDatabase.Refresh();

        }

    }

    ExportAssetBundles 脚本完成后,会在unity的菜单栏中出现以上两个菜单,AssetBundleDemo/Create AssetBundles By themselves和AssetBundleDemo/Create AssetBundles Together,选中三个cube的预设,,点击第一个菜单会分别创建三个资源,再点击第二个菜单会将三个预设存入一个资源包中,资源包会保存在AssetBundleLearn文件夹下,运行程序,分别点击"加载分开打包的Assetbundle"和"加载打包在一起的Assetbundle"按钮,会创建被打包的资源。

    隐藏掉Main Camera上的ReanAssetbundle脚本,点击Custom Editor/CreateScene菜单,会在Assets下创建一个MyScene.unity3d资源文件,新建一个Scene场景,命名为Load.unity,拖入一个空的GameObject,新建一个脚本LoadScene.cs,内容如下:

    using UnityEngine;
    using System.Collections;


    public class LoadScene : MonoBehaviour {


        private string url;
        private string assetname;
    // Use this for initialization
    void Start () {
            url = "file://" + Application.dataPath + "/MyScene.unity3d";
    }

    // Update is called once per frame
    void Update () {

    }


        IEnumerator Download()
        {


            WWW www = new WWW(url);
            yield return www;
            if (www.error != null)
            {
                Debug.Log("下载失败");
            }
            else
            {
                AssetBundle bundle = www.assetBundle;
                Application.LoadLevel("Cube");
                // AssetBundle.Unload(false),释放AssetBundle文件内存镜像,不销毁Load创建的Assets对象
                // AssetBundle.Unload(true),释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存镜像
                bundle.Unload(false);
            }


            // 中断正在加载过程中的WWW
            www.Dispose();
        }


        void OnGUI()
        {        
            if (GUILayout.Button("加载打包的场景"))
            {
                StartCoroutine(Download());
            }
        }
    }

    将此脚本挂在空的GameObject上,运行程序,点击会加载已保存的MyScene.unity3d资源包。


    展开全文
  • Unity3d场景快速烘焙【2019】

    万次阅读 多人点赞 2019-12-26 19:09:28
    很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,...

    很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,好不容易烘焙完了,黑斑、撕裂、硬边、漏光或漏阴影等缺陷遍布,惨不忍睹,整体效果暗无层次,或者苍白无力,灯光该亮的亮不起来,该暗的暗不下去,更谈不上有什么意境,痛苦的折磨,近乎失去了信心,一个团队从建模到程序,都没什么问题,可一到烘焙这一关,就堵得心塞,怎么也搞不出好的视觉效果,作品没法及时向用户交付,小姐姐在这里分享一些自己的经验,希望能帮到受此痛苦折磨的朋友,话不多说,开工!

    哦,对了,忘了交代一点,很多朋友总是喜欢追高版本的unity3d软件,以为高版就一定很好,目前Unity3d 2019还处于测试阶段,有人就迫不及待地下载使用,测试版问题很多,用于生产风险很大。unity3d共有三个版本标识,alpha、beta、final,其中alpha是公认的内测版,也就是内部测试版,很多代码都有问题,beta版是公测版,也有不少问题,final版才是最后的正式版,alpha版一般简写为a,例如unity 2019.1.1a8(64-bit)、Unity 2019.2.0a4,这两个版本都是测试版,如果版本标识中有字母b,就是公测版,也不能下载使用,只有带 f 的版本才能用于项目制作,所以现在最高只能使用2018版,很多老司机还在用5.6版,一般都不追高版。

    本文和大家一起探讨的实例效果截图(后续会不断更新):
    在这里插入图片描述

    干活!

    ● 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中重复烘焙。这里小姐姐就不上图了,相信大家都可以自行完成这个操作的。

    ● 社区室外夜景烘焙

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

    ● 游戏场景烘焙

    下面小姐姐和大家一起讨论一下游戏场景的烘焙,当然也适用于VR场景。有的童鞋可能会问,为什么老讲场景烘焙,因为场景的烘焙和后处理是Unity作品的生命线,无论你的作品功能再强大,如果视觉效果太差,立即就被用户否掉了,这就如同每个人的颜值,没有好的视觉效果,别人是不会给你机会的,游戏和VR场景的烘焙和后处理恰恰是决定作品视觉效果的命脉,因此掌握烘焙和后处理对于使用Unity3d开发游戏和VR作品的从业者来说至关重要。

    在讨论游戏场景的烘焙和后处理之前,小姐姐下面想和大家先探讨一下网上很多人经常提问的Unity3d场景卡顿、烘焙质量差和烘焙超慢的问题,因为这些问题常常都是模型引起的,因此我们就从模型说起。

    1. 模型阶段造成U3d光影烘焙问题和实时运行卡顿的因素探讨及消除方法

    需要说明的是,Unity3d自身不具有建模功能,尽管有一款可以在Unity3d内建模的插件,但其功能与流行的专业3D建模软件相比,简直弱爆了,因此小姐姐还是建议大家使用自己熟悉的专业建模软件来构建3D场景。

    前面的例子中小姐姐曾经提到,模型的面数太高,会影响光影烘焙的质量,原因是当模型的UV2(光照贴图UV通道)被展平为指定分辨率的贴图坐标时,模型面数太高,只有每个面都适当缩小才能容纳到贴图坐标中,而这样的缩小,使得一些面小到其所占据的UV空间不足于完全表现其所接受的光照时,那么这些面的光影就会集聚成黑色块、灰色块或白色块,光照贴图回贴到模型上时,就出现了黑斑、白斑、硬边等缺陷,同时因为每个面的UV空间太小,而光照图被过分拉大而使模型上的光影看起来很虚。如果模型面数被大幅降低后,相对于高面模型来说,模型的每个面不需要缩太小就能完全容纳到同样分辨率的贴图坐标中,简单地说,低面模型比高面模型展平后每个面所占的UV空间要大得多,这样就可以让每个面所接受光影的黑灰白过度完全呈现,而不至于集聚成黑色块、灰色块或白色块,也就不会出现常见的烘焙缺陷,同时没有因为光照图被过分拉大,模型上的光影图看起来就很清晰。另外,模型面数越高,烘焙过程中的渲染计算量越大,烘焙就越缓慢。明白了这个道理,大家就应该知道小姐姐为什么要反复强调降低模型面数了,通俗地讲,模型面数越高,烘焙质量越差,烘焙越缓慢,反之,模型面数越低(越少),烘焙质量越高,烘焙越快,因此,要得到好的烘焙质量和提高烘焙速度,必须大幅降低模型面数。

    说到模型面数对烘焙质量和烘焙速度的影响,那么小姐姐不妨将话题展得再开一些,也就是模型面数不仅仅只影响烘焙质量和烘焙速度,而是贯穿从建模到Unity3d作品实时运行的整个过程,为什么这么说呢,且听小姐姐慢慢道来。

    习惯实体建模的童鞋,一定有这样的经验,当场景的规模比较大时,随着模型的越建越多,场景越来越卡,卡到以至于建模进程推进非常困难,甚至鼠标点一下得等好长时间,材质贴图和场景的编辑操作慢的让人心烦,展平UV贴图坐标更是慢的出奇,当然一个比较大的场景一般是多人协同作业,但是最后总要合并到一个场景中的,卡顿还是不可避免的,好不容易完成了整个场景的构建,在导出FBX格式文件时又卡住不动了,最后只好分批导出。到了Unity3d中,和在3d软件中一样,场景的编辑操作也变得非常卡顿,硬着头皮终于完成了Unity3d的场景搭建,实时运行时又被卡住了,发布后的作品就更不用说了。有的童鞋说,自己的机器配置很高,不存在卡机问题,可是发布后的作品不是在你自己的机器上运行,而是要在配置不高的用户机或者手机、网页端运行,所以不大幅降低模型面数,会影响从建模到作品发布后的所有过程,换句话说,用于Unity3d的模型,必须最大限度地降低模型面数。要降低模型面数,得从建模一开始就采用最优化的低面数精简单面建模,而不是等用实体建模完成后才设法减面。实体建模后的减面是被动的,而且这种减面容易造成破面和贴图错乱。

    接下来小姐姐用图解给大家展示一下单面建模的优越性:

    下面第一张图所示的场景是用实体建模构建,从截图左上角的统计数据可见,场景的总面数为9949281,将近1000万个面,如下第一张图所示,场景的编辑操作非常卡,想用边线显示一下半天切换不过来,如此多面的场景导入Unity3d,别说烘焙和实时运行了,就光场景的编辑操作都困难。下面第二张图是孤立显示的这个场景中的一个模型,从第二张图左上角的统计信息可见,这个单个模型的面数为339870,将近34万个面,这么高面数的单个模型对于所有引擎来说,都是吃不消的。下面第三张图是使用3dmax最优化低面数精简单面建模方法重新构建的这个场景的模型截图,由第三张图左上角的统计信息可见,这个场景重建后的总面数为405376,即40多万个面,大幅度降低了模型面数,相比重建前面数缩减了20多倍。下面第四张图是重建后第二张图所示对应的模型截图,由第四张图左上角统计信息可见,这个模型的面数为20593,即2万多个面,比重建前(下面第二张图所示)缩减了15倍。由此可见,要大幅度降低模型面数,必须采用最优化低面数精简单面建模方法 。有的童鞋会说,自己就不需要用单面建模,而是用一些减面的修改编辑器,一样可以减面,没错,修改编辑器是可以减少模型的面数,但是这种减面方法是被动的,减面效果没有单面建模的减面效果好,甚至会导致模型破面或畸形,所以小姐姐强烈建议用于Unity3d的模型最好采用反复强调的最优化低面数精简单面建模方法构建,这里小姐姐用的是3dmax,Maya、Cinema4D等其他3D软件也都有对应的单面建模方法,大家可以自己去网上找。在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    再展示几张采用3dmax最优化低面数精简单面建模构建的单个模型的截图,从下面的几张截图可见,单面建模构建的模型边面非常规整,场景编辑操作流畅,不像实体建模构建的模型那样,边面交错、密集,视图操作卡顿。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在采用最优化低面数精简单面建模时,除了用合理的poly布线来降低模型面数,一些不重要的模型还可用贴图来简化,例如门窗、护栏、围墙和比较费面的结构,使用贴图简化模型是降低模型的面数另一条途径,如下面这些截图所示:
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    3d场景和Unity3d场景中的卡顿除了模型面数太高所致,材质、贴图的数量太多和贴图分辨率太大也是造成卡机的重要因素。对于需要重复贴图的材质,如果纹理相差不大,尽量使用同一材质,同时尽可能使用分辨率较小(如128x128)的高清晰度无缝贴图,有的童鞋在使用重复贴图时,往往不注意无缝贴图的分辨率,找来就用,例如常用一张4096X4096、2048X2048或1024X1024作为重复贴图用于材质,然后通过调整UV让纹理缩小,结果和128x128的纹理效果完全一样,但是大尺寸和小尺寸的贴图所消耗的机器资源相差非常大,所以小姐姐强烈建议使用小尺寸(也就是小分辨率,如128x128)的无缝纹理作为重复贴图,这样可以从重复贴图的角度消除卡顿。而对于无需重复贴图的材质,例如广告牌、指示牌、护栏和围墙及铁艺、百叶窗的镂空贴图,小姐姐建议这些模型使用同一种材质,并将所有纹理合并到一张贴图中,如下图所示,这样就可以使多个使用不同非重复纹理的物体或者物体的面使用同一种材质,不仅减少了材质的数量,也减少了贴图的数量,更重要的是在unity3d作品启动时会更快,因为这些物体只需要加载一张贴图,如果不这样,而是每个物体使用各自独立的贴图,加载会非常慢,这时有童鞋会问,不同物体使用同一种材质,而且每个物体贴图也不一样,这怎么弄呢,这就需要使用手工拆分UV1(材质贴图默认占据一号UV通道),也就是手工展平UV1,即将物体的UV手工调整到这张贴图中这个物体需要的对应贴图区域。这样就可以进一步消除因为重复纹理太大、非重复纹理数量太多和材质数量太多所造成的卡顿,当然这部分是在单面建模过程中需要做的。
    在这里插入图片描述
    好了,建模过程中有关消除卡顿、提高烘焙质量和加速烘焙的一些因素就说到这里。另外,在单面建模完成后,需要对每个物体进行顶点焊合,消除孤立顶点和断点,否则导入Unity3d后会出现模型的撕扯和贴图错乱。最后还要排查重叠面和重叠顶点,否则也会影响烘焙质量和烘焙速度,这个前面已经讲过,这里就不赘述了。

    2. Unity3d场景的视锥剔除、遮挡剔除、和LOD优化及模型阶段的预处理

    在建模软件中完成以上的操作之后,小的场景已经很流畅,但是对于大规模的场景,尽管从建模、材质、贴图三个方面进行了优化,可导入Unity3d实时运行时有时还会很卡,此时就需要使用Unity3d的视锥剔除、遮挡剔除、和LOD技术对Unity3d场景进行进一步优化。要使用视锥剔除、遮挡剔除、和LOD技术,得在3d软件中对模型做一些预处理,因为这些预处理会改变模型,因此需要在拆分UV2之前完成这些预处理。另外需要说明一点,有的童鞋可能因为没有这些概念,就直接跳过这一步去Unity中烘焙场景了,等烘焙完了,才意识到场景的卡顿需要应用视锥剔除、遮挡剔除、和LOD技术,那么所做光影烘焙就全白做了。

    下面小姐姐就结合这个例子的游戏场景来讨论视锥剔除、遮挡剔除、和LOD技术及其在3d软件中的预处理。

    下图所示为这个游戏场景的3dmax模型截图:
    在这里插入图片描述
    在这里插入图片描述
    ⑴ Unity3d的视锥剔除

    什么是“视锥剔除”呢,首先我们需要先搞清什么是“视锥”,如果有3d软件的使用经验,大家应该知道3d软件中相机视野(也称视域)范围的空间形态是一个四棱锥,如下图所示:在这里插入图片描述
    在这里插入图片描述视锥就如同人眼睛的视野一样,视野以外的区域称为盲区,我们把这个空间形态为四棱锥的相机视野就称为“视锥(Frustum)”,视锥也就是相机的视野。那么什么是视锥剔除呢,大家都知道,Unity3d的场景最终是通过相机来呈现的,或者说是通过相机来浏览或渲染的,为了减轻相机的渲染负担,引用了“视锥剔除(rustum Culling)”的渲染机制,也就是让机器只渲染相机视野以内的物体,视野以外的物体会被忽略计算,我们把这种物体处于相机视锥以外时被忽略计算的场景优化机制就称为“视锥剔除”,视锥剔除通过忽略视锥以外物体面数和贴图的计算来减轻相机的渲染负担,从而进一步加速实时运行,为了让大家理解视锥剔除、遮挡剔除、LOD优化,小姐姐胡乱构造一个简单的场景,如下图所示:在这里插入图片描述
    当运行这个场景时,Unity会自动启用视锥剔除,我们在相机视图是看不到视锥剔除的情况,但视锥剔除确实是在起效,为了让大家看到视锥剔除的直观效果,我们将相机视图和场景视图同屏显示,如下面的GIF动画所示,左边是相机视图,右边是场景视图,由右边的场景视图可见,Unity运行时,无论相机移动还是旋转,相机视锥以外的物体都被忽略了渲染计算,也就是被剔除掉了,只渲染计算视锥以内的物体,以此来加速实时运行。与此同时,我们由左边的相机视图可见,并没有因为Unity启用了视锥剔除而发生物体显隐的突变。
    在这里插入图片描述
    在视锥剔除中,那么什么叫物体处于视锥以内呢,Unity3d用物体的最大边界盒来判定这个物体是否在视锥以内,也就是只要物体的最大边界盒有一个点处于视锥以内,就认为这个物体进入了视锥,或者说叫这个物体处于视锥以内了。相反,只要物体的最大边界盒没有一个点在视锥以内,就认为这个物体不在视锥以内了。简单地说,Unity3d是把物体的最大边界盒作为了控制物体渲染与不渲染的触合开关,因为计算物体的最大边界盒要比计算物体本身快得多。有了这样的认知之后,我们可将物体的最大边界盒是否处于视锥以内的概念替换为物体的一个顶点是否处于视锥以内的概念来理解,会更接近大家的自然思维,即只要物体的一个顶点处于视锥以内,Unity就认为这个物体全部处于视锥以内。相反,只要没有一个顶点处于视锥以内,Unity就认为这个物体全部处于视锥以外。此时,有的童鞋会说,那要是一个物体只有很小一部分在视锥内,大部分在视锥之外,按刚才的说法,在视锥之外的那部分也会被认为在视锥以内了,而这部分实际就不在视锥内,机器计算这部分有点多余了,而且会因为这部分没有被剔除而卡顿,是的,要不让机器计算这部分多余的物体,就需要我们在3d建模软件中针对“视锥剔除”优化技术事先对高面数的物体进行合理的拆解或切分,也就是我们在前面所说的预处理。

    另外,有些童鞋也会问,Unity官方的文档说,相机的视锥剔除是自动开启的,可以不用管,小姐姐这么啰嗦有什么意义呢?问题就在这儿,如果小姐姐不啰嗦,一些童鞋就不知道视锥剔除对自己的场景根本不起作用!因为有的童鞋建模时,习惯把很多物体合并(Attach)成一个Poly网格模型,尤其是面数比较多的石头、篱笆、植物等,看似在建模软件中可以加速场景的编辑操作,但是到了Unity3d中,就如同上面说的那样,会因为高面物体处于视锥以外的部分与视锥以内的部分为一体,所以视锥以外的部分不能被剔除,尽管视锥剔除是自动开启的,可压根就不起作用,从而造成实时运行依然卡顿。此时就需要如上所述,在建模软件中将高面物体进行合理的拆解切分。

    Unity的视锥剔除优化除了要求在3d软件中不能合并那些零碎多面的模型外,有时也得把一些多面的其他poly网格模型切分(Detach)或拆解成多个网格模型。另外,Unity3d有个硬性要求,即每个mesh(网格模型,也就是我们前面所说的poly网格模型,即一个物体)的最大顶点数(Vertices count)不能超过65556,有的童鞋不管三七二十一,将整个场景合并成了一个物体,或者将多个物体合并在了一起,导入Unity3d时报错,就是因为导入的模型中,有顶点数超过这个数值的模型,而有的童鞋说,它的模型顶点数比这个数值小很多,导入时还是报错,这是因为Unity导入时会对模型进行些微的重构,此时Unity会自动添加一些顶点,当顶点数超过了上限值时会报错。这个上限值可以作为模型拆解的参考,对于不连续(也就是分离)的mesh,直接拆解就可以了,对于连续(也就是无缝固连在一起)的mesh,拆解时尽量将切缝选在比较隐蔽的转角处,以免烘焙之后出现接缝。

    ⑵ 针对视锥剔除的模型预处理

    有了上面的概念,我们就来对这个游戏场景的模型在3d建模软件中进行视锥剔除的预处理:

    远景为三个山体,如下面第一张图所示,每个山体的面数均为3842,顶点数为1954,如下面第二张图所示,这三个山体的面数都只有不到4k,比较低,顶点数远远小于上限值,所以原样保留,无需拆分。有些杠精会问,那能不能把这三个山体拆分成面数和顶点数更少的物体呢,这样来说吧,一个西瓜没法整个吃下去,我们得切分成小块,切分的原则得方便手持和口咬,但你非要切成细小的渣渣,谁也没办法,可是你觉得这样吃起来方便吗?小姐姐个人的经验认为面数5k左右的,算是面数不多的模型,当然有时2,3万的面数也不是问题,但是超过3万以上面数的模型,就得考虑拆解。所以这些山体就保持原样不动吧。在这里插入图片描述
    在这里插入图片描述
    近景有多个大块的石头,如下面第一张图所示,其中面数最多的石头的面数为5866,顶点数为3045,也远远小于上限,如下面第二张图所示,所以这些石头不用切分成小块,但是如果有人想把这些石头合并成一个物体,导入unity时,可能会因顶点数超上限而报错,因为这些石头的顶点总数已经达到42832了。
    在这里插入图片描述在这里插入图片描述
    近景中还有一些石头阶梯,如下面第一张图所示,其中面数最多的阶梯的面数为5403,顶点数为3018,也可以不用拆分,当然不能合并,原因就不说了。
    在这里插入图片描述
    在这里插入图片描述
    我们还可以看到场景中有一些类似木桥的墙板,如下面第一张图所示,其中面数最多的墙板的面数为5226,顶点数为2861,如下面第二张图所示,和上面一样,无需拆分,也不能合并。
    在这里插入图片描述
    在这里插入图片描述
    另外还有如下图所示的木板,我不知道这个应该叫什么,这些物体的总面数才8k多,总顶点数才4k多,一样无需拆分,也不要合并。
    在这里插入图片描述
    木门的面数只有3760,顶点数只有2248,如下图所示,和前面一样,不用拆分,也不要合并。
    在这里插入图片描述
    下面第一张图所示的是一些篱笆或者叫做栅栏,其中面数最多的栅栏的面数为20682,顶点数为36384,如下面第二张图所示,面数有些高,我们可以考虑将这个物体拆分成4到5个小的物体,但是我们看到这个篱笆由6段组成,我们干脆就将这个物体拆解成6个物体,每个小物体的面数大概在3k多左右,具体就不拆解了,大家可以自己去拆分。其他栅栏的面数均为3448,顶点数为1788,如下面第三张图所示,无需拆分,也不要合并。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    下面第一张图所示为一些木桶,其中面数最多的木桶的面数为12636,顶点数为6800,面数有些高,如下面第二张图所示,可以考虑拆分成三个小物体,其他的面数大于5k的,也可以适当拆分。
    在这里插入图片描述
    在这里插入图片描述
    下图所示的石头的总面数只有3k多,就保持原样不拆分了,也不要合并。
    在这里插入图片描述
    剩下的就是这个场景中最主要的一些物体,有木屋和木塔,如下面第一张图所示,其中面数最多的木屋的面数为64721,顶点数为36489,如下面第二张图所示,顶点数虽未超上限,但是面数有点高,可以拆分成多个小的物体。面数最高的部分是一层的圆木墙,每面墙的面数为4011,如下面第三张图所示,所以将这四面墙各自拆分成独立的物体。二三层的墙面面数也都比较高,也和一层一样,将四面墙拆解出来。剩下的屋顶只有几k,就不再拆分了。
    在这里插入图片描述
    在这里插入图片描述
    另外,下面第一张图的中心区域我们计划用一个略微起伏的地形来填充,如下面第二张图所示,这个地形在3d软件中来构建比较困难,而且贴图如果用3d软件的混合材质来贴,Unity3d根本就不兼容,所以我们还是选择在上面的模型导入Unity3d之后,在U3D中通过画笔涂刷来构建这个地形和为这个地形绘制贴图。地形的面数一般比较高,如果坚持用3d建模软件来构建这个地形,导入Unity后,这个地形不具有u3d涂刷地形的自动优化功能,而Unity3d的地形会根据与相机的距离自动简化地形网格,如下面第三张图所示。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    按照以上的方法和步骤对场景中一些高面模型进行适当拆分后,将其导入Unity3d,无需再做设置,实时运行时会自动剔除视锥之外的物体,也就是忽略视锥以外看不见的物体及其贴图的渲染计算,从而加速运行。

    ⑶ Unity3d的遮挡剔除

    在建模软件中对高面模型合理拆分后,Unity运行时,会自动通过剔除视锥以外的物体来加速运行,此时一些聪明的童鞋会想到,沿着相机的视线方向看过去,常常会有一些物体完全被挡在距离相机较近的物体后面,让机器渲染计算这些物体及其贴图,似乎也是一种负担,没错,确实如此,因此,Unity3d引入了“遮挡剔除”的渲染优化机制,也就是让机器在视锥剔除的基础上再忽略被挡住物体及其贴图的渲染计算,更进一步加速实时运行。小姐姐用下面Gif动画给大家展示一下遮挡剔除的优化效果。
    在这里插入图片描述
    和视锥剔除一样,在相机视图中也是看不到遮挡剔除的情况,但是也确实是起效的。所以我们还是将相机视图和场景视图同屏显示,如上GIF动画所示。因为视锥剔除是自动启用的,无法禁用,所以在使用遮挡剔除优化时,会和视锥剔除优化叠加,由上面的GIF动画右边的场景视图可见,视锥内被渲染计算的物体比前面仅启用视锥剔除时少了很多,两者相差的部分就是被遮挡剔除优化剔除掉的物体。由左边的相机视图可见,遮挡剔除和视锥剔除共同作用下也没有任何物体显、隐的突变。

    遮挡剔除不像视锥剔除那样会自动启用,而是需要在Unity3d中进行一些设置,然后进行遮挡数据烘焙(这里的烘焙与光影烘焙不是一回事)后才可起效。需要说明的是,遮挡剔除分静态物体和动态物体的遮挡剔除,详细可参看小姐姐的CSDN博客文章-Unity3d遮挡剔除(Occlusion Culling)优化这里就不赘述了。

    下面的GIF动画是实际工程应用视锥剔除和遮挡剔除优化的情况,我们依然将相机视图与场景视图同屏显示来观察优化效果。
    在这里插入图片描述
    下面的GIF是上图中右侧场景视图的放大显示:
    在这里插入图片描述
    遮挡剔除也是根据物体的最大边界框是否被其他物体的最大边界框完全挡住,来确定物体是否被剔除,所不同的是,它是沿着相机视线方向,剔除视锥以内,且被距相机最近物体完全遮挡住的物体。

    ⑷ 针对遮挡剔除的模型预处理

    和视锥剔除一样,遮挡剔除的模型预处理也需要在3d建模软件中来完成,而且视锥剔除的模型预处理完全适用遮挡剔除,另外根据遮挡剔除的特点,在3d场景的布局时,尽量将高大的模型布置在场景的中心,以便相机从任何方向浏览时,都能遮挡比较多的物体,或者将面数相对较高的物体拆分成多个物体,使拆分后的物体能够被一些物体遮挡。

    由于这个游戏场景比较小,没有较大的物体,虽然远景的三个山体较大,但面数都比较低,所以就不用拆分了。

    ⑸ LOD优化

    有时由于场景中物体的布局比较松散,物体相互遮挡比较少,此时应用遮挡剔除的优化效果不明显,为了弥补这一缺陷,Unity3d引入了LOD(Level Of
    Detail细节等级)优化,为了让大家理解LOD优化,小姐姐举个生活中大家熟知的例子,相信大家一定有送亲友离别的经验,当亲友在你身边即将离开时,他的面部表情、神态、肢体、着装都可以看得很清楚,当亲友离开一定距离时,只能看到他的头发和衣服颜色,表情、神态和着装细节已经看不清了,再远一些,只能看到他的肢体轮廓,更远一些,他的形体集聚成一个小黑人,最后消失在视野中。我们来分析一下这个过程,无论亲友离你多远,他的面部形态、肢体形态、着装及他的身高等都是不变的,只是随着距离变化,一些细节视觉已经无法分辨了而已。如果用一个3d角色(模型)来表现,反正远处也看不清细节,不如将模型简化一些,贴图缩小一些,这样既不影响视觉效果,还能减轻机器负担。LOD就是利用这样的思路,来优化(加速渲染计算)视锥中经视锥剔除和遮挡剔除优化后剩余的物体,具体地说就是根据物体与相机之间距离的增大,让物体及贴图使用不同的简化版本。下面的GIF用一个球体简单地展示了LOD的优化原理,近处用面数比较多的球体,稍远一点,用一个面数比较少的近似球体,更远处用一个面数更少的几何体,再远就直接剔除掉。我们把距相机不同距离范围所对应的模型及贴图称为细节等级,LOD一般可有3-5个细节等级,分别为LOD0、LOD1…LOD4,默认为3级,即LOD0、LOD1…LOD2,LOD0为最高级,即模型面数最多、贴图分辨率最高,LOD2或LOD4级别最低,即模型面数最少、贴图分辨率最低。
    在这里插入图片描述
    在LOD优化过程中,这几个球体会平滑切换,下面我们将这几个几何体拉开看看,如下面第一张图所示,而实际上LOD的多个模型版本是在同一位置的,如下面第二张图所示。在这里插入图片描述
    在这里插入图片描述
    ⑹ 针对LOD优化的模型预处理

    一般情况下,需要LOD优化的模型,得在3D建模软件中预处理每个细节等级对应的模型和贴图,这个模型可作为LOD0,然后原地(也就是同位置)复制两个这个模型,分别简化(减面和缩小贴图)为两个版本,即LOD1、LOD2,LOD2的面数和贴图要小于LOD1,完成所有需要LOD优化的模型的预处理及其他预处理,就可导入Unity3d中对每个需要LOD优化的模型进行设置了。

    ⑺ Unity3d LOD优化的组件设置

    在Unity中对需要LOD优化的每个高面模型分别添加LOD Group组件,如下图所示,一般高面模型默认为LOD0,选择LOD1,将LOD1对应的的模型添加到LOD1,如下面第二张图所示,以此类推,选择LOD2,将LOD2对应的的模型添加到LOD2,如下第三张图所示。之后鼠标调整LOD的相机距离范围。按同样的方法为其他需要LOD优化的模型进行LOD Group组件设置。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    LOD可用于所有需要LOD优化的模型,但一般主要用于数目较多的植物、石头之类的高面模型, 下面的GIF动画展示了speedtree树木在Unity3d中的LOD优化,我们截取其中一帧进行图解,见下面第二张图所示。
    在这里插入图片描述
    在这里插入图片描述
    由上面第二张图的解析可知,LOD是通过降低被视锥剔除、遮挡剔除优化之后,视锥内剩余且使用LOD优化的高面物体,在相机运距范围的面数和贴图大小,及超出最远距范围时剔除物体,来缓解渲染负担,以加速实时运行。当相机前进时,使用LOD优化的不同物体的细节等级由当前值动态升高,即从LODn向LOD0动态逐级平滑切换,或者从解除剔除向LOD2至LOD0逐级切换。当相机后退时,使用LOD优化的不同物体的细节等级由当前值动态降低,从LODn向LOD2动态逐级平滑切换,直至超出LOD2的距离范围自动剔除。

    LOD优化正是利用物体与相机的距离增大时视觉逐渐模糊和距离减小时视觉逐渐清晰的现象,让处于不同相机距离范围的不同物体使用不同的细节等级,并动态地升高或降低细节等级、剔除、解除剔除,这种模型面数和贴图大小的动态布局,使相机的渲染计算量大幅减小。如果不理解,我们可以用反向思维来推理,也就如果不使用LOD优化,那么无论物体距离相机多远,视锥内的高面物体的面数都保持不变,也没有物体被剔除,此时视锥内物体的总面数远远大于使用LOD优化后的值,视锥内所有物体的贴图所消耗的显存也远远大于使用LOD优化后的值,运行时要比LOD优化后卡顿,LOD优化的优势由此可见一斑。

    好了,关于最优化低面数精简单面建模、视锥剔除、遮挡剔除和LOD优化就说到这里,有的童鞋可能会疑惑,为什么用这么多篇幅讲这些呢?因为很多人在烘焙完场景之后,才发现运行很卡顿,如果没有这些概念,想解决卡顿,根本无从下手。等搞清楚解决卡顿需要这些知识点时,得返回到建模软件中修改模型,模型改变了,场景得重新烘焙,此时,前面光影烘焙所花费的时间就全部浪费了,所以小姐姐不得不在烘焙光影之前,用很多的篇幅把解决卡顿的优化途径给大家作个交代,请大家谅解。下面我们一起讨论一下这个游戏场景的UV2拆分(也就是光照贴图UV坐标的展开),最前面的例子已经讨论过在建模软件中拆分UV2的意义,这里就不赘述了,其实拆分UV2也可算作一种优化方式,即可提高烘焙质量和烘焙速度。另外需要强调一点,模型的改变,会使已经拆分的UV2发生错乱,所以必须在视锥剔除、遮挡剔除、LOD优化预处理完成之后拆分UV2。

    3. 光照贴图UV坐标(UV2)拆分

    大家都知道,光照贴图和材质贴图一样,得有控制贴图的UV坐标,默认的光照贴图通道为2号通道,即UV2,就是常说的第二套UV。材质贴图的UV坐标,默认为1号通道,即UV1,UV1和UV2互不干涉。没有光照贴图坐标,烘焙后的光影会错乱。Unity3d自身的UV2展平功能有致命的缺陷,所以建议大家在建模软件中展平UV2(也就是拆分UV2),下面小姐姐和大家一起在3dmax中拆分一下这个游戏场景模型的UV2。

    前面小姐姐提到,在建模软件中拆分UV2也是一种优化方式,之所以这样说,其一是因为建模软件拆分的UV2永远比Unity3d效果好,Unity3d官方也建议最好在建模软件中拆分,其二是在建模软件中可以让多个物体共享一个光照贴图的UV坐标,也就是将多个物体展平到一个光照UV(UV2)中,这样可以减少光照贴图的数量,使Unity3d作品的加载启动和实时运行更快。

    OK,下面就来拆分,首先选择三个山体,然后将其群组,并命名为“shanti_4096”,然后选择这个群组并展平UV2,因为这三个山体比较大,所以设置其UV2的分辨率大一些,这里设为4096x4096,如下图所示,然后隐藏这个群组,以免忘记哪些已经拆分,哪些没拆分。
    在这里插入图片描述
    接下来,选择所有的大石头并群组,命名为“dashitou_4096”,然后拆分这个群组的UV2,设置分辨率为4096x4096,如下图所示,然后隐藏这个群组。
    在这里插入图片描述
    接下来选择下图中的几个房子群组,并命名为“house1_4096”,然后拆分这个群组的UV2,设置分辨率为4096x4096,然后隐藏这个群组。
    在这里插入图片描述
    下面再选择下图中的几个房子打组,并命名为“house2_4096”,然后拆分这个群组的UV2,设置分辨率为4096x4096,如下图所示,然后隐藏这个群组。
    在这里插入图片描述
    最后选择剩余所有物体成组,并命名为“others_4096”,然后拆分这个组的UV2,设置分辨率为4096x4096。
    在这里插入图片描述
    通过上面的步骤,我们将这个游戏场景所有模型光照贴图拆分成了5个UV,拆分UV2总共用时50分钟,这里需要说明一下,小姐姐所用的UV拆分方法比传统方法快十几倍,传统方法拆分一个光照UV花费几个小时也是常事,甚至长达几十个小时,所以正确的方法对提高工作效率非常重要。

    从上面的截图可见,在建模软件中拆分UV2,可充分利用UV空间,不像Unity3d展平的UV2那样,很多UV空间都被白白浪费。另外,在上面的步骤中,小姐姐是先将多个物体成组,再选择这个组来展平UV2,这样这个组中的物体即会被展平到一个UV中,大家可以按照这样的方法来让多个物体共享一个光照UV,这样可以减少光照贴图的数量。共享贴图已经是一种流行的方式,例如应用程序或网页的所有图标,现在都流行绘制在一张贴图之中,这样可以加速应用程序或网页的加载。再者,这个游戏场景导入Unity3d中后,这些组是可以被Unity3d识别的,如下图所示。需要说明的是,小姐姐在命名每个组时都加一个后缀“_4096”,这个后缀表示拆分这个组UV2的分辨率,因为导入Unity3d后还要为每个组设置与建模软件中一样的分辨率,不标识一下,过后会忘记,虽然这个例子的分辨率都是4096,但更多情况下每个组的分辨率是不一样的,所以建议大家用组的名称来记录其分辨率。
    在这里插入图片描述

    小姐姐上面是用3dmax来拆分UV2的,使用maya、C4D、Modo、Rhino、lightwave、Softimage、Blender等软件建模的童鞋,都可以参照上面的步骤,在自己熟悉的软件中来拆分UV2,方法大同小异。

    4. 将模型从建模软件导出

    拆分好UV2后就可以从建模软件导出FBX格式的文件了,具体导出方法前面已经讨论过,这里你不赘述了。需要说明的是,UV2和其他UV一样,是被保存在FBX文件中的,FBX文件导入Unity3d后,UV2是可以被Unity3d读取的。

    5. 游戏场景的搭建

    这个游戏场景的主要模型是在建模软件中构建,所以直接导入上一步导出的FBX文件即可,具体导入方法前面也已经讨论过,这里就不再说了,导入Unity3d后的场景如下图所示:
    在这里插入图片描述
    前面我们曾经计划在下图所示的位置用Unity3d的地形绘制工具绘制一个地形,用来承载这个场景的主要模型。
    在这里插入图片描述
    在场景中添加一个“Terrain”,设置长宽为100x100,高度为600,然后用画笔工具绘制地形起伏,并用画笔绘制地形纹理。具体绘制过程这里就不赘述了,绘制完成后的地形如下图所示。
    在这里插入图片描述
    地形上需要用地形的涂刷工具批量种一些草,这个等后面再来做。

    6. 材质调整

    因为Unity3d只兼容建模软件中的标准材质和多层次及材质,所以在建模软件中只需要给物体简单贴纹理,并调整材质贴图的UV1即可,其他高级渲染器的材质(如vray、brazil、Finalrender、mentalray)再好,Unity3d都是不兼容的,有的童鞋可能会感觉很失望,其实Unity3d有自己的材质系统,完全可以实现大家所熟悉的各种材质效果。这时有的童鞋会说,既然Unity3d有自己的材质和shader,为什么还要在建模软件中贴材质呢?因为Unity3d的只有2D UV,没有建模软件那样的3D UV(UVW贴图坐标),所以基本材质贴图还是建议在建模软件中来贴,虽然Unity3d的UV是2D的,但是它可以识别建模软件的3D UV。

    好了,现在我们在Unity3d中调整材质。首先,我们可以看到下图中的木质栅栏,材质贴图模糊不清,没有一点质感,选择这个物体,我们看看检视面板中的材质属性,其材质中只有一个简单的纹理贴图,如下面第二张图所示。
    在这里插入图片描述
    在这里插入图片描述
    现在我们按下图所示的步骤,先将“shader”后面的下拉菜单展开,将shader类型由“standard(标准)”改为“Standard(specular setup)(标准高光设置)”,再给主贴图下的高光贴图通道添加一张高光贴图,接下来给法线贴图通道一张法线贴图,然后将一张遮蔽贴图(也就是AO贴图)添加到遮蔽贴图通道,再给第二贴图下的细节贴图通道添加一张细节贴图,最后再给其下的法线贴图通道贴一张法线图,并将法线贴图的UV重复次数均改为5,此时,栅栏的材质效果如下图所示。在这里插入图片描述
    接下来,将第二贴图下的法线贴图强度增加到2,栅栏的材质效果如下图所示,这就是Unity3d材质的魅力,一点而不逊色建模软件的材质质感,此时很多童鞋一定会在想,小姐姐所用的那些贴图是从哪儿来的呢,这是用游戏引擎专门的材质软件生成的贴图,这个比较复杂,如果支持小姐姐的Unity3d布光与场景烘焙及后处理实战视频教程(本文的全部内容都在这个教程中),后续会给大家这个福利。到这儿,木质栅栏的材质就调整好了。
    在这里插入图片描述
    接下来以同样的方法调整小木房子的材质,调整之前的效果如下图所示:
    在这里插入图片描述
    调整之后的材质效果如下图所示:
    在这里插入图片描述
    接下来调整石头的材质,下图为调整之前的的材质效果:
    在这里插入图片描述
    下图为调整之后的石头材质效果:
    在这里插入图片描述
    下图为整个场景调整之前的材质效果:
    在这里插入图片描述
    下图为整个场景调整材质之后的效果,通过对比,我们可以看到,场景中的物体通过材质调整之后有了质感,材质部分就说到这儿,下面小姐姐将和大家大家讨论场景的光照设置,也就是场景的布光。
    在这里插入图片描述
    7. 游戏场景光照烘焙及后处理

    这个例子小姐姐将分别针对日景和夜景两种光照和大家一起探讨游戏场景的光照烘焙与后处理。

    ⑴. 室外日景光照烘焙和后处理

    ①. 灯光设置

    对于室外日景来说,主光源一般只有太阳光,所以我们创建一盏平行光(Directional Light)来模拟太阳的光照。Unity3d的平行光不同于其他3d软件的平性光,没有聚光区和衰减区的概念,所以平行光放置在什么位置无关紧要,光照的投射方向只与平行光的方位角有关,因此选中刚刚创建的平行光,按下图所示,在检视面板中设置平行光的方位角。
    在这里插入图片描述
    接下来设置平行光的颜色为淡黄色,考虑到地形上后续会种草,且草在风力作用下会摆动,所以可以用静态灯光下动态物体的烘焙方法来烘焙场景,因此灯光模式设为“Mixed(混合模式)”,灯光强度设为4,间接光倍增设为2,其他参数默认,如下图所示。
    在这里插入图片描述
    ②. 光照设置

    按下图所示的步骤,进行光照设置。
    在这里插入图片描述
    ③. 光影烘焙

    设置好光照参数后,然后点击下图右下角的“Generate Lighting”按钮,开始烘焙(当然别忘了勾选所有物体的静态设置)。
    在这里插入图片描述

    烘焙整个场景总共耗时19分钟,烘焙完成的效果如下图所示(这样的烘焙速度获益于最优化低面数精简单面建模和在建模软件中的UV2(光照贴图UV坐标)合理拆分)
    在这里插入图片描述
    下面将烘焙的结果从不同角度截图如下,由下面的截图可见,光照图非常干净,没有漏光光、漏阴影、破面、烂面、硬边、亮边、黑边等常见的烘焙缺陷,当然这也获益于单面建模和UV2的拆分。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ④. 植被绘制

    接下来我们在地形上种些草,以增加场景的活力,选中层级面板中的“Terrain”,或在场景中选中地形物体,激活检视面板,如下图所示。
    在这里插入图片描述
    在检视面板中按下图所示的步骤设置草的纹理。
    在这里插入图片描述
    选中刚刚设置的草皮纹理,用画笔在地形上涂刷,即可绘制出草皮,如下图所示。
    在这里插入图片描述
    无论何时,如果想修改草皮,可按下图所示的步骤编辑草皮参数即可。
    在这里插入图片描述
    ④. 植被的烘焙

    草皮种植好后,我们发现草皮上的阴影死黑一片,如下图所示,这是不正确的阴影,原因是草皮是烘焙之后绘制的,另外,草没有象其他物体一样可以设置“Static(静态)”的属性,因此即使草皮是在烘焙之前绘制,烘焙之后,阴影还会和刚才一样死黑一片,这是因为草是批量种植的物体,一旦种植,面会很多,如果用普通物体的烘焙方法,机器吃不消,所以Unity3d禁止了草和树的的静态设置,也就是禁止了静态烘焙,而将草和树木当做动态物体来对待,可通过设置光探测器来烘焙草、树木和动态物体。在这里插入图片描述
    按照下图所示的步骤设置光探测器组,让其包络所有草的范围,当然光探测器组的形态不一定是长方体,可以是不规则形态,小姐姐为了省事,弄成了规则的长方体形态了。
    在这里插入图片描述
    光探测器组布设好后,重新烘焙场景,烘焙完成后,可以看到原来草皮死黑的阴影没有了,如下图所示。
    在这里插入图片描述
    消除草皮的死黑阴影之后,我们又发现草皮有点假,没有层次,如下图所示。
    在这里插入图片描述
    此时添加Ambient Occlusion(环境遮蔽)组件,并设置适当的参数,草皮的层次就拉开了,如下图所示。
    在这里插入图片描述
    如果觉得草不够高,不够絮乱,可以调出草皮纹理编辑面板进行修改,如下图所示。
    在这里插入图片描述
    草皮有了层次之后,应该让草能随风摆动,这样才显得草的活力,此时可按下图所示的步骤为场景添加Wind Zone(风力)物体,并设置适当的参数,运行时,草就会随风摆动。
    在这里插入图片描述
    ⑤. 后处理

    在完成室外日景烘焙之后,有时我们需要为场景营造一些艺术的效果和气氛,也就是常说的“后处理”,首先我们为场景开启雾效,让场景中的背景山体弱化一些,这样不仅增加了纵深感,也可突出了主景,如下图所示。
    在这里插入图片描述
    接下来开启体积光和光束效果,如下图所示。
    在这里插入图片描述
    然后再开启辉光(Bloom),如下图所示。
    在这里插入图片描述
    接下来打开景深(Depth of field),以进一步在增加纵深感,也就是近实远虚,如下图所示。
    在这里插入图片描述
    随后我们开启抗锯齿(Anti Aliasing),让场景中物体边缘更平滑,如下图所示。
    在这里插入图片描述
    此时我们再开启相机的滤镜效果(Vignette),这个效果相信大家在ps中都做过,也就是增加一个黑的图层,然后绘制一个椭圆选区,羽化边缘,删除这个黑的图层的椭圆选区部分,最后的效果是四周是半透的黑色,中心部分近乎透明,Unity的相机滤镜就是透过这样的图层来观察相机视图中的场景,如下图所示。
    在这里插入图片描述
    接下来再勾选自动曝光(Auto Exposure)效果,如下图所示。
    在这里插入图片描述
    最后通过色阶中的色相、饱和度、色温等参数(如下图所示),调节出自己喜欢的颜色和气氛,让场景看起来更加绚丽多彩,小姐姐这里只是随便调了一下,大家可以根据自己的喜好来调节。
    在这里插入图片描述
    下面这些图是从不同角度截取的相机视图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ⑥. 场景优化

    说明:后面将和更新超大游戏场景的烘焙,包含遮挡剔除、视锥剔除、LOD的优化和PBR材质,请随时关注!

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • Unity3d中简单场景漫游的制作

    热门讨论 2020-07-30 23:32:48
    Unity3d中简单场景漫游的制作,个人正在学习中,希望分享交流
  • 最近在学习Unity 3D漫游制作,发现这篇博文,转载过来,感谢原作者,Unity3d场景漫游的制作 Unity3d场景漫游的制作,非常方便!!! 首先在3d软件中准备好模型,我找了个maya制作的房子。 注意:我这里用的是...
  • 解析OBJ模型并将其加载到Unity3D场景

    万次阅读 热门讨论 2015-11-23 10:23:41
    今天想和大家交流的是解析obj模型并将其加载到Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的...
  • Unity3d场景切换

    千次阅读 2016-12-20 09:38:35
    //为了方便演示,在第一个场景内设置一个按钮,点击这个按钮,触发切换新场景时间 ...//在常见组件之前,我们先创建一个createNewScene.cs文件,用于单例模式 //createNewScene.cs using UnityEngine; usin
  • Unity3D 场景摄像机控制 插件包

    千次阅读 2017-11-08 21:56:35
    Unity3D 场景摄像机控制脚本组件 插件包
  • Unity3D自定义资源配置文件

    千次阅读 2019-04-11 11:13:50
    本文另外介绍一个Unity的配置文件(.asset) 该配置文件的优点: 当我们需要将游戏资源里的贴图(Texture)、游戏对象(Gameobject)等预设体保存到配置文件时,这时我们就可以使用该配置文件 但是当关联...
  • Unity3D场景管理器

    千次阅读 2018-05-31 08:02:47
    AppConst类:public const bool LuaBundleMode = false; //Lua代码AssetBundle模式------------------------------------------------------------------------------Packager类:/// &lt;summary&...
  • Unity3D-场景切换&场景间信息传递

    千次阅读 2014-09-11 11:38:42
    我在用Unity3D做一个回合制的战斗游戏,有两个场景(小镇的场景和战斗的场景),每当角色遇到怪兽,游戏就切换到战斗场景,角色就在这里战斗,直到打败怪兽或者被击败。 问题是怎样才能在回到townScene时保持进入...
  • Unity3d导出场景地图寻路

    千次阅读 2015-12-04 18:32:54
    Unity3d导出场景地图寻路(金庆的专栏)Unity3d中用无渲染的透明盒子摆出地面和阻档区域。 this.renderer.enabled = false;所有这些盒子设为Navigation Static.阻档盒子Navigation Layer设为 Not Walkable.用...
  • Unity3D,场景转换和退出游戏

    万次阅读 2018-08-23 16:49:43
    Scnen切换:  1.添加:using UnityEngine.SceneManagement;  2.调用:SceneManager.LoadScene...  value 可以是场景名字,加“”,也可以是数字(Build&amp;Setting里排序)。第二个参数可省略。  ...
  • unity3d 场景设置注意事项

    千次阅读 2013-02-25 15:27:42
    把Fbx和贴图放在同一文件夹内,直接把此文件加拖入Unity内。此时Diffuse贴图应能自动识别。 此时,对贴图修改后,在Unity中更新贴图(删除老贴图,导入新贴图,并保持命名,路经一致),模型能够自动更新。 ...
  • Unity3d游戏开发之漫游场景的制作

    千次阅读 2015-03-12 14:18:34
    Unity3d场景漫游的制作
  • Unity3D 场景渲染到Cubemap 插件

    千次阅读 2017-11-08 22:03:11
    Unity3D 场景渲染到Cubemap文件 插件
  • unity3d 】跳转场景

    万次阅读 2018-07-25 16:09:26
    1、旧版本unity使用Application.LoadLevel()方法,里面传入场景名,或者标签号 标签号查看方式 2、代码展示,这里使用按钮点击调用该方法 using UnityEngine; using System.Collections; public class ...
  • 今天想和大家交流的是解析obj模型并将其加载到Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的...
  • Unity3D打包场景,用www加载场景

    千次阅读 2018-07-13 10:51:27
    1、打包场景(转) 把场景文件打包成 .unity3d 后缀的文件。using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class PackAB { #if UNITY_EDITOR ...
1 2 3 4 5 ... 20
收藏数 12,785
精华内容 5,114
关键字:

unity3d 场景文件