接着上一章,这次从静态网格体开始。内容来源于虚幻在线平台[1]。
System Units:
首先,无论你使用哪一种DCC,创建对象前你需要先确定系统单位(System Units)。
UE4 使用厘米作为测量单位:1 Unreal Unit = 1 Centimeter
确保DCC比例与UE的比例一样很重要,原因是这样可以保持沉浸感。因为当用户体验场景时,如果他们发现场景和现实世界相差过大,会迅速丧失沉浸感(同理VR)
Triangle Counts:
三角面的数量和项目体验直接挂钩,当你在DCC,务必打开三角面计数功能。在使用UE编辑模型时,需要考虑以下几点:
- 首先,不要为小细节建模,例如小螺母。玩家不会注意到此类细节,反而会浪费大量多边形数量。
- 在你构造对象时,请务必在DCC和UE中经常查看多边形数量。
Material ID’s:
每个对象都至少有一个材质 ID。材质 ID 有助于确定哪些多边形面应用了哪些纹理。但是它的缺点是,对象每多使用一个材质id,它就需要被多渲染一次,以显示该材质效果。
下面的实例中,是一个带有两个材质ID的模型。
当你创建项目时,你最好为游戏中的各种对象制定好材质ID的数量的使用规范,例如:小道具应该只有一个材质ID,而武器或角色这类对象可以有2-3个ID。如果是大型建筑,你可以为地板设置一个材质ID,天花板,墙壁等等。
Pivot Points枢轴点:
UE4 使用枢轴点来确定对象在关卡中的放置位置。枢轴点还确定将执行任何变换(平移、旋转、缩放)的点。
从 DCC 导出时,枢轴点应始终位于原点 (0,0,0)。先设置正确的枢轴点意味着美术师可以直接放置资源,他们无需反复调整资源位置,避免在项目开发期间浪费时间。
What Are Lightmap:
Lightmaps 用于在 Textures 中存储复杂的光影信息。这是因为纹理的开销很低,非常适合存储这类数据。
使用光照贴图是在性能和美观之间取得良好平衡的关键。
下面的两个结果,分别是光照贴图和阴影贴图:
上面的光照贴图与平常看到的贴图不同的原因是,光照贴图中的RGB通道中存储着不同类型的数值,这些实际上是不同区域的光照信息,它们全被写入了RGB通道。
在阴影贴图中,这类信息更加明显。虽然图中有些绿色,但是主要颜色还是红色,因为红色和绿色代表不同的阴影信息。所有的阴影数据都被写入了阴影贴图的RGB通道中。
Lightmap UV’s:
首先,光照贴图需要对象上的每一张面,都位于0到1的UV空间中,这些面还需要被单独放置,即它们在UV贴图中,不能相互重叠。对应着上面的模型样例:
0-1的空间,指的就是这个正方形,它包围着UV信息。有时候你为模型添加纹理时,数据可能会超出0-1的范围,这些数据仍然会有纹理信息,它只会重复外面的内容(?)。
当我们渲染光照贴图时,Lightmass实际上只关心0到1空间内的数据,外面的数据将会被裁剪。
另一件事情我们要做的就是,确保UV贴图的对象没有互相重叠。
这里在面板中选择了UV通道2,这是因为光照贴图UV需要存储在模型的第二个通道中。在3D-MAX中,我们称为UV Channel 2,而在UE中为UV Channel 1。这是因为UE从0开始计数
关于如何设置光照贴图分辨率:
Collision Meshes:
- 碰撞用于确定你是否撞到了世界上的某些东西
- 碰撞用于物理模拟以确保物体与世界发生碰撞
- 碰撞用于确保玩家可以在他们正在行走的表面上行走
有两种方法可以为 UE4 创建碰撞:
- 你可以在DCC中创建碰撞,然后把它和几何体一起导入。
- 或者可以在UE中创建
在3D-Max中,我们找到“对象类型”,选中BOX。创建后,按下shift+A对齐。进入前景图,点击F3进入线框模式,然后右击Box,将其转化为Editable poly。然后就是一系列的调整:
而在UE中创建的方法:
再比如下面的样例,我们可以为石块创建好的碰撞,但是对于碎石很难产生碰撞。
UE中有一个Convex Decomposion的选项,它允许你为这类不易生成碰撞盒的不规则网格体,创建复杂的碰撞网格体。选择Apply,他的作用是让网格体体素化,然后基于体素化生成碰撞参数。
Limiting Overdraw:
过度绘制是在处理透明度或不透明材质时出现的问题。它指的是你的 GPU 必须绘制一堆不显示任何纹理信息的透明/透视区域。
我们可以执行以下一项或所有操作来限制这种情况:
- 限制重叠的透明对象的数量。
- 向网格添加额外的顶点,以便它们更好地适应透明度信息。
- 是否可以使用 geo 而不必使用透明度。
如果要查看场景中的过度绘制次数,可以用下面:
“Shader Complexity 着色器复杂度”模式
What are LOD’s:
LOD 代表细节层次Level of Detail,它们相当于模型的副本,只是三角面的数量变少了。
它描述了一种渲染技术,其中将根据用户的相机与该对象的距离显示不同版本的静态网格体。
在DCC创建完成后,导入UE时,我们需要选中下面这个选项 :
如果我们没有选择,则只会得到没有LOD的基本网格体
导入导出章节:
Exporting Static Meshes:
UE4 对所有静态和骨架网格体动画使用 FBX 文件格式。
FBX 文件可以包含以下内容
- 带有基本材质数据的静态网格体数据
- 带有基本材质数据的蒙皮网格数据
- 细节层次网格
- 骨骼驱动的动画
导出时需勾选下面的设置:
- Smoothing Groups
- Triangulate
- Preserve Edge Orientation
Exporting Skeletal Meshes:
导出骨架网格体类似于静态网格体,但启用了更多选项。你将需要启用静态网格体的所有选项以及以下内容:
- Smoothing Groups
- Triangulate
- Preserve Edge Orientation
- Animation
- Deformations
- Skins
3D Mesh Import:略
3D Mesh Import Options:略
Re-Importing Assets:略
Auto Re-Import:
我们可以让 UE4 自动从给定文件夹导入资源。首先打开编辑器首选项并转到加载和保存部分
在Auto - Import部分按箭头展开高级选项,在 Directories to Monitor 部分,输入您希望 UE4 查看的文件夹。当检测到更新时,UE4 会询问你是否要更新资产,然后为你重新导入。
Full Scene Import :
无需单独导入和放置所有内容,全场景导入或 FBX 场景导入工具可让你一次性将整个 FBX 关卡导入 UE4。
完整场景导入的另一个好处是:它不仅支持静态网格体,也支持骨架网格体、动画、材质、纹理、刚体、变换目标、摄像机和光源。假如你在DCC中放置了很多用于丰富场景内容的类似Actor,他都能支持导入。
这里有一些限制,材质和摄像机:材质只能导入漫反射贴图和法线贴图,而摄像机的动画都不能导入。
Full Scene Import:略
二、Creating Materials & Material Instances
Overview:
- What is Physical Based Rendering (PBR)
- What is a Material
- What is a Material Instance
- What is a Master Material
- What you can and can not do with Master Materials
- Setting up a Master Material for Environment Objects Setting up a Master Material for Glass Parent / Master Materials and their children
- Creating & Using Material Instances
- Overriding Parent Material Functionality
- Creating Chains of Material Instances
What is PBR:
PBR表示基于物理的渲染Physically based render。
基于物理的着色意味着我们近似光的实际作用,而不是近似我们直觉上认为它应该做什么。光线的最终效果会更加准确且更加自然。另一个使用PBR的优点是,基于物理的材质在所有场景中都能保持一致,无论材质处于光线充足的室内还是室外还是其他场景。
此外,基于物理渲染材质中的材质参数要简单的多,相互依赖性也没那么高,美术师可以更直观的调整参数。
最后,使用PBR的原因是,它有助于你标准化美工管线,因为资源无论遇到何种光照情况,都能做出相同反应。
图片来源于:[2]
Material Domain:
下图中的三个选项,改变三者任意一个都可能影响主着色器节点上的输出。
Material Domain决定了材质属性的评估方法,Blend Mode决定了材质的颜色以及材质与背景的融合方式,Shading model 决定了输入将如何组合来创建材质的最终颜色。
What is a Material :
材质是 UE4 用来帮助在对象上显示纹理的东西,是使用材质编辑器构建的。材质实际是上是由一小块一小块HLSL代码构成,也就是高级着色器语言。这些代码块可以执行各种任务。
如果你用过基于线性节点的编辑系统,UE中的材质编辑器非常相似。
What is a Material Instance:
材质实例是我们材质的特殊版本,允许我们操作值和更改纹理而无需重新编译材质。你还可以通过时间轴和蓝图与材质实例进行交互,从而获得大量非常酷炫的动画效果。
使用材质实例的优点是灵活性,它们允许你的美术师参与你的项目,你可以设置一个主材质,然后在材质实例中设置许多参数,以便美术师根据喜好进行调整,而无需编写大量复杂的着色器代码。
What is a Master Material:
主材质是一种可以通过某种方式设置的材质,允许你将该材质应用于多种不同的表面需求。主材质可以有许多可以调整或替换的不同参数。
这些输入称为材料参数。材质参数是特殊节点,它告诉材质当它用作材质实例时,可以编辑和更改此属性。你可以在编辑器中和游戏过程中通过材质实例操作值和纹理。
下面是个主材质实例,你可以使用许多参数节点。
Master Material Do’s & Don'ts:
请使用多种主材质
- Master for Environment Objects
- Master for Characters
- Master for Weapons
不要将一种主材质用于所有对象
- It is not possible to make one Material to meet all needs
- This can also introduce performance issues 导致性能问题
- Make assumptions on what your artist need
Master Material Concepts:
当你创建主材质时,有几个事项可以帮助你极大提升材质的性能。
Material Functions
允许你共享和重复使用材质图的部分内容。UE4 附带了许多你可以使用和查看的内置函数。
RGB Mask Packing
当你创建主材质时,你可以描述纹理的使用方式,让美术师将不同的纹理保存在同一张纹理的红绿蓝通道中,能够有效减少内容中的纹理占用量。
Static Switches
它允许你启用或禁用材质中的整条代码路径。例如,你可以用静态开关启用视差法线贴图,它能让你的法线贴图看起来很有立体感。
Feature Level Switch
允许你制作一种可以在任何设备上运行的材料。
三、Performance & Optimization
Overview:
- Texture Streaming
- Level Of Detail or LOD
- Merge Actor Tool
- Hierarchical Level of Detail or HLOD
- Volumes
- Reflections
- Lighting
- Shadowing
- Debug View Modes
- Stat Commands
- GPU Profiling
Texture Streaming:
当你处理许多纹理时,有时会发现纹理会有些模糊,它们没有显示所有的细节。这是因为它们的流送不正确,这时候就需要这一节的知识。
回想之前的Level of detail或者是Mip map和纹理一样,只不过细节层次不同或稍微小一点,所以占用的资源少一些。
而Texture Streaming 是一个内置系统,用于根据距离玩家相机的距离来增加或减少纹理分辨率。它有个缓存池,一片专门用来缓存多级渐进纹理的内存区域。随着你的相机离纹理越来越远,将显示纹理或 MIP 的较低分辨率版本。
这是通过使用 Mip maps来完成的。
如果你的项目说streaming pool size is too small,则意味着你预先分配的空间太小了。如果要增加内存池大小,可以打开UE控制台输入下面的控制,MB为单位。将此设置为 0 将意味着无限的池大小。
UE4 Automatic LOD Creation Tools
具体操作:
- 打开网格编辑器
- 转到 LOD 设置部分
- 在 LOD Group 中,设置要使用的组
- 按应用更改按钮
这将根据存储在 .INI 文件中的预先确定的设置自动创建 LOD。
设置LoD组设置各Lod的设置,然后将这些设置应用到网格体中,这就是Epic推荐的Lod使用方法。
Manual LOD Setup:
手动设置细节面板和LOD设置:
需要注意的是,如果我们要手动设置,设置LOD三角形的缩减比例,比如每个层级相差25%。但是这种偏差还不足以弥补使用这些LOD所产生的额外内存占用,更好的方法是把数值设置成比如:75,25,12%。
Adjusting / Tweaking LODs:
UE4 使用对象的当前屏幕大小计算何时交换 LOD。随着对象占用的屏幕尺寸越来越小,LOD 将从更复杂变为略微复杂。
有时,我们需要取消勾选下面的选项,然后在静态网格编辑器中手动调整 LOD。
Merge Actor Tool:
为什么说这个工具非常强大?因为它能替你完成曾经非常繁琐的任务,比如背景对象分组。
Merge Actor是一种将多个网格体合并为一个静态网格体和一个材质的方法。该工具将采用所有选定的网格和材料,并将它们合并为一个网格和一种材料。
这样做会有效的减少了整体的渲染消耗,这将使渲染更便宜,这对于 VR 应用程序尤其重要:
- 对象拥有的每种材质都意味着它必须再渲染一次。
- 具有 3 个材质的对象必须至少渲染 3 次。
虽然这个工具很强大,但它确实有一些缺点:
- 如果你犯了错误,就没有办法回到你以前的地方。
- 如果你的对象事先没有设置光照贴图,则很难使用合并的网格自动生成它们。
- 合并后的材质只是将材质压平,因此某些效果可能不起作用或必须重新添加到创建的材质中。
- 你也不能在地图集中有蒙面和非蒙面材质,要么全有要么全无,要么使用蒙面材质,要么不使用。
Using the Merge Actor Tool:
在这个工具出现之前,你必须将整个关卡以FPX的形式导出到你的DCC中,找到你的各种纹理,重新创建纹理,将它们重新分配给对象。然后你在DCC中选择所有对象,将它们全部融合成一个静态网格体。然后通过绘制、合并和移动UV贴图,创建你的UV从而获得一张图集。
工具位置:
Window> Developer Tools > Merge Actor.
具体的设置:
举例:
Pivot point at zero 这个作用是获取所有这些网格体的枢轴点,将其设为世界场景的原点。
Merge Physics Data 能融合所有的物理数据,我们可以将顶点数据,比如顶点颜色烘焙到新网格上,这能确保我们使用了顶点绘制或其他操作,这些信息仍能被保留。
LOD selection Type
--use all lod levels获取当前所有信息,创建一个大的网格体,然后使用所有LOD。
--use specific level 将其设为0,这样就能保证我们拥有最高质量的LOD网格体。
接着确保我们选择了Merge Materials,下面需要不断调整设置,直到找到最适合你项目的方案。
最后选中替换源 Actors。
Hierarchical Level of Detail Tool:
HOLD 是一种用渲染成本更低的单个 Actor 替换大量单个 Actor 的方法。
它的工作原理是遍历放置在关卡中的所有静态网格体,并根据它们彼此之间的接近程度将它们分组。
然后,它将用单个网格、纹理和材质替换这些资产组,以帮助降低远距离观看时的渲染成本。
HLOD 是一个很好的工具,可以帮助减少关卡中距离对象的成本。
问题:
1 为何在项目中使用纹理流送如此重要?它可根据纹理在屏幕上的大小来控制纹理的Mipmap级别。
2 在纹理上应执行哪项设置以确保它不包含在流送池中?从不流送
3 您需要在项目中已有的网格体上创建并调整LOD,Epic对此建议的最简单的方法是什么?使用引擎内LOD编辑器
4 “合并Actor”工具有何作用?将选定的静态网格体及其材质合并为单个静态网格体和材质。
Using Volumes:
体积是一种特殊的Actor,你可以把它放在UE4场景中,用于实现各种功能。包括确定玩家的移动范围、决定音响的混响效果。UE中很多的交互机制,幕后实际上都是有体积决定的。
这里我们只讨论Lightmass Volumes和Cull Distance Volumes,因为这两个会被经常使用。
<1>Lightmass Volumes
在UE中, 有两个作用,它们界定了Lightmass的模拟范围,所以它们决定了Lightmass计算过程中计算最密集和最简单的区域。如果不在关卡中加入它,你会把计算时间浪费在没有任何光线或无关紧要的场景区域。
而添加它,能确保只有玩家能够看到或与之互动的区域才回纳入光照计算。
具体做法,我们只需要在关卡中添加一个体积,并确保它覆盖关卡中的所有可玩区域。
它的另一个重要作用是,它们允许动态对象比如角色,了解静态光源环境。
关于LightMass角色间接细节体积:它的作用是增加该体积内的取样数量。
<2>Cull Distance Volumes
这是种优化工具,允许根据对象与相机的距离及其大小剔除(而不是绘制到屏幕上)对象。这可以帮助优化你的场景,因为当对象小到被认为不重要时不绘制对象。
问题:
1 使用动态阴影的一个缺点是什么?动态阴影是虚幻引擎中开销最大的类型。
2 为何最好在场景中使用不同类型的光照组合?有助于节省性能开销。
照明阴影和后期处理:
在UE中有三种可移动性类型:静态、固定和可移动。各种可移动性都有不同的特征,比如光源的渲染开销以及性能影响。
静态类型的开销最低,静态表示光源和场景没有任何互动,光照完全是烘焙出来的,没有对象可以和它互动,它不能以任何方式、形状或形式改变。
固态类型可以与场景互动,所以固定光源投射的阴影能够和动态对象融合到一起。然而,固定光源会有一定开销。原因是你可以在运行时,改变固定光源的颜色和亮度,但你无法移动光源。
可移动类型,开销最大,因为它是完全动态的,所有的光照和阴影。
Shadowing:
在虚幻中,有两种主要类型的阴影:静态阴影和动态阴影。
静态阴影源于静态光源类型:
Static Shadows
- Static Light Type
- Inexpensive
- No Scene Interaction
经常会在游戏中看到这样的情况,人物移动时阴影也会动,但是如果地上有其他阴影,玩家的阴影看起来像是漂浮在其他阴影上。这是因为动态阴影无法和静态阴影交互。
Dynamic Shadows
- Stationary & Movable
- Expensive
- Full Scene Interaction
Post Process:
后期处理 (PP) 音量允许艺术家和设计师快速调整屏幕的整体外观和感觉。
如果你想将 PP volume 应用于整个关卡,则需要选中未绑定选项。
Reflections:
虚幻中有三种主要的反射类型:球体反射,盒体反射和平面反射。前两个开销最低。
问题:
1 对于静态关卡光照应使用何种类型的体积?
LightMass
2 剔除距离体积有何作用?
停止渲染超过某一特定大小和距离的对象
3 您需要在一个大型正方形房间内对多个对象创建反射。何种类型的反射Actor最适合用于此场景?
盒体反射采集
4 如果使用平面反射,它是否存在固定的性能开销?
否,开销取决于所反射的对象。
[1] 虚幻在线学习平台 https://www.unrealengine.com/zh-CN/onlinelearning-courses
[2] PBR https://docs.unrealengine.com/4.26/en-US/RenderingAndGraphics/Materials/PhysicallyBased/