在“构件更好的三维网格体这部分”,我们会讨论包括系统单位、三角面数量、材质ID、枢轴点,我们会学习什么是光照贴图,然后介绍如何创建光照贴图。我们将学习碰撞网格体的创建和使用,细节层级或 LOD,最后介绍如何限制过度绘制。
无论你使用哪种数字内容创建软件(DCC),创建对象前你需要先确定系统单位。本文中,我将使用 3d Studio Max,不过我涉及到的原理适用于所有数字内容创建软件。首先,我们需要确保将系统单位设为厘米,因为厘米是虚幻引擎4默认的测量单位。在虚幻引擎4中,一虚幻单位等于一厘米。
打开 3d Studio Max,我们要确保系统单位被设置为厘米。方法是点击顶部菜单栏的“Customize”->“Units Setup”,然后点击“System Unit Setup”,将单位设为厘米。然后我们要确保将显示单位也设为厘米。
确保DCC中的比例与UE4比例一致非常重要,原因就在于这样能保持沉浸感。无论你营造的沉浸感有多强,只要用户在体验时发现场景相对于现实世界变得太大或者太小,你营造的所有沉浸感都会化为乌有。对于VR来说尤为如此,当玩家伸手捡起一个对象,比如一个杯子,假如杯子在玩家手中非常大或者非常小,他们很快就会丧失沉浸感。为了解决这类问题,在项目开始时设置正确的比例能够极大程度地避免任何潜在的比例问题。
三角面数量直接与你的项目体验挂钩,虽然虚幻引擎可以在屏幕中同时显示数百万个多边形,但在实践中仍需仔细斟酌。当你在DDC中时,请务必开启三角面计数功能。回到3ds Max 中,让我按下键盘上的7键,在左上角会显示多边形数量。
当你在UE4中编辑模型是,需考虑以下几点:首先,不要为小细节建模,比如小螺母或小螺栓,玩家不会注意到这些细节,你浪费这些多边形数量,打造的额外细节不一定会为你带来好处。在构造对象时,请务必在DCC和虚幻引擎4中,经常查看多边形数量。打开静态网格体编辑器,在左上角你能看到LOD、当前屏幕大小以及更重要的三角面数量和顶点数量。在静态网格体编辑器和DCCzech经常关注这两个数值,有助于确保你正在创建模型,确保它既漂亮又节省开销。
所有对象,无论你打算显示何种的对象,都至少拥有一个材质ID。材质ID有助于确认多边形面使用的材质类型。遗憾的是,它的缺点是,对象每多用一个材质ID,它就需要被多渲染一次,以便显示该材质效果。例如,加入一个物体上有五个材质ID,它就需要先被渲染5次,然后通过一次最终渲染显示出来。下面的示例是一个带有两个材质ID的模型,顶部有一个材质ID,底部还有一个材质ID。
在3ds Max中,按下键盘上的M键,打开材质编辑器。让我选中一个新的示例球,选中“从对象提取材质”按钮,然后选中模型上的材质。注意模型上有多个子对象材质,如果你在3ds max中需要为对象分配多个材质,你就需要使用这种材质。在你刚创建项目时,你最好为游戏中的各种对象制定好材质ID数量的使用规范。例如,小道具或场景装饰对象应该只有一个材质ID,而角色或武器这类对象,可以有两个或三个材质ID。如果你要使用大型建筑,你可以为地板设置一个材质ID,为墙壁设置一个,为天花板设置一个。记住,每添加一个材质ID,模型的渲染开销就越大,要制定一个管理计划,然后在整个项目周期中坚持执行计划。
UE4中的对象如果使用了错误的枢轴点位置,可能会浪费数分钟、数小时乃至数天的时间,因为美术师在放置对象前,不得不先调整对象的位置。如果你在DCC中正确设置了枢轴点(位于DCC中的0,0,0原点),美术师就不需要这样做。他们可以直接放置对象而无需调整其位置。
光照贴图是专门用于保存光线和阴影复杂信息的纹理,这是因为纹理的开销很低,非常适合存储这类数据,保存在纹理中的另一个好处是,将光照计算信息保存在纹理中,意味着我们在运行时几乎能以零成本获得这些信息。在UE4中,光照贴图是在高质量场景和高性能场景之间保持平衡的关键。
下面有一张光照贴图和一张阴影贴图,光照贴图和你平常看到的贴图稍有不同,这是因为光照贴图的红、绿、蓝通道中存储着不同类型的数值,这就是为什么它看起来有点像五颜六色的维诺图。这些实际上是不同区域的光照信息,它们全都被写入了红绿蓝通道。
在下面的阴影贴图中,你会发现,这类信息更明显。注意,阴影贴图有一点绿色,但主要颜色是红色,这是因为绿色和红色表示不同的阴影信息,所有阴影数据全都被写入了阴影贴图的红绿蓝通道中。
首先,光照贴图需要对象上的每一张面都位于0到1的UV空间中,这些面还需要被单独放置,即他们在UV贴图中不能相互重叠。
当我们渲染光照贴图时,Lightmass实际上只关心0到1空间内的数据,所以任何外面的数据都会被裁剪。我们需要做的另一件事是,确保UV贴图内的对象没有相互重叠。原因很简单:考虑下面这种情况,假设我们正在制作一张桌子。为了节省空间,我们可以让桌面上层和下层的UV在UV贴图中相互重叠,这样就能节省出很多空间,并且提升桌面上下两层的细节丰富程度。然而,上下两层将会显示完全相同的细节,显然对于底色纹理,这不会导致问题。但当你使用阴影贴图或光照贴图时,桌子上下两面就会呈现完全相同的阴影信息。这将意味着只应该在下面显示的阴影会出现在上面,使对象的光照效果显得异常。要完全避免这个问题,请确保你的贴图位于0到1的UV空间内,并且没有重叠。
还有值得注意的一点是,在设置UV通道时,在面板中需要选择UV通道2。这是因为光照贴图UV需要存储在模型的第二个通道中。这里有点令人困惑,因为在3d Studio Max 中,我把它叫做“通道2”,而在虚幻引擎中,它称作“通道1”,原因是虚幻引擎是一种把0作为初始计数的软件,而3ds Max从1开始计算。记住,在3ds Max里面,光照贴图UV需要使用第二个通道,而在虚幻引擎中,UV需要使用第一个通道。
让我们打开虚幻引擎,我们其实能看到光照贴图的作用,我们能看到阴影似乎是动态投射到模型上的?实际上阴影是烘焙进模型的,阴影百分百没有任何开销——呃,应该说90%的阴影没有开销,其实还是有一点开销的,因为要在内存中保存纹理。但从任何角度来说,这个对象的阴影贴图相当于没有任何开销。
如果选中模型,并按Ctrl+E打开静态网格编辑器,我可以点击“UV”。在左下角,这是第一个UV通道。注意,左边有一些红线,它看起来非常复杂,这是因为这个对象的部分UV实际上超出了在0到1的UV空间。虚幻引擎把所有这些部分塞进了0到1的空间范围内,它不会影响UV的渲染方式,只会影响它在静态网格体编辑器内的外观效果。
我们不用关心这个通道,因为这是“UV通道0”我们要关心的是“UV通道1”,也就是光照贴图UV。可以看到这张UV的布局相比3d Studio Max 中的布局略有不同。这是因为网格体的光照贴图被设置成在导入时自动展开。
我想讨论的最后一点是,在虚幻引擎中如何设置光照贴图分辨率或者改变光照贴图的坐标索引。首先,找到“细节”面板的搜索栏,然后输入“Light”向下滚动后能找到“Light Map Resolution”以及“Light Mao Coordinate Index”。我可以在这里编辑光照贴图分辨率以及光照贴图坐标索引。
然而,你可能需要在工作场景中编辑光照贴图分辨率,为此,你只需要选中网格体,找到“细节”面板,搜索“Light”,在“细节”面板的“Lighting”分段下,找到“Overriden Light Map Res”。如果我启用该选项,我可以输入任意的分辨率,这就是光照贴图分辨率的覆盖方法。
在虚幻引擎4中,碰撞可以用来界定许多内容,碰撞可以用来判断,你是否碰到了某个场景对象,它被用于物理模拟,使对象与场景发生碰撞以及对象相互间发生碰撞。碰撞能用来确保,玩家可以在他们站立着的地面上走动。有两种方法可以在UE4中创建碰撞,你可以在DCC中创建碰撞,然后把它和几何体一起导入,或者你可以在虚幻引擎内创建碰撞。
首先,我们来看看在3ds Max中创建碰撞。为此,在右侧找到“Object Type”,选中“Box”,接着创建一个盒体,按下Shift+A键对齐。把盒体与模型对齐,调整盒体形状,以便契合模型的大致轮廓,不一定要完全契合,只需有个大概样子。
然后你可能会以为只要全部选中它们,然后导出就可以了。但实际上并不是这样的,首先要做的是,我们需要用一个非常具体的名称,为这个碰撞盒命名,命名以“UCX_”开头,然后是网格体全称,最后是碰撞盒编号,即“UCX_(FullNameOfMesh)Number”。 假设这个模型有30个碰撞盒,那么命名就是 “UCX”加上网格体名称,然后是碰撞盒编号,比如1、2、3、4、5等。现在在我们为这个碰撞盒命名后,当我们导入这个模型时,虚幻引擎会识别命名,然后说“嘿,你知道吗,这实际上不是渲染用的几何体,而是碰撞几何体,所以我要设置成碰撞盒”。
现在我们准备好导出了,选择所有对象,点击“File”>“Export”>“Export Selected”,命名保存。回到虚幻引擎后,选择FBX文件导入,在导入选项中,需要关闭“Auto Generate Collision”,还要确保关闭“Import Materials”和“Import Textures”,点击确认导入。模型被导入完毕后,双击网格体打开它。如果点击“Collision”选择“Simple Collision”,就可以看到我们创建的碰撞盒。
我说过你还可以在虚幻引擎中创建碰撞盒。在静态网格编辑器顶部菜单栏中选中“Collision”,可以看到这里能添加不同类型的碰撞网格体,包括球体、胶囊体、盒体。
在本节结束前,我想再介绍一种碰撞。在UE4中,我们找到一块非常不规则的几何体,点击“Collision”选择“Simple Collision”,删除网格体上的碰撞。
这堆瓦砾相对来说不太容易生成优化过的碰撞。你也许可以为这些石块创建不错的碰撞,但其他碎石相较而言很难产生碰撞。虚幻引擎有一个名为“Convex Decomposition”的选项允许你为这类不易生成碰撞盒的不规则网格体创建复杂的碰撞网格体。要使用它,首先确保打开“Convex Decomposition”面板。如果没有,点击“WIndow”>“Convex Decomposition”,然后点击“Apply”。它的作用是让网格体体素化,然后基于体素化生成碰撞参数。它没法保证碰撞网格体百分百精确,但它能确保碰撞盒正好包围住模型表面,并且不会过多使用顶点或折叠自己。
当你处理透明或不透明材质时,会出现过度绘制。它表示当许多透明纹理相互重叠时,GPU必须重复绘制这些纹理,尽管其中许多并不会显示。你会发现植被模型会经常出现过度绘制,因为这些模型需要许多重叠平面来模拟树叶、灌木丛、草地或类似植被的真实效果。
如果你仔细看下面两图,下1图基本上代表了所有游戏都会使用的植被纹理类型。一张映射到平面上、非常漂亮并且带有树叶的树枝纹理,这个平面然后会被用于其他几何体上,用于表示树叶。然而问题是,所有这些空白区域,树枝周围的所有空白区域仍然需要纳入计算,以便之后评估是否要绘制它们。问题在于,我们实际上会在这些不需要绘制的区域上浪费成千上百次运算。我们的解决办法是,使用更多顶点或者调整平面的实际形状,来减少过度绘制的次数。
如果你看下2图,这张纹理的内容和左边完全一样,但区别在于,左上角四边形被完全移除了。如果观察底部,这些顶点都被移动过了,以便减少透明区域。你永远没法彻底消除所有的过度绘制,这是不可能的,这也不应该使你的目标。你的目标不是消除过度绘制,而是限制它,是把它降低到一个可控程度。最好的方法是,无论树叶范围有多大,在树叶纹理的周围添加一些顶点,然后调整这些顶点,使它们尽可能地贴近树叶纹理。因为你要记住,多渲染一些顶点永远比渲染一堆像素,然后弃用它们更加节省开销。因为每一帧都要浪费这些像素。
如果要查看场景中的过度绘制次数,UE4提供了许多方法,你可以用的第一种方法是,“着色器复杂度”模式。点击场景左上角,“Lit”>“Optimization”>“Shader Complicity”。
LOD表示“细节层次”,它们相当于模型的副本,只是三角面数量减少了,有时材质指令数量也会减少。我们使用它的原因是,如果模型只占据屏幕中一两百个像素时,就没有必要显示它的所有面。更好的办法是,显示一个分辨率更低,但轮廓相同的模型,只有标准模型的一半顶点数量。这样,如果模型在屏幕上只占据200个像素,它就不会像占满整个屏幕时那样占用那么多内存。你在建模时——当你开发VR应用时这点尤为重要——模型都应具备某些细节层级,你可以设置随意数量的细节层级,但超过一定数量后,它实际上就会对你的项目不利,说到网格体面数的缩减量时,通常你应该减少75%、35%,最后是12%。这些数值并非一成不变,你可以根据项目选择合适的数值,但是你必须确保这些数值保持足够的间距,以便LOD确实有利于节省内存。