Unity3d办公场景灯光布设与光影烘焙及后处理【2020】
本文小姐姐以一个办公场地为例,和童鞋们再次讨论Unity3d室内场景的灯光布设、光影烘焙和后处理,希望对初学者有所帮助
先看看本案例的部分效果截图:
本文小姐姐以一个办公场地为例,和童鞋们再次讨论Unity3d室内场景的灯光布设、光影烘焙和后处理,希望对初学者有所帮助,本例的3dmax场景如下两图所示,其中第二张图为从后面观察的截图。这个场景的模型面数原本为90多万,面线纵横交错,彷如蜘蛛网,为了优化场景和方便图解,小姐姐用3dmax最优化低面数精简单面建模方法重构了这个场景,由下图左上角的统计信息可见,面数缩减到了21.5万。无论使用Unity3d,还是UE4,或者CE等其他引擎,3d模型都必须用尽可能少的面数来构建,否则后期的光影烘焙和实时运行会遇到灾难性的卡顿,这是小姐姐反复强调的话题了,相信一些童鞋已经感同身受,但是还有一些童鞋硬着头皮往前冲,继续沿用效果图和动画的建模方法构建场景,最后一定会因模型面数太高绊倒在光影烘焙和作品实时运行这个坎上。因此对于VR和游戏场景,模型师一定要采用最优化低面数精简的单面建模方法来构建,无论使用3dmax、maya、C4D、Blender、Sketchup、Modo,还是其他3D建模软件,都应力求降低模型面数。
由上面两图可见,小姐姐重构的场景,拓扑布线简洁平整,看上去很舒服,而且编辑操作流畅无卡顿。
1. 场景结构解析
为了便于童鞋们对本例后续的理解,小姐姐先对这个场景的构造作一详解。由上面两图可以看到,这个场景是一个办公场所,从下到上分别由-1层(地下室)、1层、2层三部分组成,为方便观察,小姐姐将这三层拉开如下图所示。有童鞋可能会认为这三层都无屋顶,其实不然,因为小姐姐是用单面建模构造的场景,这个场景主要表现室内,所以屋顶的正面朝下,从上面看到的是屋顶的背面,所以看上去似乎是镂空的,这是单面建模的特点,面的背面都是镂空的,而当我们从室内观察的时候,屋顶是可见的,如下面第二张图所示。
三层之间是通过楼梯间贯通的,如下图所示,为了让大家看清关系,小姐姐将楼梯间水平向外移动了,并且楼梯间有玻璃幕墙,用来采光。
这个场景乍一看很复杂,仔细的童鞋会发现1、2层大致是左右对称的,如下图所示,这样以来,对于1、2层,我们只需搞清下面第二张图红线部分即可。
下面我们就先来看二层右半部分,室内陈设如下两图所示,其中有沙发、茶几、装饰品、挂画、饮水机、资料柜、椅子、接待台、转角办公桌椅、集中办公桌椅、打印机、复印机、台式电脑、笔记本电脑、货架、饮水杯、台灯、洗脸盆、马桶、书柜、玻璃隔断等。
二层右半部分的功能分区如下图所示,楼梯间右半部分有接待区、大办公区、两个小办公区、会客室、走廊、卫生间等。
通过以上的图解,相信大家对二层右半部分的结构就搞清楚了,与此同时,整个二层结构(如下图所示)也就都明白了。
二层结构搞清楚之后,我们再来看一层(如下图所示),由下图可见,一层与二层相比只是家具布局不同,建筑结构完全相同。
接下来我们再看看-1层,如下图所示,这一层比较简单,一目了然,没有窗户,采光主要依赖于屋顶的格栅灯。
楼梯间与地下室、一层、二层的联结关系如下三图所示,从图中大家可以看到这三层的墙体都有踢脚线和阴角线。
通过以上的图解,大家应该对这个场景的结构有了详细的了解,同时大家也可以看到最优化低面数精简单面建模方法构造的场景边面简洁平整,编辑操作清晰流畅,可大幅度降低模型面数的优势。
2. 模型阶段预处理
小姐姐在别的文章中反复强调,用于VR和游戏的模型,无论你是用3dmax、maya、C4D、Sketchup、Rhino、lightwave、softimage、
blender还是modo等其它软件建模,都必须采用最优化的低面数精简单面建模方法构造场景来大幅降低模型面数,以保证Unity3d中场景烘焙的速度和质量及最终作品的实时运行流畅,同时在模型构建完成后,还应针对模型、材质、贴图、灯光、视锥剔除、遮挡剔除、LOD、和碰撞物进行优化预处理,以免场景导入Unity3d后才发现需要返回建模软件进行前置处理而白白浪费时间。
VR和游戏开发是一项多人协同的作业,建模师虽然不参与美工和程序,但也必须了解这两个阶段对模型阶段要求,除了采用最优化的低面数精简单面建模方法构造场景外,建模师还应了解一些优化预处理的知识点,下面小姐姐对这方面的知识点作一详解。
⑴. 建模方法的优化
很多刚刚接触Unity3d的童鞋,一直沿用以前做效果图和动画的建模方法,也就是习惯用建模软件提供的标准几何体堆砌场景,或者用二维线拉伸、旋转、放样等构件场景物体,并不间断地使用一些布尔运算开洞,这样的建模方法构造的物体面数非常多,模型自交严重,很多面都是无用的,Unity3d甚至UE4、Cryegine、寒霜等所有引擎,都强烈建议使用最优化的低面数精简单面建模方法来构建场景,简单地说,就使用最少的面数来构建场景,因为模型面数是造成卡机的最大祸首,有的童鞋很偏执,就是不改陋习,非要用自己习惯的方法建模,那没问题,往前走几步,必然卡顿在超高的模型面数上。建模方法不同,构建的同一物体的面数千差万别,因为游戏和VR引擎的场景是实施运行的,不像效果图和动画一样,最终只渲染成静帧图片或图片序列,从建模开始,就不注意控制模型面数,会导致后续的很多处理很难推进。最优化低面数精简单面建模,就是用简单的poly,通过切分面线,然后推拉构造物体,有效避免了模型自交,还可大幅度降低模型面数,所以建议大家使用小姐姐推荐的方法来构建场景,上面大家看到的案例场景,就是小姐姐自己构建的,面线平整简洁,面数很低。给小姐姐的《Unity模型预处理布光烘焙后处理特效美工场景优化实战视频教程》一些支持,小姐姐会赠送最优化低面数精简单面建模视频教程,本案例的所有max模型、贴图、Unity3d场景、源代码、插件及更多案例都包含在其中,动手临摹多套案例,才能真正摆脱教程,做出高颜值有卖相的unity作品,否则就如同看菜谱学烹饪,一看就会,一做就废。
⑵. 模型拓扑布线优化预处理
在前面的图示中,大家一定看到如下图所示的物体,我们不妨将它单独移出来,一定有人会问,小姐姐为什么要这样建模呢?这就是所谓的拓扑布线问题,也就是物体上的边线布设问题。一般情况下,物体(poly)的布线应根据物体的造型、材质、贴图、形变以及拆分UV2的需要来布设,同时这些边线的布设决定着模型面数的多少,不合理的布线会使模型的面数急剧上升。
有了解单面建模的童鞋存在很多疑问,觉得单面建模就是尽可能减少模型面数,一些模型的某些面上明明不需要边线,却发现某些面反而布设了边线,这正是物体的布线要根据物体的造型、材质、贴图、形变以及拆分UV2的需要来布设的原因。下面我们先来说说根据物体造型需要的布线(也就是可编辑多边形的边面切分或分割),因为上图那个位置有个窗户,我们需要在那个位置开个窗洞,一般情况下,按照最优化低面数精简单面建模的方法,先构造一个和窗户墙等大的几何体(如下第一张图所示),然后将需要开洞的面的上下和左右边分别布两条线(也就是连接两条线或者分割两条线),形成如下第二张图所示的网格面。
接下来选择中心的面(如下第一张图红色部分所示)删除,形成下面第二张图所示的洞口,同理,在背面也开一个这样的洞口,然后将两个洞口的边缘线桥接,形成第三张图所示的窗户洞。
一些用过单面建模的童鞋认为这个窗洞就开好了,但是,小姐姐认为,这里还需要对布线作进一步优化。原因是上面的方法将窗户墙的前面分割成了8个面(如下图所示),不仅如此,背面也被分割成了8个面,同时,还给每条外边线各增加了两个节点,把每个外边线分割成了三段,导入Unity后,顶面会因前后面各增加的两个节点,自动连接节点生成如下第二张图的6个三角面,底面和两个侧面也会各生成6个三角面,这个窗户墙会变成64个面,unity3d的模型面是按三角面处理的,也就是3dmax中的四边面到了u3d中,会自动连接每个四边面的对角线转换成三角面的,上面的64个面,就是64个三角面,64个面是怎么来的呢,前后墙面各8个四边面,就是16,窗洞4个四边侧面,加起来就是20个四边面,自动转换成三角面就是40个,窗户墙顶面、底面、左右侧面各自会自动变成6个三角面,这样又有24个三角面,40个三角面+24三角面,总共64个三角面。
如果对布线进行一些优化,即将下图中2、3节点与节点1焊合(或叫合并),5、6节点与节点4焊合,7、8节点与节点6焊合,10、11节点与节点9焊合,形成如下第二张图所示的布线,窗户墙的前面就只被分割成了4个四边面,同时也不会分割相邻面的边,这样以来,整个窗户墙(前后各4个四边面,顶底和左右两侧4个四边面、窗户洞4个四边面)总共16个四边面,导入u3d自动转换成32个三角面,这与前面的布线方法相差一半,有的童鞋说,相差一半关系不大,1和2相差一半,没什么区别,大家可别忘了,一个场景50万面和100万面,200万面和400万面区别可就大了。
如果不优化拓扑布线,这样的物体被大量复制,模型面数会急剧成倍上升,小姐姐这个例子比较简单,如果造型复杂,不优化拓扑布线,可不就是2倍的关系了,这也就是这个场景中小姐姐使用这种布线的原因。
下面用图示比较一下同一个物体在3dmax中不同布线之后四边面和顶点区别以及导入Unity3d之后转换为三角面和顶点的情况,如下面两图所示。
从上面的图示可见,不同的拓扑布线,模型的面数和顶点数是不一样的,有童鞋会问,为什么要强调模型的顶点数呢?因为模型的面是由线构成的,线是由顶点构成的,与其说模型的面数太多造成的卡顿,不如说是由顶点太多造成的,有童鞋肯定不服,那我们就在自己熟悉的建模软件中通过修改段数构造一个上千万个面的茶壶,然后将所有面全部删除,只留下顶点,我们会发现,即使没有模型面,顶点太多一样很卡的,也就是说真正的卡机其实就是由顶点引起的,所以在建模的时候,既要控制面数,也要控制顶点数,小姐姐用斜向布线就是让多个三角面或四边面共享顶点,以控制顶点的数量,下图所示的物体,如果用实体建模,顶点和面数会过千,小姐姐只用了几十个面和顶点。
有的童鞋对小姐姐推荐的最优化低面数精简单面建模不以为然,也不服气,来,小姐姐给你一些图震撼一下,请看下面的图。
上面这些低面数模型就是用最优化低面数精简单面建模并配合后面要讲的拆分UV1构建的超低面数模型,如果你是建模师,或者兼做建模,如果不掌握最优化低面数精简单面建模,估计你做不了VR和游戏的模型,不是被后续的美工骂死,就是被老板开掉,如果自己做,场景卡顿会把自己气死。
当然有的童鞋会说,就不用前面所说的单面建模,前面的窗户墙可以用几个box来堆,这样也可以,问题是几个box堆出来的墙体,表面积要比单面建模构建的物体表面积大很多,拆分UV2时,墙体的UV区块只能缩小才能容纳得下,这样会降低烘焙质量。所以强烈建议采用最优化低面数精简单面建模方法来构建模型,并应对所构建的模型的拓扑布线进行优化预处理,以进一步降低模型面数,根据物体造型需要的布线就说到这。
接下来说说根据材质需要的拓扑布线,当一个物体的不同面需要赋不同材质是,则需要在材质的交界处布线,这个大家容易理解。
当一个物体的材质相同,而不同面需要贴不同的贴图时,也需要在贴图的交界处布线来分割面。
对于根据物体的形变要求的布线,多见于曲面物体、异形物体、角色建模,在物体的转弯或转角处布线,这个也容易理解。
根据拆分UV2的要求的布线(如下图所示),这个大家可能不太容易理解,小姐姐用一个大家生活中熟知例子来解释,我们在炒菜时,经常要将菜切断,如果不切断,菜会架空炒锅,使炒锅很多空间白白浪费,理解了这个道理,那么就容易理解根据拆分UV2的要求布线的道理了,也就是当物体一些面的长宽比比较大时,需要在这些面适当布线,将这个面分割成长宽比较小的多个面,因为长宽比太大时,这些面被展平到UV空间中时,为了容纳较长的边,另一边会变得很窄,也就是这些面在UV空间中呈现细长的形态,不仅自身宽度不足表现这些面的光影,还会使所有UV区块密集在UV空间的一角,就像不切菜架空炒锅一样的道理,不利于UV区块的均匀排列,使很多UV空间被白白浪费浪费,最后降低了烘焙质量。
上述的内墙布线既是拆分UV2的需要,也是建模时复制相同物体的需要,布线时能够同时满足多方面的需求是最好的选择,正如一箭双雕之说。这种布线会增加模型面数,但其数量是有限的。为了提高后续的烘焙质量,增加百十个面,不足为奇。
⑶. 重叠、隐藏面优化清理
无论使用实体建模,还是使用最优化低面数精简单面建模,不可避免地会出现重叠和隐藏的模型面,下图所示为重叠面,这样的面在这个案例场景中很多,这里不可能一一标注出来,但是根据图示,相信大家可以判断还有哪些模型面属于重叠面。这些面在实时运行时是不可见的,如果不删除,会使场景的模型面数居高不下,有的童鞋认为有的重叠面很小,可以不用理会,这是错误的观念,所有3d软件对面的识别,无视其大小,所以这些面在建模过程中,应随手删除,尤其是在复制相同的物体之前就应该删除,如果等到整个场景布局完了再删除,工作量可就很可怕了!另外这些面如果不删除,在后面要讲的拆分UV1时,手工拆分的工作量会非常大,同时在拆分UV2时,这些无用的面被展平,会挤占很多UV空间,使真正有效的UV区块缩小,会降低烘焙质量和延长烘焙时间。所以删除重叠面是不容忽视的降低模型面数和提高烘焙质量及加速烘焙的重要因素,这也是很多童鞋场景面数降不下来、烘焙质量差和烘焙缓慢的秘密所在。
下图所示为隐藏面,这些面不同于重叠面,虽然和别的模型面不重叠,但是在Unity3d作品实时运行时,从相机的高度看过去,这些面就像隐藏了一样,根本看不到,这些面的存在,也不仅增加了场景的模型面数,也会为后面要讲的拆分UV1增加工作量,同时这些面在拆分UV2时被展平,也会挤占了很多UV空间,使有效的模型面的展平UV区块缩小,不仅降低了烘焙质量,也延缓了烘焙进程,所以这些面应在建模时及时删除,也强烈建议在复制相同物体之前就删除这些面,当然,有的模型在复制前,由于摆放位置因素,一些背面没有靠墙或背靠别的物体,但是在复制后的另一位置,背面会靠墙或靠近别的物体,形成隐藏面,这些只有等复制后再删除。删除隐藏面也是很多童鞋场景面数降不下来、烘焙质量低、烘焙时间超长的的另一重要秘密。
还有一种隐藏面,是在通过复制一些物体构造另一些物体时,由于疏忽,未及时清除无用的面形成的,如下图中面,是在通过复制有端面的墙体构造连续墙体时形成的,这种面如果不删除,烘焙后墙体会产生黑缝,如下第二张图所示,这种隐藏面的大量存在,不仅会增加很多模型面数,而且影响拆分UV2的速度,同时会降低烘焙会质量。
⑷. 材质、贴图的优化预处理
Unity3d场景中的材质越多,负载越大,材质的贴图越多、尺寸越大,负载也越大,因此应控制材质、贴图的数量及贴图的大小。Unity3d只支持各种3d建模软件的标准材质和由标准材质生成的多层次及材质,不支持各种3D建模软件的高级材质和Vary、MentalRay、FinalRender 、Brazil 等第三方渲染器的材质,所以用于Unity3d的模型,只需在各种3d建模软件中用标准材质简单贴图区分出不同的材质即可,Unity3d有自己材质系统,绝不亚于第三方渲染器的效果。
下面我们来看看这个案例场景的材质和贴图情况,下图中红线框标识的是场景中的材质的示例球,由图可见,整个场景只用了两个材质。
我们先来看看第一个材质(如下图所示),这个材质使用的是3dmax的标准材质,只在固有色通道上贴了一张512×512的贴图,而且这张贴图比较特殊,以往大家所有的贴图都是单一的纹理,而这张贴图包含多个纹理和色块。
上面那张贴图中的部分纹理和色块对应场景中物体的贴图如下图所示,看到这张贴图,很多童鞋百思不得其解,平时都是用一张单一纹理通过重复贴图来贴材质,这个贴图里面这么多纹理,怎么贴到物体上的呢?的确,这种贴图是不能直接贴到物体上,更不能使用重复贴图,而是需要通过拆分UV来贴的,也就是俗称的展UV,前面的其他例子中小姐姐讲过拆分UV2,而这里的拆分UV是拆分UV1,UV2控制的是光影贴图,UV1控制的是纹理贴图,下面小姐姐用几个例子来演示一下如何通过拆分UV1来给物体贴图,需要说明的是,物体的贴图是通过材质贴附到物体上的,贴图不能直接贴到物体上。
按照下图中的提示制作一个键盘物体(红色物),然后将前面的第一个材质赋给这个物体,如下第二张图所示,很显然,材质的贴图是不正确的,下面我们就通过拆分UV1(也称展平UV1或展UV1)来为为键盘正确贴图。
选中键盘物体,为其添加一个Unwrap UVW(展平UVW)编辑修改器,如下图所示,然后点击图中的“打开UV编辑器”按钮。
在弹出的UV编辑器(如下图所示)中我们看到一个白线框,这个白线框是控制键盘物体贴图对应UVW坐标,其形态也是一个box,这个白线框是box的俯视,顶面和底面重叠在一起,四条边对应的是键盘的四个侧面,因为贴图是平面的,侧面这样放置是没办法贴的,所以得设法将侧面展平,并将重叠的底面和顶面拉开。
要展平键盘物体的UV1,按下面图示步骤操作,会自动展平所有面的UV。
自动展平后UV呈现为网格状的面(如下图所示),根据其形态我们大致可以断定这些网格面对应键盘物体的哪些面,当这些面呈现网格状时代表处于选中状态,具体这些网格面对应键盘物体的哪个面,用鼠标点击任意一个,场景中键盘物体的对应面会以红色高亮显示。
当用鼠标点击这个UV编辑器中最下面的UV面时,场景中键盘物体的上面以红色高亮显示,说明这个UV面对应的是键盘物体的上面(如下图所示)。
我们也可以反过来用鼠标点击选择场景中键盘物体上的面,UV编辑器中的与此物体面对应UV面也会以红色高亮显示,例如,当我们选择键盘的左侧面时,UV编辑器中第二个UV面以红色高亮显示,说明这个UV面与键盘左侧面对应(如下图所示)。
掌握了查找物体面和UV面的对应关系之后,现在我们按照下图的提示把材质贴图显示出来。
接下来用鼠标框选前面展平的所有UV面,拖到黑线框外面,黑线框是截图的范围,如下图所示。
接下来鼠标点选键盘上面对应的UV,将其拖动到键盘图案的大致位置,如下图所示。
然后将UV改成节点模式,使用移动、缩放工具,调整键盘物体上面UV的四个顶点到与贴图中键盘图案四个顶点大致重合,此时场景中键盘物体的上面应该正确显示键盘贴图,可是并无变化,还是错乱的,这是什么问原因呢?这就是网上很多二货经常提到的问题,也就是改变材质贴图的UV,物体上的贴图不变。
我们先来看下图中标识的材质面板中贴图的通道,通道值为1,也就是说这个材质上的贴图在通道1上。再看下图右下角展平UVW编辑器的UV控制通道。通道值为2,也就是说,这个展平UV修改器控制的贴图通道是通道2,问题找到了吧?这不就是牛腿绑到马胯上了嘛,要是有人还没看懂的话,我就在解释一下,也就是说UV编辑器中的UV控制的是通道2上的贴图,而键盘物体的材质贴图在贴图通道1上,键盘物体的贴图通道2上没东西,自然材质贴图是不会变化的。
接下来按下图的提示,将展平UV修改器的通道值改为1。
嗒嗒嗒嗒,改为1后,键盘贴图正确显示了,如下图所示。
接下来用节点模式把贴图范围之外剩下的UV调整为大致的正方形,然后把这些UV重叠在一起,如下面第二张图所示。
然后将所有UV的四个顶点调整到对应重合,如下图所示。
用面模式框选重叠在一起的所有UV,用缩放和移动工具将其调整到1行2列的色块内(如下图所示),因为这个色块的颜色与键盘的颜色接近。
放大UV编辑视图,将重叠在一起的UV调整到色块以内,不能和相邻的色块相交,此时我们可以看到,键盘的剩余面都贴上了这个色块的纹理,如下图所示。
最后将键盘的展平UVW修改器塌陷,键盘的最终贴图如下图所示,至此,通过拆分UV1为键盘贴多纹理贴图的过程就结束了。
接下来我们看看这个案例的的第二个材质,如下图所示,很显然,这个材质是用于挂画的,贴图中包含所有挂画的纹理及画框的纹理色块。这个材质和第一个材质一样,都是用的是3dmax的标准材质,也都是在固有色通道上贴了一张多纹理贴图。
这个场景中的材质和贴图方案,巧妙地减少了贴图尺寸、贴图数量和材质数量,大幅度地降低3d场景的内存消耗负担,同时可加速Unity3d作品的实时运行。这种材质和贴图策略,是在建模之前就精心规划好的,而非信手拈来。大家可以想想,如果把两个材质贴图中的色块和纹理都搞成单独的材质,与这种材质方案相比,孰优孰劣不言而喻,因此这种材质和贴图策略值得大家借鉴。但是要应用这种材质贴图方案,得事先精心规划,并且得掌握拆分UV的技术。
小姐姐之所以在这里插入拆分UV1的知识点,主要是为了让大家了解这个案例中的材质及一张多纹理贴图是如何贴到模型上的,希望大家理解。拆分UV1、UV2统称为拆分UV,其实还有UV3…,UV8,总共8个通道,UV1是控制纹理贴图的,UV2是控制光影图的,还可以有控制高度图、颜色图、高光图、法线图的通道,拆分法线贴图,就是传说中的高模转低模,总之,拆分UV是非常复杂的知识点,Maya、C4D、Modo等3d软件都有这样的概念。如果不了解拆分UV1,就没办法使用多纹理贴图来优化材质,不了解拆分UV2,烘焙的光影图一定是模糊和布满脏斑等缺陷的。
⑸. 基于灯光的模型预处理
网上有经常有人问Unity3d光影烘焙之后,墙角、阴角、踢脚线的地方出现漏光或漏阴影的问题,那这到底是怎么形成的呢?我们还是用这个方案的模型来解释,为了降低模型面数,所有VR和游戏引擎强烈建议使用最优化低面数精简单面建模方法来构建场景,而且都是从展示相机的角度去考虑哪些模型面需要构建,哪些可以不用建,例如,下面的场景只是展示室内,没有展示室外的需求,很多人用单面建模构建的这个场景,只建室内相机能看见的模型面,此时屋顶背面、内墙背面、地板背面
都是镂空的,如下图所示。
如果仅用点光源、面光源在室内布光,或用面光源从窗口向室内打光,这没任何问题,因为室内是密闭的,可是常常为了增加GI效果,会开启天光,什么是天光?天光是从无限大一个球体表面所有点沿球半径方向向球心照射的光,因为屋顶背面、内墙背面、地板背面都是镂空的,挡不住天光,使得天光穿墙而过,普照室内场景,烘焙后产生了错乱的漏光或漏阴影,而且室内光影没有任何层次,使用平行光亦是如此。因此在将模型导入Unity3d之前,应将单面建模镂空的模型背面用简单的模型面封闭起来,以阻止光线从不正确的洞口进入,应该让光线从窗口和其他透光孔进入室内,然后经过多次反弹,产生的光影才有层次,这就是很多人烘焙的场景没有层次的根源。对于这个案例的二层,构建一个简单的外墙,露出窗口,挡住镂空的内墙背面,以防光线穿墙而过,如下图所示。
构建简单的2层屋顶外面,就像鞋盒的盖子一样,盖住镂空的二层屋顶背面,以防天光和平行光从屋顶射入,切记要有一定的高度,以防与二层屋顶内表面重合,烘焙后出现花斑。
同理,为一层构建简单的外墙,如下图所示。
构建如下图所示的模型面,用来挡住二层地板背面和一层屋顶的背面漏光,断开的地方是玻璃幕墙,这里应该正确进光。
同理,为-1层构建简单的外墙,这一层没有窗户,如下图所示。
构建如下图所示的模型面,用来挡住-层地板背面和-1层屋顶的背面漏光。
最后构建如下图所示的模型面,用来挡住-1层地板背面的漏光。
通过构造以上的简单模型面,将来自室外的光线全部堵住,只允许室外光线(天光、平行光和置于室外的其他灯光)从正常的洞口(窗口、天窗、门口、幕墙等实际透光口)进入,以产生有层次的光影效果,这些模型面越简单越好,外形都是什么都可以,只要能把光线挡住即可,也不用为其设定专门的材质和贴图,烘焙的时候分辨率可以设得很低,即使有烘焙脏斑、黑斑、甚至全黑都无所谓,因为从室内根本就看不见,如果是静态灯光下的烘焙,甚至可以在烘焙完之后将其删除,它的存在仅仅是在烘焙的时候能挡住非正常进入的光线而已。另外,大家从上面的图示可以看到,门窗和玻璃幕墙似乎没有玻璃,其实不然,这些玻璃正面是朝里的,或者说法线是朝里的,从里面看是有玻璃的,朝里的玻璃可以挡住室内投向室外的光,挡不住从室外入射的光,我们恰恰要的就是这个,请大家不要画蛇添足,再加一个朝外的玻璃,如果加上朝外的玻璃,把室外光彻底就封死了,阳光和天光是不能入射的,如果真的要加朝外的玻璃,烘焙的时候将其隐藏,烘焙之后再显示出来。有的童鞋会说,为什么不用玻璃材质让朝外的玻璃透光,这是可以的,但问题就复杂了,所以按小姐姐说的做是没错的。
另外,室内的格栅灯,在Unity中可以直接将其设为发光材质,来模拟真实格栅灯的光照,如果将门玻、窗玻、幕墙玻设为发光的面光源来模拟大气中粒子反射到室内的光线,这些玻璃烘焙之后再改为玻璃,光感和质感不好,所以我们可不将这些玻璃设为发光材质,而是在这些玻璃的背面构建一些与玻璃等大的面物体,并退后一些距离,然后设为发光材质,向室内投射面光源的光照来照射室内,绝对不能把这些面放在玻璃前面,否则会挡住玻璃的受光,如下图所示,粉红色的物体不用烘焙,且可在烘焙完之后删除。
以上就是基于灯光的模型预处理,这些工作必须在导入unity3d之前完成。
⑹. 碰撞物优化预处理
无论您使用Unity3d开发VR,还是游戏,都会用到漫游相机,因为漫游相机是有重力因素的,为了防止相机自由落体或穿墙、穿物而过,场景中的物体(尤其是地面)必须设置碰撞物(也称障碍物),具体设置如下图所示,但是对于规模比较大的场景,每个物体都设置障碍物属性,实时运行时的渲染运算负担必然加剧,很可能造成卡顿。很多童鞋反映,自己的作品相机跑起来时快时慢,尤其在物体密集处,相机跟黏住了一样,阻力非常大,在物体松散处,相机突然又运行快了,这种现象就是障碍物的实时运算造成的。
那上述问题如何解决呢?按照小姐姐的经验,可在自己熟悉的3d建模软件中,重新构建一个与原场景完全重合的低面数简单模型(或者叫场景的简化版本),如下图所示,这个模型无需赋材质和贴图,导入Unity3d后作为场景的替身,来接受障碍物识别运算,这样,由于这个替身无材质无贴图,,而且面数非常低,同时无需烘焙和实时渲染,所以可巧妙地解决因对原始场景庞大复杂的碰撞运算造成的卡顿,简单地说,就是用一个无材质无贴图不渲染的简单几何体取代材质和贴图复杂且须实时渲染的众多物体来检测障碍物,实时运行立即就流畅很多,具体构造见下图中提示。
模型导入Unity3d后,不要对复杂的场景物体勾选前面图中的“产生障碍物”选项(如果场景复杂,勾选这一项之后,得耗时10几分),而是对简单的”替身”物体勾选“产生障碍物”选项,由于无材质无贴图,而且模型简单,几秒钟运算就结束了。
一个新的问题又来了,我们刚才在上面说过,设置“产生障碍物”得选中assets面板中的FBX文件,如下图所示,而当我们选中FBX文件下的任一模型时,无“产生障碍物”的选项,如下第二张图所示,由此可见设置障碍物是针对FBX文件的,如果将替身物体与场景模型一起从建模软件导出,导入Unity3d后,无法对替身物体单独设置“产生障碍物”,所以应将替身物体与场景其他模型分开,单独导出成FBX文件,如果你习惯的建模软件有“导出选择的”功能,直接选择替身物体,用这个功能导出FBX文件,然后反选,将剩下的场景物体导出成另一个FBX文件,这样,导入Unity3d后,替身物体就可以单独设置“产生障碍物”了,如果建模软件物“导出选择的”功能,就复制一个模型文件,得到两个场景,一个保留场景模型,一个保留替身物体,这样就可以分别导出FBX文件了。
”
前面提到替身物体无需渲染,聪明的童鞋会想到替身物体与场景模型完全重合,一定会闪面,没错,肯定会闪面的,所以小姐姐才提到无需渲染的设置,所谓的无需渲染,就是不让这个物体实时显示,下图中替身物体和场景物体完全重合,鼠标一动就闪面,为了让大家看到替身,按下面第二张图提示关闭场景物体,场景中就显示出了被掩盖的替身物体。
接下来选中替身物体,然后按下图提示取消“mesh Renderer”(实时渲染),就禁止了替身物体的实时渲染,也就是不在场景中显示,但是会计算障碍物,然后将场景物体显示出来,这样就不再会因替身物体与场景物体重合而闪面了。
最后别忘了按下图提示设置替身物体为障碍物,还需要说明一下,因为替身物体取消了实时渲染,无材质无贴图,也不会产生阴影和接受光照,更不会被烘焙,所以不用在建模软件中为其拆分UV1,UV2。
因为这个案例是室内场景,没有室外展示的需求,也就是说相机会被圈在室内,所以替身物体只需构建出墙壁、屋顶、地板、门、楼梯和室内物体即可,需要强调的是,墙壁、屋顶、地板的法线必须朝里,但如果是室外场景或兼有室外场景,还需构造室外部分,了解了上面替身物体的构造,相信大家也就会构造室外的替身了,替身可以合并为一个物体,也可以是多个物体,所有替身应力求精简。
到这里,还需向小白强调一点,建模软件同一个场景中分批导出的多个FBX文件,要将它们从assets面板加载到Unity3d场景中,应该用鼠标将他们从assets面板逐一或一起直接拖入层级(Hierarchy)面板,如下面第一张图所示,这样这些FBX文件中的所有模型会按建模软件中的位置对齐,或者说是保留建模软件中各自的相对位置,这样操作,Unity3d会将FBX文件的坐标原点与Unity的坐标原点重合对齐,因为建模软件同一场景分批导出的FBX文件,具有相同的坐标原点,所以拖入层级面板,所有FBX文件的模型会自动按建模软件中的相对位置放置。但如果是直接将FBX文件拖入Unity3d的场景视图,如下面第二张图所示,Unity3d就会忽略坐标因素,鼠标拖在哪,就将FBX模型放在哪,这样就很难将模型按3d软件中的位置对齐,这种方式适用于从外部导入一个和其他FBX无关的模型放置,主要靠目测调整位置。这是两种不同的加载模型方式,希望大家好好想想两者的区别。
⑺. 拆分UV2
由于Unity3d拆分UV2的功能有致命缺陷,所以强烈建议大家使用自己熟悉的3d建模软件拆分(展平)光影贴图的贴图坐标,即拆分UV2,这一工作应在模型导入Unity3d之前完成,拆分的UV1、UV2都会保存在各类建模软件导出的FBX模型中,导入Unity3d后会被自动识别的。VR和游戏引擎的烘焙,其本质是将所有面所接受的光影渲染到与其对应的展平UV区块上,多个UV区排列成一个光照UV,将光照按照光照UV的排列渲染之后,生成一个光照贴图,最后将光照贴图按照光照UV的关系回贴到对应的模型面上。之所以称之为烘焙,是因为物体上的光影就像烤面包时火的踪迹被烘焙到面包上一样,长在了物体上而得名,如果还不理解,我们可以设想为夏天穿背心和凉鞋,太阳的光照被保留在了皮肤上一样。拆分UV2就是将场景中所有或部分模型面,全部摊平(也就是展平),类似于前面所讲的拆分UV1,只不过拆分UV2,展平是为了渲染光照,而不是像UV1一样展平是为了贴材质贴图。拆分UV2之前,前面所有的预处理工作必须完成,因为一旦改变模型,拆分好的UV2就失效了,必须重新拆分,所以拆分UV2前,得把所有的前置预处理都做好,因为拆分UV2,不是一键就能搞定的,得花些时间,一个UV2拆分几个小时也是有的事,甚至有的人的机器配置太差,拆分几天也是可能的,按照小姐姐视频教程中的方法,几分钟即可完成一个UV2的拆分。
因为拆分UV2是在建模软件中的最后一道工序了,此时我们需要对整个场景进行一下整理编组,一方面是为场景导入Unity3d后易于管理模型,另一方面是为了便于拆分UV2,因为UV2可以按照编组拆分,如果一个物体一个物体拆分,不仅过于零碎,而且工作量太大,所以还是打组后拆分。
我们先将整个场景显示出来(如下图所示),如果你的机器太low,只要关系清楚,也可不全部显示出来,而是一部分一部分显示出来操作。
首先我们选中4个橙色的物体和三层的外墙皮选中编成一组,并用拼音命名为“zheng_guang_ban”,就是遮光板,前面我们说过,这些物体主要是在Unity3d中烘焙时用来挡光的,虽然最终的作品是看不到这些面的,但是要想让这些物体有遮光性,就必须被烘焙,要烘焙就得有光照UV,也就是得拆分UV2,因为他们并不重要,所以可以烘焙的很小,分辨率设为512或256,甚至设为128,反正只是为挡光,烘焙质量好坏都无所谓,最后将分辨率的值加在编组名之后,以便在Unity中识别,这里小姐姐就设置这个组的分辨率为256×256。需要说明一下,橙色的遮光板为三个独立的物体(poly),三层的外墙皮均为一个编组,编组的时候允许组嵌套,这不会影响拆分UV2,编组是为选择和管理方便,拆分的时候会忽视组的存在,对单独的物体逐一拆分。编组完毕,隐藏这个组。
接下来选中场景中绿色的物体,如下图所示,这个物体和三层楼的内部及所有室内物件完全重合,是用来在Unity3d中作场景的替身的,无材质无贴图,无需烘焙,所以也无需拆分,虽然它是单独的物体,你也可以是多个物体,我们也打个组吧,编组命名为“ti_shen”,这里说一下,小姐姐命名用下划线将拼音隔开,是为了大家拼读,有的人不知道是英语不好,还是英文不好,见了字母就发蒙,所以建议这样命名,以便后续美工或程序识别。这个编组不用拆分和烘焙,所以编组名后面就不加分辨率的数值了,编组完隐藏这个组。
接下来选中1,2层内窗玻、门内玻、幕墙内玻后面红色的面,如下图所示,当时我们构造这些面,是想导入Unity3d后为其设置发光材质,用来模拟大气粒子从这些洞口反射到室内的光照,有些童鞋会说,Unity3d有面光源,为什么要多此一举呢?这是因为在建模软件中物体的定位很容易,如果用unity3d的面光源来模拟,需要给每个洞口放置面光源,一个一个摆放,数量太多,加上unity3d的模型面是按三角面处理的,线太多,视觉干扰严重,面光源定位不方便,所以小姐姐直接在建模软件中构造这些面来代替Unity3d的面光源。
我们将这些面编组,并命名“win_light”,因为这些面最终是不可见的,仅仅只是用来发光,就像Unity3d的其他光源一样,无需烘焙,所以也无需拆分UV2,所以在编组名称中我们就不用标识分辨率了,烘焙完可以将这些面删除。我们在编组名称后添加UV分辨率,一方面是为了识别哪些编组需要拆分UV2,另一方面确定这个编组拆分多大的分辨率,当然更重要的是进入Unity3d之后,根据这个标识设定烘焙时光照贴图的分辨率,也就是作备注的作用,分辨率的大小,这个得通过反复实践来总结经验,就像烧菜时的每个调味应该添加多少一样,得动手实践才能准确把握。
到这里有的童鞋一定会问,为什么不把屋顶的格栅灯也加进来,它不是也是要发光的吗,是的,但是格栅灯的发光面既要发光,而且还要可见,小姐姐想直接用格栅灯的面来发光,所以需要拆分UV2和烘焙,小姐姐没把它们加入这个编组,是想通过这个场景中的两个材质之一的通道在Unity3d的材质中玩出发光体,后面大家注意仔细看。
接下来我们选中楼梯间的所有物体,如下图所示,编组为“lou_ti_jian_2014”,设定拆分UV2的分辨率为1024,小姐姐之所以用拼音或英文命名,是为了防止乱码,虽然Unity现在支持中文了,但是一些地方不够彻底,所以还是建议用拼音会英文命名,用下划线分隔,是为了后续的美工和程序便于识别。编组完隐藏这个组。
下面我们选中二层的所有物体编个大组,如下图所示,编组为“2_ceng”,不设定分辨率,编这个组是为了让二层的所有物体在Unity3d中好管理,把所有物体打包在一起。
接下来打开刚编的“2_ceng”组,选中其中的所有内墙、门、窗、隔断、插座,编组为”2_ceng_nei_qiang_2048″,这些物体表面积最大,所以设定分辨率为2048。
然后选中“2_ceng”组里的所有家具,编组为”2_ceng_jia_ju_2048″,如下图所示,这些物体表面积也很大,所以设定分辨率为2048。这里的分辨率只是个表示,拆分UV2的时候会用到。
接下来选中“2_ceng”组里的所有窗帘,编组为”2_ceng_chuang_lian_1024″,如下图所示,这些物体表面积不是很大,所以设定分辨率为1024。
然后选中“2_ceng”组里的所有壁画,编组为”2_ceng_bi_hua_512″,如下图所示,这些物体表面积比较小,所以设定分辨率为512。
继续选中“2_ceng”组里的所有地板,编组为”2_ceng_di_ban_1024″,如下图所示,这些物体表面积稍大,所以设定分辨率为1024。有的童鞋会问,你这地板为什么要一块一块拼,咋不做成一个面,用重复材质贴图重复帖呢,没错,可以这样做,但是这个案例是给大家演示用最少的材质和贴图优化场景,地板纹理和别的纹理共用了一张贴图,没法重复,只能重复模型,而且地板的重复数量有限,所以不会对场景造成太大的压力,可以通过展平UV1,将所有地板的UV1重叠在一起,套合在贴图的地板纹理上,这是另一种贴图方式。
再选中“2_ceng”组里的所吊顶和格栅灯的边框,编组为”2_ceng_diao_ding_1024″,如下图所示,这些物体和地板情况相当,所以也设定分辨率为1024。
最后选中“2_ceng”组里的所吊格栅灯的灯片,编组为”2_ceng_ge_shan_deng_1024″,如下图所示,这些物体的表面积较小,所以也设定分辨率为512。
到这里“2_ceng”组里的所有物体就整理编组完了,然后关闭“2_ceng”编组,如下图所示。之所以嵌套编组,是为了缩短Unity3d中层级面板的树形管理结构,否则导入Unity3d后,物体很多,层级面板拉上来拉下去,半边找不到要找的物体,所以才按关系分级编组管理。
同理,将1层和-1层里的所有物体分别编大组为“1_Ceng”和“-1_ceng”,然后分别将这两个大组里的物体和2层一样再编组。
所有的整编工作结束,我们就可以拆分UV2了,小姐姐之所以把编组和拆分分开,是为了让大家把关系看清楚。
下面下来拆分遮光板的编组,选中“zhe_guang_ban_256”编组,然后隔离(当然也可以不隔离),设置目标通道设为2,因为通道2是光照贴图通道,设置分辨率为256×256,拆分的结果如下第二张图中所示,因为这个组中的物体只是为挡光,分辨率低些无所谓,之前说过,这些物体最后在相机视图中是看不见的,质量差无关紧要。
选中“lou_ti_jian_1024”编组,设置分辨率为1024×1024,拆分的结果如下图中所示。
接下来打开编组“2_ceng”,选中其中的“2_ceng_nei_qiang_2048”编组,设置分辨率为2048×2048,拆分的结果如下图中所示。
选中编组“2_ceng”中的“2_ceng_nei_qiang_2048”编组,设置分辨率为2048×2048,这个编组物体的面很多,拆分UV2花费的时间比较长,耗时4分钟,当然有的人的机器太差或拆分方法不当,很可能会拆分几十分钟或几个小时,甚至会耗时几天,拆分的结果如下图中所示。
接下来选中编组“2_ceng”中的“2_ceng_chuang_lian_1024”编组,设置分辨率为024×1024,拆分的结果如下图中所示。
再选中编组“2_ceng”中的“2_ceng_bi_hua_512”编组,设置分辨率为512×512,拆分的结果如下图中所示。
接下来再选中编组“2_ceng”中的“2_ceng_di_ban_1024”编组,设置分辨率为1024×1024,拆分的结果如下图中所示。
再选中编组“2_ceng”中的“2_ceng_diao_ding_1024”编组,设置分辨率为1024×1024,拆分的结果如下图中所示。
最后选中编组“2_ceng”中的“2_ceng_ge_shan_deng_512”编组,设置分辨率为512×512,拆分的结果如下图中所示。
至此编组“2_ceng”中的物体就拆分完了,然后关闭编组“2_ceng”。以此类推,依次拆分编组“1_ceng”和“-1_ceng”中二级编组中的物体。
从小姐姐拆分的UV2可见,每个光照UV中的UV区块都均匀排列,并充分有效地利用了所有UV空间,而Unity3d的UV2拆分常常将所有UV区块密集在UV空间的一角,如下图所示,右下角的小窗口是2048×2048光照贴图的范围,而Unity3d拆分的UV2全部聚集在小窗口左下角的红线范围内,使大量的UV空间白白浪费,导致实际得到的光照UV很小,烘焙后的光照图很虚、很脏,而且伴有亮光、白斑、黑斑、硬边、撕裂、破面等缺陷。让光照UV充满整个UV空间很难把握,所以强烈建议大家放弃Unity3d的UV2拆分功能,用自己熟悉的建模软件来拆分UV2才是正确的选择。
拆分完所有的物体,全部模型阶段的预处理就结束了,然后将场景从建模软件中导出,导出时一定记得将替身物体和场景的其他物体分开导出,因前面已经说过,要在Unity中对替身物体单独设置“生成障碍物”,就得单独导出FBX。导出前创建一个文件夹,将FBX文件保存在这个文件夹中,然后将场景中引用的所有贴图的文件夹复制到这个文件夹中,最后将这个文件夹拷贝给美工(以防贴图丢失,当导入Unity3d时,如果找不到贴图,会在FBX文件附近的文件夹中搜索)进行场景烘焙和后处理。需要说明的是,以上的预处理小姐姐是拆开来讲的,这仅仅是诠释知识的一种方式,了解了这些预处理,一些可以在建模过程中随手完成,无需等到模型建完再来处理。作为建模师,虽然不参与美工,但了解后续美工的工作流程,对于构建符合VR和游戏实际项目要求和零返工的场景是非常重要的。
3. Unity3d场景搭建
将建模软件导出的FBX场景和替身文件导入Unity3d的Assets面板,如下图所示,然后加载建模软件中的材质和贴图,最后将两个FBX文件拖入层级面板。
从下图红线框处看到,建模软件中的编组被正确传递过来,展开每个编组,里面的二级编组和标记的分辨率数值也都保留了,所以为了管理方便,应养成在建模软件中对模型进行整编的习惯。
选中层级面板中的替身(tishen)物体,按下图提示禁止替身物体的实时渲染,解决替身物体与场景物体的重叠闪面。
接下来选择Assets面板中的替身物体的FBX文件,按下图提示勾选“generate colliders”,让替身物体成为障碍物,也可暂时不勾选,等到架设漫游相机时再勾选。
3. Unity3d灯光布设
Unity3d的灯光布设和其他3d渲染一样,需要根据场景所要表现的时分来确定,例如黎明、朝晨、正午、午后、傍晚、初夜,本案例为一个室内场景,下面针对这几个时分进行灯光的布设讨论。
⑴. 黎明
黎明就是天刚朦朦放亮时分,室内灯光尚未开启,窗口依稀可见微弱的天光,室内物体只见模糊的轮廓,因此只需用环境光或者在窗口布设面光源向室内打光,当然也可用环境光和面光源同时来模拟天光。
用环境光模拟天光可按下图所示为环境光设置天空盒和微弱的光强度。
用面光源模拟天光可按下图所示在所有洞口(窗口、门口、幕墙)布设面光源,或者用建模软件在所有洞口构建替代面光源的几何面,然后在unity中给这些几何面设置发光材质,详见烘焙部分。
⑵. 朝晨
朝晨时分,阳光温和,光线斜射到靠近窗口的房间,室内物体棱角清晰,并有明显的阴影,另外,这个时分还未上班,室内灯光还未开启,因此可用平行光作为主光源来模拟太阳,并以环境光和窗口的面光源为辅助光照亮室内阴暗的地方,效果详见场景烘焙部分。
⑶. 正午
正午时分,阳光充足,光线以较大的角度投射到房间,如下图所示,此时室内灯光已开启,因此用平行光作为主光源来模拟太阳,灯光强度较大,环境光和窗口的面光源以及室内格栅灯的面光源作为辅助光照亮室内阴暗的地方,因为面光源的效果只有烘焙之后才可见,所以详见下文烘焙部分。
⑷. 午后
午后时分,阳光渐弱,投射角度慢慢变小,依然用平行光作为主光源,灯光强度降低,环境光和窗口的面光源以及室内格栅灯的面光源作为辅助光照亮室内阴暗的地方,布光如下图所示,效果见下文烘焙部分。
⑸. 傍晚
傍晚时分,夕阳即将西下,阳光很微弱,投射角度很小,室内格栅灯的面光源作为主光源照亮室内,平行光模拟的太阳光、环境光和窗口的面光源作为辅助光向室内投射微弱的光线,详见下文烘焙部分
⑹. 初夜
初夜时分,华灯初上,窗外微弱的月光和灯火投向窗口的房间,此时办公室在加班,所以用格栅灯的面光源作为主光源照亮室内,用平行光模拟的月光、环境光和窗口的面光源模拟的室外灯火作为辅助光向室内投射微弱的光线,详见下文场景烘焙部分。
3. 场景烘焙
下面小姐姐根据上文和大家讨论的布光方法,对本案例分别进行六个时分的烘焙,为了不让每个时分的设置相互覆盖,我们可以将每个时段保存为一个场景,保存之前,我们得先做一些公共的设置,也就是每个场景共同的设置,这样就不用每个场景重复设置,需要时只需修改参数即可。
首先我们来设置环境光,所谓环境光就是大气粒子、建筑、树木、石头等自然界的物体接受太阳光后漫反射的光。对于一个特定的受光物体,除了直接接受太阳光照外,也会受到周围物体漫反射光的照射,但有时仅受环境光的照射,例如阴天的物体就不受太阳光的直接照射。Unity为了模拟自然界真实的光照,引入了环境光,环境光被集成在Unity3d的光照面板中,下图所示,环境光的设置包括环境光来源、环境光的强度和环境光的模式。
环境光来源是指以哪种方式模拟环境光,包括三种方式(如下图所示):天空盒、渐变色、固定色,渐变色和固定色基本不常用,一般只用天空盒来模拟环境光,所以这里只讨论天空盒,所谓天空盒就是用特殊方法构造的天穹和环境。
当选择天空盒(skybox)方式时,环境光就用上面与天空盒材质链接的天空盒产生环境光了,如下图所示,也就是说天空盒实际上是一种特殊材质,这个材质上贴着天空盒贴图,那么这个天空盒材质是哪儿来的呢?其实就是个材质而已,只不过和平时的Unity3d材质有所不同,下面我们就来定义一下这个材质。
自定义天空盒材质,只需在assets面板中用鼠标右键点击,在弹出的菜单中按下图所示创建一个材质,然后给新建的材质命名,随便叫什么,如“aaa”或“abc”,只要便于识别,这里就命名为“skybox_mtl”,然后选中这个材质,按下图所示的提示选择skybox下的cubemap,此时这个材质不再是普通的材质,而是具有天空盒性质的材质了。
选择skybox下的cubemap之后,还需要为这个材质链接一个Cubemap贴图才能成为真正的天空盒,如下图所示。
找一张适合制作Cubemap的全景图像,导入Unity3d,然后选中这张图像,按下图提示将这张图像的纹理外形的下拉框展开,将纹理外形由默认的2D改为Cube,然后点击右下角的应用按钮“apply”,Unity会将这张图像转换为Cubemap了,如下图所示。
再重新选择天空盒材质,然后按下图所示,将刚转换的Cubemap贴图拖到天空盒材质的Cubemap贴图里,这样一个完整的天空盒就链接到了环境光,也就是这个天空盒可以模拟真实环境的光照了。
现在来看看天空盒到底是什么样子,隐掉场景模型之后就可以看到,如下图所示。
下面两图是相机旋转到另外两个角度时天空盒的截图。
这个天空盒比Unity3d默认的蓝色天空的天空盒生动、自然的多,天空盒的作用不仅仅只是产生环境光、还用于构造室外环境和反射环境,有童鞋一定会质疑,就是一张图怎么会产生环境光呢?好,小姐姐下面给大家演示一下天空盒是不是真的会产生环境光照。为了让大家看清楚天空盒的光照效果,我们创建一个简单的立方体,然后左右旋转天空盒,来看立方体表面的光照变化,下图是0度时的光照。
下图是天空盒在24度时的光照情况。
下图是天空盒在66度时的光照情况。
下图是天空盒在312度时的光照情况。大家对比一下四张图,看看天空盒有没有产生光照,小姐姐刚才是通过旋转天空盒让大家观察物体的光照变化,其实我们可以反过来想,是不是可以认为,处于场景不同角度的模型面,光照是不一样的呢?确实是这样,所以天空盒被很多3d软件引用来模拟环境光照。
认识到天空盒可以产生光照的事实后,可调整下图中的参数来改变天空盒,大家自己调整试试看。
如果需要,可多创建几个天空盒材质,每个材质链接不同的天空盒贴图,当然也可以只创建一个天空盒材质,为其链接不同的天空盒贴图,来满足场景环境光照的不同使用要求。
下图是使用天空盒作为环境光渲染的汽车效果,由下图可见,汽车车身的细节在环境光的照射下补充了主光源的不足,对表现一些细小复杂的结构非常重要,另外,天空盒又模拟真实环境,为汽车车体的高光反射提供了反射源,使反射更真实,质感超好,同时天空盒避免了不必要的环境建模。这就是小姐姐在前面提到的天空盒的三个功效:环境光源、反射源、营造环境。这种天空盒的效果,是Unity3d默认天空盒所不能不及的。Unity3d asset store里的天空盒也基本都是些天空,非常生硬,有些童鞋自己用全景图制作天空盒,不是有缝,就是会挤压变形,小姐姐会为支持《Unity模型预处理布光烘焙后处理特效美工场景优化实战视频教程》的童鞋无偿提供自己精心制作的8k高精度超漂亮天空盒资源,导入即可使用。对于本案例,这个天空盒一方面作为环境光来模拟真实的环境光,另一方面作为室外环境来衬托场景,站在窗口观察,看上去很自然,并能和场景融为一体。对于天空盒作为反射源的作用,因为本案例是室内场景,所以没有意义,我们后面会用反射探测器来为室内物体提供反射源。如果没有这样的天空盒,会让人感觉场景孤零零的,象建在荒郊野外一样的感觉,所以为不同的场景搭配恰当适宜的天空盒非常重要。
这种天空盒可以使用普通的全景图来作,但小姐姐强烈建议大家最好使用HDRI格式(高动态范围图像)的全景图制作天空盒,这种格式的图像,光照效果更好,也是一种流行的光照图像格式。
天空盒除了前面的图像模式,还有unity3d默认的蓝天的那种模式,很多童鞋有时想修改默认的天空盒,但总是找不到修改的地方,这种模式就是程序模式,当按下图的提示选择skybox下的procedural(程序模式)时,我们发现天空盒变成了默认的那种。
当滑动程序模式下天空盒材质的大气层厚度时,大家会发现天空盒发生了变化,反正我不喜欢这种模式的天空盒,而且这种用处不大,如果愿意用这种天空盒,可以自己研究一下。
为了让大家搞清楚环境光和产生环境光的天空盒,小姐姐用了很多的篇幅,绕了一圈之后,我们还是回到本案例环境光的公共设置,具体设置如下图所示。
接下来我们设置一下每个窗口面光源的光照,前面小姐姐说过,Unity3d的物体定位不方便,在每个窗口布设面光源太费时间,而且太多的面光源烘焙渲染非常耗时,所以前面小姐姐在建模软件中为每个窗口构造了一个几何面,然后在Unity中为这些几何面设置发光材质来取代面光源的光照,贴赋了发光材质物体光照的烘焙要比面光源的光照的烘焙快很多。
创建一个材质,这个材质将用于每个窗口替代面光源的几何面,命名为win_light,按下图所示勾选自发光材质,并设置发光强度为2。
选中1、2层窗口构造的要发光的几何面,按下图所示将创建的发光材质链接到要发光几何面的材质组件,也就是将发光材质赋给这些几何面,这时这些几何面就成了发光体,烘焙时就会像面光源一样产生光照,需要注意的是,发光体和面光源一样,产生的光照在实时状态下是没效果的,只有烘焙之后才可见光效。
再创建一个材质,命名为loutijian_light,这个材质将用于楼梯间要发光的几何面,按下图所示设置发光强度为0.5,由于楼梯间的发光几何面有多个模型面组成,如果和刚才一样将发光强度设为2,烘焙时相当于有多个发光面,楼梯间的光线会比窗口亮,这不符合实际情况,所以这里将发光强度适当降低一些,综合光照效果就会和窗口相当了。
选中幕墙要发光的几何面,按下图所示将刚创建的发光材质赋给幕墙的发光面,这样这些几何面在烘焙时就会产生光照了。
之所以为窗口和幕墙独立创建发光材质,是为了分别给两者设置不同的发光强度。
接下来我们为每层屋顶格栅灯的几何面设置发光材质,并命名为geshandeng_light,然后设置发光强度为1,如下图所示。
接下来选中三层的所有格栅灯几何面,将刚创建的材质赋给这些几何面,如下图所示。
接下来创建平行光来模拟太阳光或月光,因为Unity默认已经创建了一盏平行光,所以我们直接利用即可。
因为办公室的一些桌上有台灯,这些台灯物体不会发光,所以还得为这些台灯创建一些点光源,当然不一定要为每个台灯都要创建点光源,因为点光源的渲染烘焙非常耗时,所以适当点缀即可。
按下图所示,创建一盏点光源,将其位置调整到靠近台灯灯头的下面,切记不要被封死到灯头里,否则看不到点光源的光效。点光源有一个调整衰减范围的几个球,上面有几个把手,拖动可调整点光源的衰减范围,台灯的光照范围有限,这个衰减范围就是控制光照范围的,也就是点光源从中心开始沿半径向外逐渐衰减为0,衰减范围之外,不会照亮物体,如果开启阴影,衰减范围之外自然也不会有物体的阴影。
同法泡制,为需要光照的台灯物体创建点光源,如下图所示。
最后为每个房间创建一个反射探测器,用于烘焙光影时采集每个房间的反射环境,有童鞋一定会想,为什么不直接给每层创建一个反射探测器,而要给每个房间创建一个反射探测器呢,我们可以这样来想,如果给每层创建一个反射探测器,那么在某个小房间的反射物体上会映射距离这个房间很远的房间的物体,这是不符合实际反射的,因此应将反射探测器限制在每个房间。
如果不在公共设置部分创建好反射探测器,等复制出六个场景后,创建反射探测器的工作量会非常大的。
接下来我们就按下图所示创建一个反射探测器(Reflection Probe)。
反射探测器的默认空间形态为一个立方体线框(如下图所示),立方体的体心有一个探测器中心(如下第二张图所示)。
反射探测器在Unity场景中的位置如何调整大家都懂得,这里就不说了,其大小可按下图所示来调整。
反射探测器中心的位置可按下图所示来调整。移动反射探测中心和移动反射探测器不是一回事,每个反射探测器的中心应尽量置于反射探测器的体中心位置,当调整反射探测器大小时,中心就会偏移,所以需要对其进行调整。
有了上面这些知识的铺垫,我们就可以为每个房间创建反射探测器了。首先我们先来做一个房间的,如下图所示,将前面创建的反射探测器移动到二层的一个房间的大致位置,然后用反射探测器的编辑工具将反射探测器的6个面调整到完全包络这个房间所有物体。
然后再将探测中心调整到反射探测器体中心位置,如下图所示,这样这个房子的反射探测器就搞定了。
以此类推,按照上面的方法为所有房间创建反射他测器,如下图所示。需要注意的是,如果某个房间没有反射材质的物体,就不用创建反射探测器了。
接下来我们按下图所示为在建模软件中编组的带有分辨率数值且按这个数值在建模软件中拆分UV2的物体组设置参数,由下图可见,层级面板中物体组的命名完全和建模软件中一样,之所以在建模软件中打组时给需要拆分的UV2的物体组名称后面标注分辨率,就是为了在这里设置时提示,否则到这里把建模软件中拆分时的分辨率数值全忘了。
按照上面的步骤同法泡制,对层级面板中所有标注分辨率数值的物体组逐一进行参数设置,这样在烘焙时,所有物体组就都会按照建模软件中拆分的优质UV2进行高质量烘焙了。如果机器配置太low,或场景规模太大,就得分批次烘焙,选中哪些物体组,就会只烘焙哪些物体组。当然,如果想快速测试一下场景的灯光效果,就得分批次烘焙,也就是只选择一个或几个需要测试光影效果的物体来烘焙,否则就得花很长时间等所有物体烘焙完才能看到大致的效果。
至此,所有的公共设置就完成了,现在我们将案例的场景名修改为bgcj_lm(lm代表黎明),如下图所示。
等黎明时分的场景烘焙完之后,我们再将bgcj_lm另存为bgcj_zc(朝晨),如下图所示,这样我们可按照时间顺序,让后一个时分的场景设置在前一个时分的基础上修改,避免一些重复设置。
以此类推,当前一个时分烘焙完成,依次将场景分别另存为bgcj_zw(正午)、bgcj_wh(午后)、bgcj_bw(傍晚)、bgcj_cy(初夜),这样我们就可以一个跟一个,最后得到了对应6个时分的6个场景,如下图所示,这样做的目的一方面是让后一个时分的场景能在前一个时分场景基础上修改,另一个方面是能让每个时分的设置相互独立,避免相互覆盖,全部烘焙完成后的场景文件如下图所示。
⑴. 黎明时分的光影烘焙
打开前面另存为bgcj_lm的场景,因为黎明时分是没有阳光的,所以可以关闭平行光,如下图所示。
黎明时分台灯也是不可能开的,所以关闭所有点光源,如下图所示。
黎明时分所有格栅灯也是不可能开的,所以关闭所有格栅灯发光面材质的发光,如下图所示。
在前面的灯光布设部分小姐姐提到,黎明时分可以用环境光或者在窗口构造的发光面来产生光照,那么我们现在就先用环境光来照亮场景,暂时关闭窗口的发光面,如下图所示。
前面小姐姐和大家讨论的环境光一般用天空盒来产生光照,对于黎明时分,天空盒的光照强度比较低,所以应该降低环境光的强度到0.5,如下图所示。当我们拖动环境光强度的滑杆时,场景中环境光照的亮度会发生变化。
环境光除了光照强度,还有光照颜色的因素,环境光的颜色是由天空盒决定的,所以选中天空盒材质,将天空盒的色调调为深蓝色(如下图所示)。黎明天刚蒙蒙亮时,天光的颜色就是深蓝色,在天光照射下,室外环境也呈现深蓝色。(有童鞋可能会问天空为什么总会和蓝色有关呢,例如黎明天空是深蓝色,晴朗的白天天空是淡蓝色,还有远处的山为什么也是苍蓝色、海水也是蓝色,这是因为在物理学中,蓝色光的波长最长,传的最远,所以最远的东西,只有蓝色光会被人们的肉眼所感知,所以会呈现蓝色)。
调整天空盒的色调后,我们发现天空盒还是太亮,此时可以降低天空盒的曝光度,其实就是天空盒的亮度,将曝光度降至0.4,如下图所示,天空盒的颜色基本符合黎明时分了,但是我们发现,虽然曝光度降低了,可是天空盒的贴图上有一个明显的太阳,太亮,如果从窗口看出去,这不符合黎明的气氛,所以天空盒得换一个没有明显亮光的贴图。
将天空盒换成如下图所示的贴图之后,既消除了上面天空盒中太亮的太阳,而且看上去更符合黎明的室外环境和天空气氛,那么我们就用这个天空盒来照亮黎明时分的场景。这里需要说明一下天空盒的曝光度和环境光强度的关系,曝光度控制天空盒的亮度,这个大家调整滑杆就可以看到天空盒的变化,曝光度还控制着环境光的光照强度,当滑动曝光度滑杆时看不到场景中环境光的变化,但是确实会影响环境光的,只是只有烘焙后才能看到效果,大家可以自己试试看,既然曝光度和环境光的强度都影响环境光的光照,那么两者到底有什么关系呢?环境光的光照是来自天空盒,曝光度可以理解为天空盒光照的总阀,环境光强度可以理解为环境光的终端阀,也就是说光强度再大,曝光度比较低,实际光照也会很低,反过来,曝光度再大,光强度很低,实际光照也很低,就像家里水表前的阀门和水龙头的关系,也就是说,在给定天空盒曝光度的情况下,环境光强度越小,环境光照越弱,反之,调大环境光强度,环境光照越强。而在给定环境光强度的情况下,天空盒的曝光度调小,环境光照越弱,反之,如果调大天空盒的曝光度,环境光照越强。环境光的曝光度一般根据天气或时间段的情况来调整,比如黎明时分,天空盒的曝光度就得降得很低,正午时分天空盒的曝光度得调大或保持默认值,希望大家正确理解。
环境光设置好后,接下来按照下面的图示(红线标注)设置较低的烘焙参数,先来测试黎明时分场景的光影。使用较低的参数是为了用最短的时间烘焙出结果,大致浏览一下灯光的光照情况。
接下来仅选择层级面板中2层的所有物体群组、楼梯间群组、遮光板群组(即后缀带有烘焙分辨率数值的群组),然后点击光照面板右下角的“Generate”按钮,Unity就开始烘焙只选择的物体,如下图所示。
用上面设置的参数烘焙选择的物体,耗时7分钟33秒,光感还行,就是质量太差,如下图所示。
接下来我们按照下图所示,提高参数设置,重新烘焙。
按照上面的参数重新烘焙,耗时11分17秒,烘焙结果如下几张图所示。由图可见,仅在环境光(hdri天空盒)的照射下,房间的窗口附近产生了非常漂亮的光效,虽然光线暗淡,室内物体模糊,但层次还是分明的,这是符合黎明(天蒙蒙亮)时分光照的。
上面我们是单独用环境光照射的场景,前面小姐姐说过,也可以单独用窗口的发光几何面来照射(当然大家也可以用unity的面光源来照射,但是每个窗口布设面光源工作量太大,而且太多的面光源烘焙很费时,所以小姐姐在建模软件中为每个窗口构造了一个几何面,来代替面光源,然后给这些结合面设定发光材质,发光材质烘焙要比面光源烘焙速度快得多),下面我们就关闭环境光,单独用发光几何面来照射。
那么如何关闭环境光呢?只要将环境光的强度设为0,环境光就失效了。
下面我们将2层窗口事先构造的发光几何面全部选中,如下图所示,勾选其材质中的Emission(发光),并设置HDR发光强度为0.5,因为我们已近关闭了环境光,此时场景仅受可发光的几何面单独照射,点击“Generate”重新进行烘焙。
按上面的设置烘焙,耗时12分25秒(如下图所示),由下图可见,单独使用可发光几何面照射,一样可以得到与单独使用环境光照射烘焙的结果,而且可发光几何面单独照射烘焙后的结果,更有层次。
前面小姐姐说过,黎明时分的光照也可以用环境光和可发光几何面共同作用来模拟,现在我们就同时开启环境光和可发光几何面的发光材质来照射场景(具体参数如前所述),然后重新烘焙,结果如下图所示。
由上面的图可见,在环境光和可发光几何面的共同照射下的烘焙结果比两者单独照射的效果更好,虽然室内物体光照不足,但层次还是可见的,所以如果表现黎明时分的光照,建议使用环境光和窗口的面光源或发光几何面共同照射场景,环境光可理解为主光源,可发光几何面作为补光来弥补环境光的不足。
小姐姐之所以单独使用环境光和可发光几何面,是为了让大家单独体会一下这两种不同光的光照效果,希望大家理解。
至此,黎明时分的光照就烘焙完了,按照前面的规划,要烘焙朝晨时分的光照,我们只需将黎明时分的场景另存为bgcj_zc,这样场景bgcj_zc就继承了场景bcgj_lm的所有设置,当修改场景bgcj_zc时,不会覆场景bcgj_lm已经完成的光照等相关设置,话不多说,直接将场景bcgj_lm另存为bgcj_zc,下面就来设置和烘焙朝晨时分的场景。
⑵.朝晨时分的光影烘焙
下面将场景bcgj_lm另存为bgcj_zc,朝晨时分的场景就自动激活(或称为当前编辑的场景)。前面我们已经讨论过,朝晨时分阳光温和,光线斜射到靠近窗口的房间,窗户附近的物体棱角清晰,并有明显的阴影,另外,这个时分还未上班,室内灯光还未开启,因此可使用平行光作为主光源来模拟阳光,并以环境光和窗口的可发光几何面为辅助光(或称补光)来照亮室内阴暗的地方,因此开启前面倍关闭的Unity默认创建的平行光(如下图所示)。
用上述的灯光进行烘焙,结果如下图所示。
下图为背面没有阳光投射房间得烘焙效果。
有上图可见,窗口附近的物体清晰可见,远离窗口的物体还是比较暗淡,这是符合常理的,如果有童鞋在一些写字楼工作过,刚上班还没开灯前的房间效果大致应该是这样的光照效果。