UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - unreal 4
虚幻引擎学习之路：动画模块进阶篇（二）
上周UWA介绍了Unreal 4引擎动画模块中的动画融合功能，今天我们将继续介绍Unreal 4引擎动画模块中的其他进阶功能，其中主要包括：动画重定向、逆向运动学和顶点动画。 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 一、动画重定向 游戏引擎动画模块中的动画重定向（Animation Retargeting）可用于在不同模型上重用动画文件，该功能类似于Unity引擎中Humanoid模式下的Retargeting功能。Unreal 4引擎对使用相同Skeleton Asset的Skeletal Mesh支持动画重定向，并且支持不同尺寸角色动画的重定向，其细节把握非常到位，具体如下图所示： 上图显示了高、中、低三个不同的模型，并以骨骼长度中等模型的动画做重定向。在不做骨骼缩放处理的情况下直接做重定向使得较矮的模型被拉伸，较高的模型出现了穿插。 Unreal 4引擎对该问题提供了解决方案。打开两个Skeletal Mesh共用的Skeleton Asset，并勾选Show Retargeting Options，即可看到骨骼结构图右边显示骨骼Retargeting设置，如下图所示： 点开向下箭头会显示四个选项：Animation、Skeleton、Animation Scaled以及Animation Relative，如下图所示： 该选项表示了骨骼的Transform数据来源。其中，Animation选项表示Transform来自动画文件，Skeleton选项表示Transform来自骨骼文件（即静态骨骼），Animation Scaled表示Transform来自动画文件，但根据原始Skeletal Mesh中的骨骼长度进行缩放。对于一般情况，只需要将Root、IK和Weapon骨骼设置成Animation，Pelvis骨骼（一般为根节点）设置成Animation Scaled，其他骨骼均设置成Skeleton即可。设置完成后即可输出经过骨骼缩放后的动画重定向结果，如下图所示： 其中，黄色线表示动画文件原始模型的骨骼，白色线表示进行动画重定向的模型骨骼。 对于使用不同Skeleton Asset的Skeletal Mesh，Unreal 4引擎支持使用Rig文件将两者的骨骼进行映射，过程类似于Unity引擎中对Humanoid类型骨骼的模型进行标准人形骨骼映射。然后，即可支持动画重定向功能。有兴趣的读者可参考Unreal 4官方网站动画重定向教程【1】，进一步了解。 二、逆向运动学 游戏引擎中逆向运动学（Inverse Kinematics）可以弥补普通动画中不精确的情况，从而生成更加真实的角色动画。IK在游戏角色动画中有多种应用，其中比较常用的情况是使得角色双脚能贴合在高低不平的地面或是当角色触碰某些物品时能精确地碰到物品的位置，如下图所示： 其中，左图是没有使用IK的情况，在楼梯上由于角色两脚地面高低不一致，导致右脚穿插入楼梯。右图是使用了IK的情况，角色的右脚被抬起到与楼梯相同的高度。 Unreal 4和Unity引擎都支持IK，本节主要介绍Unreal 4引擎中IK的使用和设置。Unreal 4引擎中设置IK通常需要设置两个地方：Character的Blueprint和Animation Blueprint。在Character Blueprint中，需要处理获取Socket节点的位移信息，用于在Animation Blueprint中使用。Socket节点即为IK中需要触碰到指定位置的节点，例如：在本节例子中角色脚底可以设置成Socket节点，如下图所示： 其中，上图的Character Blueprint中，红框表示了每一帧Tick函数，蓝框表示计算角色右脚的Socket节点与地面的高度并记录在IKOffsetRightFoot变量中，绿框表示计算角色左脚的Socket节点与地面的高度并记录在IKOffsetLeftFoot变量中。然后，在Animation Blueprint的Event Graph中获取该变量值并设置为Effector Location，如下图所示： 其中，红色框表示利用IKOffsetRightFoot变量的值计算右脚Effector Location（脚底位置），蓝色框表示利用IKOffsetLeftFoot变量的值计算左脚Effector Location。 最后，在Animation Blueprint的Anim Graph中，使用Two Bone IK节点设置IK节点，如下图所示： 其中，红色框表示用Two Bone IK节点计算右脚的IK解，蓝色框表示Two Bone IK节点计算左脚的IK解。其中，Joint Target Location参数是为了限定膝盖节点的弯曲方向。 由此，IK的设置已完成。其中，主要步骤分为三步： （1）计算获取Socket节点的位移； （2）在Event Graph中设置该值为Effector Location; （3）在Anim Graph中使用Two Bone IK节点设置IK骨骼。 三、顶点动画 Unreal 4与Unity引擎都支持顶点动画，它常被用于制作面部表情以及布料等无法用骨骼驱动的动画。在Unreal 4引擎中被称为Morph Target，在Unity引擎中被称为Blend Shape。在Unreal 4引擎中，Morph Target可以被叠加到Skeletal Mesh上，形成顶点动画。其使用通常需要在Maya等3D建模工具中把顶点动画制作完成，并导入Unreal 4编辑器。然后，通过Event Graph中的Set Morph Target节点进行设置，如下图所示： 其中，Target表示Skeletal Mesh，Morph Target Name表示该网格中的某一个Morph Target，Value表示Morph Target与 Skeletal Mesh的插值系数，其取值为[0, 1]。当取值为0时，显示原始网格形状，当取值为1时显示Morph Target形状，取值0~1显示插值结果。其形变效果如下图所示： 上图显示了角色左边眉头被挤压的Morph Target叠加到Skeletal Mesh上的结果。 四、Aim Offset Aim Offset在Unreal 4引擎中是动画模块中的一个特殊功能，其主要用于制作射击游戏的瞄准动画。本节UWA将重点介绍其使用方法。 Aim Offset本质上是一个动画融合的工具，它的操作方式类似Blend Space。不同的是Aim Offset用于融合的是角色在不同方向瞄准的Pose，Blend Space则是将不同的动画进行融合。在使用Aim Offset之前需要先创建角色在不同方向的瞄准动作，如下图所示： 然后，基于角色骨骼创建Aim Offset资源，如下图所示： 双击Aim Offset资源并设置好Yaw和Pitch坐标轴，即可将之前创建好的瞄准Pose拖入其中对应的位置，如下图所示： 其中，上图显示了设置好上下左右各方向的瞄准Pose后的坐标轴。使用Aim Offset时可以直接将其拖入Anim Graph中并与Locomotion输出Pose融合，如下图所示： 转动角色到不同方向即可融合出不同的瞄准动画，如下图所示： 五、动画模块小结 Unreal 4引擎提供了丰富的动画融合、重定向、IK以及顶点动画等工具，方便制作出逼真的动画效果。同时，其提供的功能同样非常强大，且在细节处足见其深厚的技术功力。其中，Animation Montage提供了将动画自由切分、组合、循环以及跳转的功能；Blend Space以及Aim Offset提供了根据二维参数以及动画样本进行动画融合的功能；Post Process Animation Blueprint提供了对动画骨骼信息进行访问和使用的功能，并且配合AnimDymanic可以支持角色身上配件基于物体的动画；IK和Morph Target功能则添加了角色动画的精准度和细节。 参考文献 【1】 https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/Retargeting/index.html#retargetingusingthesameskeleton
虚幻引擎学习之路：动画模块进阶篇之动画融合
上周UWA介绍了Unreal 4引擎动画模块中的基本功能，接下来我们将进一步介绍Unreal 4引擎动画模块中提供的进阶功能。其中主要包括：动画融合、动画重定向、反向运动学、顶点动画。鉴于篇幅原因，今天我们先来讲解动画融合。 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 动画融合 动画融合是游戏引擎动画模块中的重要功能。本节将介绍Unreal 4引擎中提供的动画融合功能，主要包括：Blend节点、Blend Space、Animation Montage、Animation Composite以及Post Process Animation Blueprint。 1、Blend节点 Unreal 4引擎的Anim Graph中提供了一系列的Blend节点可以实现不同的动画融合功能，其类似于Unity引擎中的Blend Tree功能。Blend节点的输入是来自多个不同动画文件的Pose数据以及Alpha权重参数，它会根据权重参数计算出最后融合的Pose，如下图所示： 其中，A和B为两个输入Pose，Alpha为[0,1]的浮点数表示A和B的权重。当Alpha为0时输出Pose全部来自A，当Alpha为1时输出Pose全部来自B，当Alpha为0~1之间时输出Pose为A和B的融合结果。类似功能的节点还有：Apply Additive、Blend Multi等。 Time Based Blend类型节点可用于连接两个或多个动画，并在动画切换时进行融合。Blend Poses by bool节点是其中一种，该节点根据输入的Bool值（红框中的Active Value）来控制True Pose和False Pose的切换，并且可分别设置两个Pose的融合时间（蓝框所示），其分别表示切换到True Pose的融合时间和切换到False Pose的融合时间，如下图所示： 类似功能的节点还有：Blend Posed by int，支持多个动画Pose的切换融合。 Layered Blend per bone节点可以将多个动画的不同骨骼融合在一起，例如：将Locomotion的下半身体和射击以及近战的上半部分身体进行融合，可以实现一边行走一边射击等动作。该节点需要配合Animation Montage的Slot使用，本文将在Animation Montage小节中进行介绍。 2、Blend Space Blend Space是Unreal 4引擎动画模块中用于实现复杂动画融合功能的资源。它最多可提供两个控制参数，并支持在二维平面上摆放动画采样点对多个动画进行融合。当变量取值在二维平面中的某一坐标位置时，Blend Space会根据采样点处的动画和坐标插值计算出当前坐标的动画。下图显示了1D和2D的Blend Space示意图： 其中，左图为1D的Blend Space，包含一个参数Speed。右图为2D的Blend Space，包含两个参数Speed和Yaw。 Blend Space的创建与其他资源创建过程类似，点击Add New按钮或在Content Browser中点击右键，在弹出菜单中选择Blend Space即可。Blend Space资源分为1D和2D，分别支持一个和两个控制参数的动画融合。创建好Blend Space资源后双击即可打开编辑界面，如下图所示： 上图例子使用了1D的Blend Space，实现了根据Speed参数对Idle、Walk以及Run三个动画进行采样融合效果。其中，区域1显示了资源的参数设置，区域2显示了控制参数坐标轴以及动画采样点，区域3显示了动画文件列表。通常在使用Blend Space时首先需要设置坐标轴，如下图所示： 其中，在Interpolation Type选项中可以设置动画插值计算方式，默认设置是Averaged Interpolation。 设置好坐标轴即可从区域3动画列表中选取采样动画拖动到区域2中。上述例子中设置了三个动画采样点：Idle、Walk和Run。在区域1中可查看其参数设置，如下图所示： 上图参数设置表示Idle动画位于Speed取值为0处，Walk动画位于Speed取值为93.75处，Run动画位于Speed取值为375.0处。在区域3中可查看采样动画分布，如下图所示： 其中，三个白色菱形点表示三个采样动画在Speed坐标轴上的位置，蓝色菱形点表示当前Speed取值。点击播放动画，并拖动蓝色菱形点在Speed坐标轴上移动，即可看到不同的动画插值结果。上述例子为1D的Blend Space，2D的Blend Space比1D多了纵坐标，使用方式与1D类似。 Blend Space资源设置完成后，即可拖入Animation Blueprint的Anim Graph中作为节点使用，如下图红框所示： 3、Animation Montage Unreal 4引擎中的Animation Montage是一个多功能的动画编辑工具。它可以将多个动画进行连接，并且支持自定义切分动画段、循环播放、任意跳转以及配合Layered Animation实现不同骨骼播放不同动画的功能。它支持如同普通Animation Sequence一样的Notification和Curve的编辑。同时，Animation Montage还支持重用。本节将对上述功能和使用方法进行介绍。 Animation Montage创建方式与其他资源相同，在Content Browser中双击即可打开编辑界面，如下图所示： 其中，区域1显示了资源的参数设置，区域2显示了Animation Montage中Timeline相关的设置，区域3显示了资源列表和Slot信息。 - 自定义切分动画 Animation Montage中重要概念是Slot和Section。Slot类似于一个容器，可以存放多个动画文件，并将它们按时序排列，其顺序可通过在Slot的Timeline上拖动进行设置。Slot的管理支持分组，每组可包含多个Slot，如下图所示： 上图显示了Slot的Timeline。其中的Slot名字为Jump，属于Default Group，并且包含了三个动画：ThirdPersonJump_Start、ThirdPersonJump_Loop和ThirdPersonJump_End。从区域3中动画文件列表中可以添加更多的动画文件到Slot中。 Section则是将整个Slot进行切分后的片段，主要作用是让开发者可以在每个片段上进行编辑，从而达到不同的效果。默认情况，Slot只有一个Section，通过新建Section可将Slot分成多段，切分位置可通过在Section的Timeline上拖动进行设置，如下图所示： 上图显示了Section的Timeline，其中包含了三个Section：Start、Loop和End，绿色竖线为其起始位置。添加新的Section可通过右键菜单创建。 通过在Section Track上添加Section并重新组合排列就可生成新的动画序列。该新生成的动画序列就是Animation Montage的输出结果，如下图所示： 上图红框中显示了Section Track，其中Start、Loop和End被顺序连接成一个动画序列。 - Branch Notify 同时，Animation Montage也具有普通Animation Sequence一样的Notification和Curve设置功能。并且，Animation Montage还具有新的Notification—Branch Notify。它支持在动画播放的任意时刻跳转到任意Section，如下图所示： 上图显示了Animation Montage中的Notify和Curve的Timeline，其功能和编辑方式与Animation Sequence中相同。其中，Element Timing的Timeline显示了当前所有Notify以及Section起始位置的可视化信息。比如，上图中绿框0、1、3分别表示动画Start、Loop和End动画的起始位置，而蓝框2表示TestNotify事件的起始位置。方框中序号显示了事件触发的时序，方便编辑的同时查看。图中的Animation Montage的Branch Notify事件响应逻辑可以在Animation Blueprint的Event Graph中实现，如下图所示： 上图红框中显示了在Event Graph中通过添加Montage Set Next Section节点实现Branch Notify的过程。其中，触发事件为TestNotify，即上图Animation Montage的Notify Timeline中添加的事件。当该事件被触发时，Montage Set Next Section节点会从Loop Section跳转到End Section，从而实现了Section的跳转功能。利用Section跳转，可以实现更加丰富的动画逻辑。 - 循环播放Section 此外，Section支持重复循环播放的功能，如下图所示： 上图中Loop Section变成蓝灰色（红框所示），表示其设置为循环播放。该功能可以用于制作有吟唱的技能，吟唱Section循环次数可根据吟唱时间确定，当吟唱结束后可利用Branch Notify跳转到技能后摇的Section。 Animation Montage的播放可以利用Anim Graph中的Slot节点指定播放的Slot，如下图所示： 其中，Slot节点的输入是动画状态机的Pose数据，输出则作为角色最终的Pose。然后在Event Graph中用Montage Play节点播放，如下图所示： Montage Play节点中可设置需要播放的Animation Montage资源名字，然后根据游戏中的逻辑连接到相应的流程中。 - Layered Animation Animation Montage配合Layered Animation能够实现不同骨骼播放不同动画的功能，例如：上半身骨骼播放攻击动画，下半身骨骼播放行走或是下蹲等动画。该功能可以在Anim Graph中利用Layered blend per bone节点配合Animation Montage实现，如下图所示。 其中，上图节点图中红框表示获取Pose的Cache信息，主要分别用于蓝框和红框操作来进行使用；蓝框为直接将Cache Pose进行索引，而红框则是将Cache Pose通过UpperBody的Animation Montage操作输出新的Pose，并将新的Pose索引到混合结点中。最终，通过融合结点，则可以计算出最终的动作融合效果。在Layered blend per bone节点的属性中可以对bone layer进行设置，如下图所示： 上图的设置使得Animation Montage的输出Pose被融合到spine_01骨骼以及其子节点骨骼中，从而实现了角色上半身骨骼播放Animation Montage的动画，下半身依旧播放Locomotion状态机动画的功能。 从大方向上来看，上述功能类似于Unity引擎Mecanim动画系统的Layer动画层融合功能，而从细微处来看， Layered blend per bone功能更像是Unity引擎中Layer动画层融合功能中又加入了Mask的效果，大家可以体会一下：） - Animation Montage重用 Unreal 4引擎提供了Animation Montage的重用功能。对于已经配置好的Animation Montage可以通过创建Child Animation Montage继承其父类的所有设置。在Child Animation Montage除了 Slot中的动画可以替换之外，其他的设置都无法修改，如下图所示： 其中，Slot的Timeline中黄色的部分（红框中）表示被替换掉的动画，绿色表示继承自父类的动画。从上图可见，其他的设置选项都被置为灰色，并且无法编辑。 4、Animation Composite Unreal 4引擎中的Animation Composite提供了将多个动画连接成一个动画的功能，并且支持与普通动画相同的Notify和Curve的功能。其创建方式与其他资源相同，在Content Browser中双击可打开编辑器，如下图所示： Animation Composite编辑界面与Animation Montage类似，上图红色区域中显示了Composite、Notify以及Curve的Timeline。其操作方式只需将右侧列表中的动画拖入Timeline即可。其播放方式是在Anim Graph中当做普通动画即可，如下图所示： Animation Composite的功能与Animation Montage有相似之处，它们都能将多个动画拼接成一个动画。但是，Animation Composite只提供了简单的拼接以及Notify和Curve的功能，而Animation Montage则提供了更加复杂的Section循环以及跳转功能。Animation Composite比Animation Montage使用更简单可直接当做一个Animation Sequence使用，而Animation Montage还需指定Slot等信息。 5、Post Process Animation Blueprint Unreal 4引擎的Skeletal Mesh资源参数中有一项Post Process Animation Blueprint，它为角色提供同时运行两个Animation Blueprint的功能。通常情况下，角色的Animation Blueprint可以在Character Blueprint中的Skeletal Mesh组件的Anim Class参数中进行设置，如下图所示： Post Process Animation Blueprint不仅能替代主Animation Blueprint，更重要的功能是它可以允许开发者访问和改变相关的骨骼动画信息。在Unity引擎中，我们可以在LateUpdate中访问和改变骨骼动画信息，而在Unreal 4引擎中，则是通过Post Process Animation Blueprint来处理这件事。 同样，Unreal 4引擎提供了AnimDynamic功能来与之配合使用，从而实现角色基于物理的动画，其功能类似于Unity Asset Store中的Dynamic Bone，而Dynamic Bone功能更像是AnimDynamic的简化版。 AnimDynamic节点支持对角色身上物件实现类似Ragdoll的动画，例如：头发、项链、衣服等。该效果能够在角色移动时，更加真实地模拟项链等物件的被施加外力从而产生摆动的动画。AnimDynamic的底层实现并不会计算物理碰撞，而是利用小方盒对物体的形状进行近似，然后通过限制方盒运动的角度范围近似模拟物理碰撞产生的自然摆动，如下图所示： Unreal官方网站【1】中介绍了利用AnimDynamic和Post Process Animation Blueprint对怪物身上的项链施加动画的教程，有兴趣的读者可进一步阅读。 参考文献 【1】 https://docs.unrealengine.com/latest/INT/Engine/Animation/AnimHowTo/AnimDynamics/index.html 以上则为Unreal 4引擎动画模块关于动画融合的介绍，希望通过上述内容，可以让您对Unreal引擎的动画模块产生明晰的感性认识。下周，UWA将为您带来动画模块中动画重定向、反向运动学等进阶功能，欢迎关注！
虚幻引擎学习之路：动画模块之基础篇
在之前的微信文章推送中，我们陆续为大家详细介绍了Unreal 4引擎的渲染模块（包括光照系统、材质系统、相机后处理和全局光照明），接下来我们将讲解动画模块的基础功能，并且将在后续文章中陆续推出该模块中进阶功能和特殊用途的介绍。 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 前言 动画模块是游戏引擎中的重要部分，是驱动游戏中场景、角色能够活灵活现地做出动作的基础。UWA将分三块内容介绍Unreal 4引擎中的动画模块功能，其中包括：基础功能、进阶功能以及特殊功能。在介绍基础和进阶功能时，UWA不仅会对其功能进行重点讲解，同时也将结合Unity引擎中的相似功能进行类比，以求让大家可以更明晰地掌握Unreal引擎动画模块的功能使用。在特殊功能中，UWA将对Unreal 4引擎中针对特殊用途提供的功能进行重点解读。 本节主要介绍Unreal 4引擎动画模块中提供的基础功能。其中主要包括以下几个部分： 蒙皮网格 骨骼文件 动画文件 加粗文字动画逻辑 Unreal 4引擎的动画模块提供了四个编辑器：蒙皮网格编辑器、骨骼编辑器、动画文件编辑器和动画蓝图编辑器。上述基础功能可以分别在这四个编辑器中完成。在接下来的内容中，本文将在介绍基础功能的同时对相应编辑器的使用进行介绍。 一、 蒙皮网格 Unreal 4引擎支持从外部FBX文件中导入蒙皮网格和动画。导入操作可通过Content Browser->Import按钮完成。导入界面如下图所示： 其中，包含了网格、动画以及材质相关的导入设置。默认情况下Unreal 4引擎会为网格创建材质、物理以及骨骼文件。若选择导入动画，也会同时创建相应动画文件。 蒙皮网格在Unreal 4引擎中被称为Skeletal Mesh，其相当于Unity引擎中的Skinned Mesh，表示了带有蒙皮信息的网格。双击Content Browser中的蒙皮网格文件，即可打开蒙皮网格编辑器，如下图所示： 其中，左边区域（1区）是Skeletal Mesh的参数设置，右边区域（2区）是Morph Target（Blend Shape）以及预览场景设置。在Skeletal Mesh参数设置中，可以设置模型的材质、LOD、Clothing、骨骼、物理（Rigidbody）、Capsule Shadow等相关参数。其中，Clothing支持Nvidia的apex文件。骨骼文件即为下文中将介绍的Skeleton Asset。Capsule Shadow是Unreal 4引擎中Skeletal Mesh特有的软阴影。它使用形状不同的Capsule对Mesh进行近似表示，在渲染阴影时则使用该近似表示进行渲染，从而节省了渲染开销。右上角区域（3区）显示了与当面Skeletal Mesh相关的文件，点击即可快速打开相关文件。 二、骨骼文件 Unreal 4引擎中的骨骼文件被称为Skeleton Asset，其相当于Unity引擎中的Avatar文件。双击Content Browser中的Skeleton Asset文件即可打开该文件，如下图所示： 其中，左边区域（1区）显示了当前Skeletal Mesh的骨骼信息，可以选中其中某一骨骼进行编辑。同时，还可进行Retargeting的设置。右上角区域（2区）显示了选中骨骼的详细信息以及预览场景设置。在骨骼详细信息中可以设置其Transform和Name参数。右下角区域（3区）显示了动画事件和Animation Curve。其中，Animation Curve可以用于在动画过程中修改模型材质以及修改Morph Target曲线。Animation Curve的具体修改过程需要在动画编辑器中完成，此处只提供了预览。 在Unity引擎中，查看骨骼信息的方式是将其拖入场景，即可在左边Hierarchy页面中看到骨骼信息。需要注意的是，FBX模型不要开启Optimize GameObject选项。 在Unreal 4引擎中，共用Skeleton Asset的网格可以共享动画文件，即动画重定向（Animation Retargeting）。但要共享Skeleton Asset需要满足一定条件，即两个网格中的骨骼命名顺序要保持一致，如下图所示： 其中，骨骼(1,2,3)与骨骼(1,2,3,4)可以共用Skeleton Asset，但是与骨骼(1,3,2)无法共用。 在Unity引擎中，通过对Humanoid类型动画网格的骨骼进行映射也可以支持动画重定向。但是Unity中的动画重定向只能支持骨骼长度相近的网格，对于骨骼相差较大的网格会出现穿插或者分离的现象。Unreal 4引擎提供了该问题的解决方案，我们将在后续文章的动画重定向一节中进行介绍。 三、动画文件 Unreal 4引擎中的动画文件被称为Animation Sequence，其相当于Unity引擎中的Animation Clip。双击Content Browser中的Animation Sequence文件即可打开该文件，如下图所示： 其中，左边区域（1区）显示了动画文件的相关参数和骨骼结构信息。右边区域（2区）的上半部分显示了选中骨骼的参数以及预览场景设置，下半部分显示了该模型的动画文件列表。下部区域（3区）显示了动画事件、Animation Curve以及Animation Layers Track。其中，Animation Layers Track支持对动画中单个骨骼的Transform进行修改，从而生成新的动画序列。 Animation Curve以及Animation Layers Track的功能类似于Unity中创建Animation Clip的功能。在Unity中也可以通过对蒙皮网格创建Animation Clip来修改其材质以及单个骨骼的Transform，如下图所示： 四、动画逻辑 在引擎中播放动画需要处理动画逻辑。Unreal 4引擎提供了动画专用的蓝图资源：Animation Blueprint。在Animation Blueprint中包含两种节点图：Event Graph和Anim Graph。两者分别用于提供动画数值计算逻辑以及动画状态机的功能。本节将介绍Unreal 4引擎中动画逻辑的功能，主要包括：动画数值计算，动画状态机，动画事件以及动画逻辑重用。 4.1 动画数值计算 Event Graph节点图用于计算播放动画的逻辑中所需要的数值变量，并提供给后续状态机使用。其中，Event Blueprint Update Animation节点会在每帧被调用。通过该节点可以在动画播放期间每帧更新逻辑数值，如下图所示： 其中，该节点图每帧计算了两个数值：IsInAir和Speed。IsInAir用于表示角色目前是否在空中，Speed表示当前角色的速度。IsInAir可以用于在空中切换角色动画，而Speed则可用于切换角色Idle，Walk以及Run等动画。 4.2 动画状态机 Anim Graph节点图用于计算角色最后输出的动作，其本质就是动画状态机，类似于Unity引擎中的Animator Controller资源，如下图所示： 其中，该节点图包含了一个状态名字为Default的状态机，并且将状态机计算的角色Pose作为最终结果。双击State Machine节点，可查看其内容，如下图所示： 其中，该节点图包含了默认起始节点Entry以及角色的移动以及跳跃等状态，在不同状态之间根据不同的条件进行跳转。这与Unity引擎中的Animator Controller动画状态机过渡颇为相似。由上图可知从移动节点跳转到起跳状态的判定条件即为IsInAir变量值，该数值由Event Graph每帧更新。 双击Idle/Run节点可以看到其内容，如下图所示： 该节点图根据Speed变量的数值输出不同的移动动作。其最终结果是通过Blend Space将Idle、Walk和Run三个动作进行插值的计算结果。Blend Space动画融合将在本文接下来内容中进行介绍。 Unreal 4引擎动画状态机不仅提供了动画状态以及跳转的功能，也在动画跳转过程中提供了状态过渡时的动画融合的功能，其融合时间和融合方式可设置。并且，其还提供了Conduits节点作为分支节点，支持对同一类型多个状态的管理，如下图所示： 上图取自Unreal 4官方网站 其中，Killed为Conduits节点，连接了不同死亡方式的动画节点。如果同一节点有多个跳转条件可能同时满足，通过设置跳转条件的优先级解决。 4.3 动画事件 动画逻辑中一个重要的功能就是动画事件，在Unreal 4引擎中被称为Animation Notification，其相当于Unity引擎中的Animation Event。其中一种动画事件是在动画状态跳转中触发，可在转移条件的详细属性中设置，如下图所示： 其中，Custom Blueprint Event可以在Event Graph中定义。 另一种动画事件是在动画播放过程中触发，可在动画编辑器中设置。在动画编辑器的Notifies轨道上点击右键即可添加动画该种事件，如下图所示： 其中，这种动画事件支持三种类型：Play Particle Effect，Play Sound以及Custom。其中，Play Particle Effect和Play Sound分别用于在动画播放过程中触发粒子系统和音频的播放。Custom则可自定义功能。 此外，Unreal 4引擎还提供了Notify State功能。它分别在动画播放的开始、播放中、结束触发事件。在开始和结束时各触发一次，在播放中每帧触发一次。其添加方式如同Notification一样，如下图所示： 其中，Notify State包含三种类型：Timed Particle Effect、Trail和Custom。Timed Particle Effect支持在动画播放中添加粒子特效，并且粒子特效的播放时长可设置。Trail支持在蒙皮网格上实现拖尾特效。Custom类型需要通过AnimNotifyState Blueprint实现。 4.4 动画逻辑重用 对于行为相似的角色，有的时候只需要更换不同的动画文件，而不需要重新制作类似的逻辑，或者可重用部分逻辑。Unreal 4引擎提供了动画逻辑重用功能提高开发效率。接下来，本节将介绍两种动画逻辑重用的方式：Child Animation Blueprint和Sub Animation Blueprint Instance。 - Child Animation Blueprint 主要用于重用所有动画逻辑，仅替换不同的动画文件。其使用方式是通过原始Animation Blueprint创建Child Animation Blueprint，如下图所示： 然后，双击打开Child Animation Blueprint，并打开Asset Override Editor窗口，即可在Asset一列对应原动画位置的下拉菜单中选择新的动画文件，下图则显示了用BS_Jog替换原始Jog动画文件的设置过程。 - Sub Animation Blueprint Instance 主要用于将动画逻辑分解成模块，然后方便重用。其使用方式是：首先将通用功能动画逻辑编辑保存成Animation Blueprint，然后在需要引用的节点图中添加Sub Anim Instance节点，并指向通用功能Animation Blueprint，如下图所示： 其中，上图显示了在Animation Blueprint中引用Sub Anim Instance的过程。Sub Anim Instance的内部参数可以通过设置暴露给外部Animation Blueprint作为输入，如上图中的Effect Alpha参数。其设置在Sub Anim Instance节点的详细信息页面，如下图所示： 外部的Pose数据可通过在Sub Anim Instance节点图中添加Sub-Graph Input节点传入，如上图中的In Pose参数。其设置如下图所示： 其中，上图为上述例子中Sub Anim Instance的节点图。Sub Graph Input节点为其提供了外部输入Pose数据。 以上则为Unreal 4引擎动画模块的基础篇介绍，我们重点讲解了动画模块的主要编辑和视图模块，希望通过上述内容，可以让您对Unreal引擎的动画模块产生明晰的感性认识。下周，UWA将为您带来Unreal 4引擎更为高级的进阶功能，欢迎关注！
虚幻引擎学习之路：渲染模块之全局光照明
之前UWA为大家分别介绍了Unreal 4引擎中渲染模块的光照系统、材质系统和相机图像后处理，在本篇文章中，我们将为大家介绍渲染模块的全局光照明这部分内容。 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 关于全局光照 全局光照是增强渲染真实感的有效方法，也是游戏引擎中不可缺少的一部分。Unreal 4和Unity引擎都分别支持了全局光照效果。在Unreal 4引擎中，全局光照烘焙采用的是Lightmass，而Unity 2017中则采用了Enlighten或Progressive。下图显示了Unreal 4引擎使用全局光照的渲染结果图。 Unreal4引擎全局光照渲染结果，取自Unreal 4美术博客【1】 全局光照的算法有多种，Unreal 4引擎中Lightmass采用的是Photon Mapping算法【2, 3】，Unity引擎中Enlighten采用的是辐射度算法【4, 5】。由于辐射度算法主要针对的是漫反射表面，因此对于镜面反射表面Enlighten难以计算其对间接光照的影响。所以，Unity引擎在Shader中对于这部分间接光照提供了补偿方法，即“Meta Pass”。在Standard Shader中，自带有“Meta Pass”的定义。而对于自定义的Shader，如果需要使用Lightmap可以参考Standard Shader中的定义。Unreal 4引擎由于使用了Photon Mapping算法，则不需要考虑这一问题。 在接下来的内容中，本文将分两部分对Unreal 4引擎中的Lightmass全局光照系统的使用进行介绍，其中包括：静态物体全局光照、动态物体全局光照和阴影效果。在介绍的同时，本文也对Unity中的相应功能进行对比，从而让读者更好地对了解Unreal 4引擎中的全局光照功能。 静态物体全局光照 本节主要介绍Unreal 4引擎中静态物体全局光照效果。其中主要包括：Color Bleeding和Ambient Occlusion。然后，将对Unreal 4引擎中影响全局光照烘焙质量和时间的参数进行说明。最后，介绍Unreal 4引擎中对相同场景使用多套全局光照烘焙效果的功能。 2.1 Color Bleeding 在Unreal 4和Unity引擎中，静态物体的全局光照效果都采用了Lightmap烘焙的方法。Lightmap其实是一张记录了静态物体光照信息的纹理。对于静态物体，其位置和几何形状都不会发生改变。在光源位置方向也不变的情况下，引擎可以对光线在漫反射材质表面多次反射的过程进行预计算，从而获得物体表面最终的间接光照信息。在实时计算时，只需要将纹理中对应位置的间接光照信息解析出来，并与直接光照一起参与计算，就可实现漫反射表面不同颜色物体之间相互辉映的效果，其也被称为Color Bleeding效果。 在Unreal 4引擎中烘焙静态全局光照，只需将物体的属性设置为Static，并且将光源设置成Stationary，然后点击Build进行烘焙即可，如下图所示： 烘焙结束后，在编辑器的Console页面会显示烘焙数据，主要反馈相应的烘焙耗时和内存使用，如下图所示： 然后编辑器中即可看到烘焙效果： 相应的，Unity引擎的全局光照系统Enlighten也同样支持Color Bleeding效果，其烘焙效果如下图所示： 当Lightmap烘焙好之后，还可以在Unreal 4和Unity引擎中查看Lightmap纹理贴图。在Unreal 4引擎中，可以在World Settings->Lightmaps页面中查看，在Unity引擎中可以在Lighting->Global maps页面中查看，如下图所示： Unreal 4和Unity引擎的Lightmap都采用了HDR格式，烘焙过程也是采用HDR渲染。在默认情况下两者Lightmap都包含了Directional信息，但都支持关闭Directional。Unreal 4引擎可以通过Project Settings->Platforms设置，Unity中可以通过Lightmapping Settings->Directional Mode设置，如下图所示： 2.2 Ambient Occlusion Unreal 4和Unity引擎的全局光照系统都支持世界空间Ambient Occlusion的烘焙。在Unreal 4中其设置是在World Setting的Lightmap中，此处相当于Unity引擎中的Ambient Occlusion功能（Lighting->Lightmappings Settings页面中） ，如下图所示： 下图显示了Unreal 4引擎中，关闭和开启世界空间AO的渲染效果： 2.3 烘焙质量与时间 在Unreal 4引擎中，除了通过Lightmass Importance Volume提高烘焙质量和效率外，还可以通过调整参数获得不同质量的烘焙效果。Unreal 4引擎的World Settings中提供了一系列参数控制烘焙的质量，如下图所示，其中红框处的参数是对烘焙时间产生影响的重要参数。 通常情况下，质量越高对应烘焙的时间越长，对此，本文针对上述参数的不同设置进行了实验，对烘焙时间进行了统计，从而来说明这些参数对于烘焙效果的影响。其中Lighting Quality采用了Production等级，场景如下图所示： 下表显示了不同参数设置的烘培时间以及效果图： 表1：不同烘焙参数下的场景烘焙时间比较 - Static Lighting Level Scale 该参数表示了Irradiance Caching时的Recording Radius大小。它主要用于调节间接光照的精度，数字越小精度越高，同时带来的瑕疵也越多。其对预计算时间的影响较大，精度越高需要的预计算时间越长。表1中第一行和第二行数据则为不同Static Lighting Level Scale的烘焙时间比较，可以看出，该参数对于烘焙时间的影响较大。 - Num Indirect Lighting Bounces 该参数表示了Photon Reflections的次数，次数越高间接光的亮度越高。但随着次数的增加，效果的变化程度递减。其对预计算时间的影响较小。表1中第一行和第三行数据则为不同Num Indirect Lighting Bounces，可以看出，当间接光反射次数增大时，场景的烘焙时间略有提升。 - Indirect Lighting Quality 该参数表示了Final Gathering阶段的光线数目， Final Gathering阶段的作用是在最后计算Irradiance Caching 时，增加第一次Bounce的采样，如果不使用Final Gather，则第一次Bounce是Photon的反射，使用Final Gather则是Ray Trace的反射。增大其数值能够较少烘焙瑕疵，因此，其对预计算时间的影响很大。表1中第一行和第四行数据则为不同Indirect Lighting Quality的烘焙效果，从表中可以看出，Final Gathering阶段的光线采样数对烘焙时间影响很大，测试场景的烘焙时间增加了整整一倍时间。 - Indirect Lighting Smoothness 该参数表示了在计算Irradiance Caching 时对Photon进行插值的比例（Interpolation ratio）。该数值越大，间接光照越平滑。其对预计算时间的影响较小。表1中第一行和第五行数据则为不同Indirect Lighting Smoothness的烘焙效果，从表中可以看出，其对于烘焙时间没有特别影响，时间几乎没有增加。 2.4 Lighting Scenarios 在游戏制作过程中，有时会存在同一场景使用多套Lightmap的情况，如：模拟天气系统，以及一天中不同时段的光照等。在Unreal 4引擎中，可以利用Lighting Scenarios功能达到此效果。使用Lighting Scenarios时，首先需要创建不同的光照Level，然后在Level设置页面将其设置为Lighting Scenario类型，如下图所示： 另外，设置Level的加载方式为使用Blueprint加载： 接着，对不同Level设置不同的光照进行烘焙。烘焙结束后，在Persistent Level Blueprint中，添加Load Stream Level节点对Level进行加载，并设置要加载的Level名称Day，如下图所示： 当需要切换到夜晚的全局光照烘焙效果时，可使用该节点加载Night Level即可。渲染结果如下图所示，上下两图分别是白天和晚上的光照效果。 上图取自Unreal 4官方网站 小结：清晰的操作界面让Unreal 4引擎的烘焙功能足够简单、易用，其烘焙效果也十分惊艳，大家可以从上述的渲染效果种直接看到。但从我们的使用上来看，目前的烘焙效果是一次性计算完成，如果后续可以加入Progressive的烘焙方式，则会更加完美。 动态物体全局光照 对于动态物体全局光照，Unreal 4采用了在空间中分布光照探针，在烘焙时预计算间接光照，并利用PRT（Pre-computed Radiance Transfer）算法【6, 7】将光照信息用球面调和函数（Spherical Harmonics）进行存储。在实时光照计算时，再利用球面调和函数快速计算光照与材质的卷积得到间接光照效果。如果大家对于上述词汇比较陌生，那么大家可以想象Unity引擎中的Light Probe，这两种功能从本质上来说是一致的。目前，Unreal 4和Unity引擎中都使用了三阶球协函数进行表示。 在Unreal 4引擎中，提供了两种不同的方法渲染动态物体间接光照，ILC（Indirect Lighting Cache）和VLM（Volumetric Lightmap）。 3.1 ILC vs VLM ILC是Unreal 4引擎4.18版本之前主要使用的方法。该方法会在场景中所有Static物体的上方设置了一系列光照探针。VLM是Unreal 4引擎在4.18以后新推出的方法。该方法不仅在Static物体表面，而且在空间中也设置了光照探针，如下图所示： 上图取自Unreal 4官方网站 其中，左图是ILC的光照探针分布，右图是VLM的光照探针分布。由于VLM在空间中分布更广，因此其获取的间接光照信息更准确。并且，ILC的光照插值计算是基于光照探针，而VLM的光照插值是基于渲染物体的像素，下图显示了两者在照亮场景中非静态物体时的不同效果： 上图取自Unreal 4官方网站 同时，VLM不仅能对动态物体产生间接光照，而且还对Fog产生间接影响，如下图所示： 上图取自Unreal 4官方网站 其中，左图是没有使用VLM计算间接光的效果，右图是使用了VLM计算间接光的效果。 小结：Unreal 4中光照探针在3D空间中是全自动自适应分布的，在保证视觉效果的情况下使用最少量的光照探针进行渲染，更重要的是，该操作可以避免大量的手工布置工作。另外，其对于雾效等环境的间接影响效果，让我们眼前为之一亮，该功能可以大幅提升特殊环境、特定场合的渲染质量。 阴影效果 本节将介绍Unreal 4引擎中的阴影效果，其中主要包括：Masked Shadow、面光源和半透明物体的阴影效果。 4.1 Masked Shadow Unreal 4引擎对于树叶等使用Alpha Test方法渲染的物体的阴影能很好地渲染。通常情况下，采用Alpha Test渲染的物体都是在场景中渲染一个方形平面，然后在Shader中根据纹理的Alpha值来判断是否渲染某一像素，最后的渲染结果就会呈现出纹理中的形状。对于此类物体，Unreal 4引擎能很好地渲染出纹理中形状的阴影，如下图所示，其中，Unreal 4引擎的Shadow Map Texture Size为1024。 4.2 Area Light Shadow Unreal 4引擎对静态物体阴影，在不开启Cascade Shadow Map的情况下，使用了一种叫做Signed Distance Field Shadow Map的方法进行渲染。它支持根据面光源的大小渲染出不同锐利程度的阴影。面积越小的光源其烘焙的阴影边缘越锐利，面积越大的光源其烘焙的阴影边缘越模糊，如下图所示： 其中，上下两图分别是Directional Light Area为1和3的渲染结果，其边缘模糊的柔和感非常自然。 4.3 Translucent Shadow Unreal 4引擎对于半透明物体的阴影能够渲染出半透明影子的效果。该阴影效果只支持静态阴影，因此需要光源设置成Static，如下图所示： 然后，点击Build按钮烘焙，即可看到半透明阴影效果，如下图所示： 小结：Unreal 4引擎支持Masked Shadow、Area Light Shadow和Translucent Shadow等光影效果，并且将阴影的边缘处理的非常自然。 全局光照总结 Unreal 4引擎提供了完整的工具链来支持静态和动态物体的全局光照效果。在计算全局光照时采用了Photon Mapping算法，通过不同的参数设置可以达到不同质量的全局光照效果。Unreal 4引擎提供了同一场景使用不同全局光照设置的功能Light Scenarios，支持在不同全局光照效果进行切换。同时，其4.18版本提供了新的动态物体全局光照方法，该方法比之前的方法能够获取更精确的间接光照信息，并且对Fog等环境产生间接光照效果。另外，Unreal 4引擎提供了一些特殊阴影效果，如：Alpha Test的阴影，面光源阴影以及半透明阴影，其阴影边界的处理也是十分自然。Unreal 4引擎对于光影细节的处理和新功能所带来的强大效果，让我们在学习和使用过程中深感震撼。 参考文献 【1】 https://80.lv/articles/carylitz-tamez-ue4-student-work/ 【2】 http://graphics.ucsd.edu/~henrik/papers/photon_map/global_illumination_using_photon_maps_egwr96.pdf 【3】 http://www.cs.cornell.edu/courses/cs667/2005sp/studentSlides/01law.pdf 【4】 http://brahms.di.uminho.pt/discip/MCGAV/ifr0304/Artigos/Hanrahan91-HierarchicalRadiosity.pdf 【5】 http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/glossy_radiosity.pdf 【6】 https://blog.uwa4d.com/archives/Study_PRT.html 【7】 https://blog.uwa4d.com/archives/Study_Haar.html 以上即为UWA团队对Unreal 4引擎就渲染模块之全局光照明的讲解，之后我们将继续分享Unreal 4引擎中其他模块的学习心得，欢迎大家的关注！我们希望本系列文章能让更多的中国游戏开发者了解和理解Unreal 4引擎的重要功能和所能达到的效果，也让更多的中国游戏开发者对Unreal引擎和Unity引擎融会贯通，提升技术储备。 最后非常感谢您能阅读到这里，希望能对您的项目有所帮助，如对文中的内容有异议或者进一步的补充说明，欢迎在后台给我们留言，谢谢！
虚幻引擎学习之路：相机图像后处理
之前UWA为大家分别介绍了Unreal 4引擎中渲染模块的光照系统和材质系统，在本篇文章中，我们将为大家介绍渲染模块的图像后处理这部分内容。 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 图像后处理 渲染模块中图像后处理可用于实现各种特殊的镜头特效以及整体调节渲染的效果。它通常是在所有场景渲染结束后才执行。Unity引擎在2017版本之前的图像后处理都是采用将脚本组件添加到相机上实现。因此，每添加一个图像后处理脚本，就会多至少一次全屏幕的渲染Pass。Unity引擎在2017版本中引入了Post Processing Stack组件，该组件是一系列预定义图像后处理效果集合。它将多种图像后处理效果进行优化合并，提高了渲染效率，使开发者使用更加方便。Unreal 4引擎的图像后处理也是采用一系列预定义效果集合，开发者在使用时只需要从中勾选需要的效果即可。在接下来的内容中，本文将首先介绍Unreal 4引擎的图像后处理对象Post Process Volume的使用。然后，对其包含的一系列效果进行介绍，并与Unity引擎提供的效果做比较。最后，介绍自定义图像后处理的使用。 一、图像后处理使用 在Unreal 4引擎中，图像后处理模块是单独作为一个对象放在场景中，叫做“Post Process Volume”。创建时可以将“Modes”页面下“Post Process Volume”拖入场景即可，如下图所示： 其中，黄色的方框表示该Volume的范围，当相机处于范围中时，图像后处理才会生效。如果在Post Process Volume的设置界面中勾选了“Unbound”，则此图像后处理效果影响范围将扩大为整个世界空间，如下图所示： 同时，如果场景中出现多个Volume重叠，引擎会根据上图中的“Blend Weight”参数设置进行融合。 在Unity中Post Processing Stack的使用如同普通的脚本组件一样，只需挂接到相机上即可。然后通过新建Post Processing Profile进行参数设置，如下图所示： 目前，Unity的图像后处理有效范围是全局有效，部分区域有效的功能可通过脚本实现。但是Unity引擎提供的Post Processing Profile配置文件使参数共享变得更加便利。在不同的项目中，想要达到相同的图像后处理效果，只需共用相同的Post Processing Profile即可。 图像后处理使用Unreal 4 vs Unity小结 Unreal 4引擎与Unity 2017引擎的图像后处理功能都采用了统一的框架，将不同的预定义效果进行优化实现，其使用方式都很便捷。Unreal 4引擎的图像后处理支持有效区域以及混合的功能，Unity引擎提供的图像后处理配置文件能够更好地支持参数共享。 二、引擎内置效果 在Unreal 4引擎中，Post Process Volume的“Details”页面显示了不同类型图像后处理效果的设置，包括Color Grading，Tonemapper，Lens，Rendering等。在Unity引擎中，Post Process Profile的“Inspector”页面中显示了其支持的各种效果，如下图所示： 其中，大部分效果是Unreal 4引擎和Unity引擎都支持的。我们以对照的形式将其列出（Unreal 4 vs Unity）： Anti-Aliasing (vs) Anti-Aliasing Ambient Occlusion (vs) Ambient Occlusion Auto Exposure (vs) Eye Adaptation Bloom (vs) Bloom Color Grading (vs) Color Grading & User Lut Depth of Field (vs) Depth of Field Motion Blur (vs) Motion Blur Image Effects (vs) Chromatic Aberration & Grain & Vignette Screen Space Reflections (vs) Screen Space Reflection 接下来，我们将对Unreal 4引擎中的图像后处理效果逐一介绍。 1、Anti-Aliasing Unreal 4引擎中Anti-Aliasing也是图像后处理的一部分，可以在“Project Settings”->“Engine”->”Rendering”中找到其设置。Unreal 4引擎目前支持了三种反走样算法，如下图所示： 其中，效果最好的是Temporal AA，目前该方法用的最多，引擎也是默认设置该方法。MSAA目前使用相对较少。相比较而言，FXAA效果比MSAA更好。Unity引擎中支持的图像后处理反走样有两种，如下图所示： 下图显示了不开启AA与开启MSAA以及FXAA的效果对比，读者可以关注建筑和栅栏棱线的反走样效果。 该图取自Nvidia的FXAA说明文档 【1】，左图为不开启AA，中图为开启MSAA，右图为FXAA 下图显示了不开AA以及开启FXAA和Temporal AA的效果，读者可关注建筑上楼层分割线的反走样效果： 上图取自Unreal 4的Temporal AA文档 【2】 2、Tone Mapper & Color Grading 在Unity引擎中Color Grading的作用是做Tone Mapping（即将HDR的渲染结果转换成LDR）以及颜色校正（即将LDR结果进行校正使得设备显示正常）。在Unreal 4引擎中默认的Tone Mapper采用了ACES（Academy Color Encoding System）标准，在Unity引擎中的Tone Mapper在内部计算时也是采用ACES标准，但是它提供了Neutral和 Filmic两种选择。其中Neutral方式采用参数化的控制，尽可能减少了在Tone Mapping过程中对色度和饱和度的影响。Filmic方式采用与ACES近似的方法，因此其对比度比Neutral更强一些。下图显示了Unreal 4和Unity引擎的Tone Mapper设置界面： 在Unreal 4引擎中，Color Grading的设置包含了白平衡以及饱和度、对比度、Gamma校正等参数。并且，针对场景中的全局和不同部分，Unreal 4引擎提供了不同的参数设置，其中包括：Global、Shadows、Midtones以及Highlights。Unity引擎则提供了全局的设置参数，如下图所示： 除了设置参数，Unreal 4和Unity引擎还提供了用纹理做颜色映射的方法，它类似一个查找表（Look Up Table）。在Unreal 引擎中，该设置是在Color Grading选项中，在Unity引擎中则是单独放在User Lut选项下，如下图所示： 下图显示了使用不同的Lut纹理的渲染结果： 上图取自Unreal 4官方网站，上排图片显示了渲染结果，下排图片显示了用做Lut的纹理。 3、Image Effects Unreal 4引擎中的Image Effects包含了Chromatic Aberation、Vignette以及Grain的设置。分别对应Unity引擎中三种效果，如下图所示： Chromatic Aberation是一种模拟相机镜头产生的颜色偏移效果，如下图所示： Vignette模拟镜头边缘被遮挡导致的偏暗效果，如下图所示： Grain是用于模拟老式相机拍出的颗粒感，如下图所示： 4、Bloom & Dirty Mask Unreal 4和Unity引擎都支持Bloom以及Dirty Mask效果。Bloom模拟了亮度较强区域周围的泛光效果，Dirty Mask模拟了镜头被弄脏导致的效果。Unreal 4引擎的Bloom效果有两种方式“Standard”和“Convolution”。Convolution方式使得开发者能提供一张纹理自定义卷积核达到更真实的Bloom渲染效果，如下图所示： 下图显示了Bloom效果和Dirty Mask效果： 上图取自Unreal 4官方网站 5、Auto Exposure Unreal 4和Unity引擎的图像后处理支持自动调节曝光度效果。当场景整体亮度偏暗或者偏亮时，该效果会自动调节曝光度，使得场景不至于过亮或过暗，并保持场景中的细节。其设置界面如下图所示： 下图显示了自动调节曝光的效果： 上图取自Unreal 4官方网站 6、Lens Flares Unreal 4引擎支持镜头耀斑效果，它模拟了相机镜头在拍摄强光时产生的光斑。在其设置界面可以设置光斑的染色、大小、形状，如下图所示： 渲染效果如下图所示： 上图取自Unreal 4官方网站 7、Depth of Field Unreal 4和Unity引擎的图像后处理都支持景深效果。Unreal 4引擎的DOF效果支持三种方式，如下图所示： 其中，BokehDOF效果最好但最耗时，GaussianDOF效率最高，CircleDOF效果和效率居中，如下图所示： 上图取自Unreal 4官方网站 8、Ambient Occlusion Unreal 4和Unity引擎都支持Screen Space的Ambient Occlusion，其参数设置界面如下图所示： 下图显示了Unreal 4引擎中SSAO的渲染效果： 上图取自Unreal 4官方网站 9、Global Illumination Unreal 4引擎的图像后处理支持对间接光照进行染色，以及调整强度，如下图所示： 下图显示了设置Indirect Lighting Color和Indirect Lighting Intensity的渲染效果： 上图为原始渲染结果，中图为Indirect Lighting Color设为红色的渲染结果，下图为Indirect Lighting Intensity设为2倍的渲染结果。 10、Screen Space Reflection Unreal 4和Unity引擎都支持屏幕空间反射。Unity引擎支持两种模式，如下图所示： 其中Unity引擎支持两种不同的Blend类型：Physically Based和Additive。使用Physically Based类型时，Unity引擎会对反射表面的材质进行采样，然后计算反射结果。该方式比Additive更加耗时，但渲染结果更加真实。 下图显示了Unreal 4引擎的SSR渲染效果： 上图取自Unreal 4官方网站 11、Motion Blur Unreal 4和Unity引擎都支持运动模糊效果，如下图所示： 下图显示Unreal 4引擎中Motion Blur的渲染效果： 上图取自Unreal 4官方网站 图像后处理效果Unreal 4 vs Unity小结 Unreal 4和Unity引擎支持的大部分图像后处理效果都相似，少数效果两种引擎提供的参数设置有所区别。 三、自定义效果 Unreal 4和Unity引擎都支持自定义图像后处理。在Unity引擎中，只需要将图像后处理脚本组件挂接到相机上即可。在Unreal 4引擎中可利用Post Process Material来实现。 1、Post Process Material Post Process Material的创建与普通Material创建相同，只是在Material的参数设置中需将“Material Domain”选项设置为“Post Process”，如下图所示： 其中，图像后处理只需要用到材质的“Emissive Color”参数。在编辑时，只需将节点图与基础节点的“Emissive Color”引脚相连即可，如下图所示： 创建好Post Process Material后，即可在Post Process Volume的 “Post Process Materials”参数中使用，如下图所示： 其中，Post Process Materials参数是一个数组，可以设置多个材质进行融合。 自定义效果Unreal 4 vs Unity小结 对于自定义图像后处理效果，Unity采用脚本组件的方式，Unreal 4采用材质节点图的方式，两者都比较方便。 图像后处理小结 相比较而言，Unreal 4引擎和Unity引擎2017版本的图像后处理提供的内置效果大部分相似，使用起来都比较便利，只需在设置页面进行勾选并调整相应参数即可。自定义图像后处理的编辑和使用也都比较方便。 参考文献 【1】 http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf 【2】 https://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf 以上即为UWA团队对Unreal 4引擎就渲染模块之相机后处理的讲解，之后我们将继续分享渲染模块中烘焙相关的学习心得，欢迎大家的关注！我们希望本系列文章能让更多的中国游戏开发者了解和理解Unreal 4引擎的重要功能和所能达到的效果，也让更多的中国游戏开发者对Unreal引擎和Unity引擎融会贯通，提升技术储备。 最后非常感谢您能阅读到这里，希望能对您的项目有所帮助，如对文中的内容有异议或者进一步的补充说明，欢迎在后台给我们留言，谢谢！
虚幻引擎学习之路：渲染模块之材质系统
上周的Unreal 4引擎文章介绍了渲染模块的光照系统，在本篇文章中，我们继续介绍渲染模块的另一重要部分：材质系统。 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在我们学习其引擎的道路上提供的大力支持。 材质系统 材质描述了场景中物体与光照进行交互的过程，它是决定物体表面外观的最重要部分之一。Unreal 4引擎的材质系统为开发者提供了丰富的功能，使得开发者能够非常便捷地设计出具有真实感的场景和角色。本文将在接下来的内容中对Unreal 4引擎的材质系统功能进行逐一介绍，其中主要分为四个部分：材质编辑、材质模型、材质使用和特殊功能。在介绍前三部分内容时，本文会根据需要与Unity引擎功能的相似性进行比较。 一、材质编辑 在Unreal 4引擎中创建材质可以通过“Content Browser”中的“Add New”按钮或者右键弹出菜单中选择Material创建，如下图所示： 然后，双击“Content Browser”中的材质资源，即可打开材质编辑器。 传统引擎的材质系统对于材质编辑的支持都是需要开发工程师和美术设计师合作完成。通常情况下，技术美术（Technical Artist）或图形程序工程师编写和修改Shader代码，然后美术设计师提供输入纹理以及调试Shader参数。Unreal 4引擎则提供了一套更为方便的编辑方式，使得美术能够几乎不依赖于程序员制作出较为理想的材质资源。这种编辑方式类是一种似于Blueprint的节点图。在编辑材质时，只需要用引擎提供的节点和连线即可制作出逻辑较为复杂的材质效果，如下图所示： （上图取自Unreal 4官方网站） 其中，上图左边是材质编辑的预览，右边是材质节点图。该节点图中的节点在编辑完成后会被自动替换成HLSL代码段，并生成相应的Shader代码在实时渲染时使用。在调试过程中，编辑完节点图并保存后，即可在场景视图中看到最新的结果。 Unity引擎原生仅支持通过修改Shader代码的方式制作新的材质。但在Unity引擎Asset Store中有第三方插件Shader Forge提供了类似的编辑功能【1】，如下图所示： （上图取自Unity Asset Store 【1】） 此外，在Unreal 4引擎中的材质编辑界面的“HLSL Code”页面中可以查看由节点图生成的代码，如下图所示： 在“Stats”页面中可以看到当前Shader的Instruction和Texture Sampler的数目，如下图所示。这是一个直观简单、但却很实用的功能。Unity引擎暂时还未原生支持该功能，研发团队需要使用第三方工具来自行进行计算。 除了使用节点图进行材质编辑，Unreal 4引擎也支持直接采用HLSL代码进行编辑。其详细内容可参考Unreal 4官方网站。 材质编辑Unreal 4 vs Unity小结 相比较而言，Unreal 4引擎原生提供了非常方便的节点图交互方式，Unity引擎通过第三方工具也可以达到类似的效果。 二、材质模型 与Unity引擎5.x的Standard Shader类似，Unreal 4引擎的材质系统使用了当前游戏渲染中非常流行基于物理的渲染材质（Physically Based Rendering，以下简称PBR）模型。因此，它们都只需要少量的输入参数，就能表达丰富的材质外观，如下图所示： 其中，左图是Unreal 4引擎的材质系统节点图中的基础节点，其白色圆圈表示的引脚表示可设置的输入参数，通过设置不同的输入参数可以达到不同的材质效果。右图是Unity 5.x的Standard Shader材质设置界面。两者大部分参数表示含义是相似的，可通过以下各参数的对应关系来进行理解（Unreal 4 Unity）： Base Color Albedo：材质颜色、贴图 Metallic Metallic：金属度 Roughness Smoothness：粗糙、光滑度 Emissive Color Emission：自发光颜色、贴图 Normal Normal Map：法线贴图 World Position Offset Height Map：高度图 Ambient Occlusion Occlusion：AO贴图 上图显示了Unreal 4引擎与Unity引擎中不透明物体渲染的Shader参数设置。对于半透明渲染和Alpha Test渲染Unreal 4引擎和Unity引擎也都支持，并且可以通过修改参数选项进行设置，如下图所示： 其中，左图显示了Unreal 4引擎材质编辑器中“Blend Mode”设置选项，右图显示了Unity引擎“Rendering Mode”设置选项。其对应关系为（Unreal 4 Unity）： Opaque Opaque：不透明渲染 Masked Cutout：Alpha Test Translucent Transparent：半透明渲染 Unity引擎中的Fade模式是用于渲染模型逐渐消失的效果。Unreal 4引擎另外三种“Blend Mode”的含义如下，通过这三种参数开发团队可以达到更为灵活的半透明效果。 Additive：将Pixel的结果叠加到背景 Modulate：将Pixel的结果乘以背景 AlphaComposite：预乘Alpha值Blend Unreal 4引擎材质编辑器的基础节点中有许多“默认”输入参数，对不同的“Blend Mode”，其可供设置的参数也不相同，如下图所示： 其中，从左到右分别是：不透明、半透明以及Alpha Test的材质输入参数。对于无效的输入参数，Unreal 4引擎将其变成灰色，并且无法连接节点图。 Unreal 4引擎除了提供“常规”PBR的材质模型，还提供了一些用于制作特殊效果的材质模型。在我们来看，这些更像是Unreal引擎为开发者制作了一些快捷开发的材质模板。在材质编辑器中可以通过设置“Shading Model”进行选择，如下图所示： 其中，“Default Lit”表示默认的PBR材质模型。对于不同的材质模型，基础节点提供的输入参数也不相同。关于不同材质模型的输入参数和效果，本文不逐一介绍，读者有兴趣可参考Unreal 4官方网站。文本选择了几种我们认为效果特殊的材质模型进行介绍。 - Subsurface、Preintegrated Skin、Subsurface Profile 这三种材质模型的渲染效果比较相似，都属于次表面散射类。与Subsurface有所不同的是，Preintegrated Skin和Subsurface Profile都是专用于模拟人体皮肤渲染效果的模型。但是，Preintegrated Skin使用的方法更加高效并适合于低端设备，而Subsurface Profile的渲染效果更好适合高端设备。其效果如下图所示： Subsurface Preintegrated Skin Subsurface Profile （上图取自Unreal 4官方网站） 其中，上图从上到下分别是Subsurface、Preintegrated Skin以及Subsurface Profile的渲染效果。Subsurface效果渲染需要比较高的硬件资源，在Mobile端目前还不支持。 - Clear Coat 这种材质模型用于渲染不透明物体表面覆盖一层半透明的效果，如下图所示： （上图取自Unreal 4官方网站） 其中，左图是Unreal 4引擎渲染结果，右图是实际拍摄结果。可以看出，该材质的渲染效果相当惊艳！ - Two Sided Foliage 这种材质模型用于渲染树木材质效果，它比Default模型能更好地模拟树叶的透射效果，如下图所示： （上图取自Unreal 4官方网站） 其中，上图左边是采用Two Sided Foliage模型渲染结果，右图是Default模型渲染结果。 材质模型Unreal 4 vs Unity小结 相比较而言，Unreal 4引擎和Unity引擎都提供了丰富的、通用的基于物理的材质模型。Unreal 4引擎原生对于特殊效果提供了更多的材质模型。Unity引擎则通过Asset Store提供了一些特殊效果材质【2】【3】。 三、材质使用 Unreal 4引擎的材质在使用时与Unity引擎有所不同。在Unity引擎中，材质资源一旦被创建，就可以添加到各种渲染组件中进行渲染。同时，我们可以在运行时通过代码修改材质参数。但是，需要注意的是，当Shader中的某些功能没有被用到时，Unity引擎会自动对其进行优化。经过优化过后的Shader则不再包含这部分的功能，即使在运行时重新设置材质参数也不会生效。对于这种情况，在Unity引擎中可以通过Graphics Setting中的Always Included Shaders或在Shader中设置 “multi_compile”来实现，即告诉Unity引擎不要在Shader Stripping时去掉一些后续运行时需要使用的Key words。 在Unreal 4引擎中，修改材质资源的节点图以及参数不会立刻生效，需要点击右上角“Save”或者“Apply”，此时会引起材质重新编译。因此，材质资源中的参数并不支持在编辑器中实时或运行时更改。Unreal 4引擎提供了另一种材质资源Instanced Material。该种资源继承自材质资源，它拥有与其父类材质资源相同的节点图，并且支持在编辑器中实时或运行时修改参数。 Instanced Material 该种资源的创建与材质创建类似，在“Content Browser”中即可创建。然后双击资源图标即可打开编辑器。在“Details”页面中可以设置其继承的材质资源。下图显示了Instanced Material资源的设置界面，Parent参数即为其父类材质资源： 在使用之前，还需要在父类材质资源中将需要修改的参数用节点图中的“Parameter”类型节点表示，如下图所示： 然后，即可在Instanced Material编辑器的“Details”页面中看到，如下图所示： 其中，上图“Parameter Groups”中的“Color”和“Roughness”参数即为其父类材质资源中“Parameter”节点表示的参数。 该Instanced Material支持实时在编辑器中修改“Color”和“Roughness”参数，而不需要重新编译材质。但是这种Instanced Material仅支持在编辑其中修改参数，其在Unreal 4引擎中被称为“Material Instance Constant”。 如果需要运行时修改，则需要通过蓝图或者代码动态创建Instanced Material，这种材质在Unreal 4引擎中被称为“Material Instance Dynamic”。如果想在项目运行时，根据一些特殊情况调整材质参数（比如怪物/角色受击后改变颜色、死亡时改变透明度等等），那么就需要通过Material Instance Dynamic来实现这些效果。 材质使用Unreal 4 vs Unity小结 在Unreal 4中，Material主要分为三类：原始Material、Material Instance Constant和Material Instance Dynamic。与Unity中的材质系统比较，有以下三点非常值得注意： Unreal 4中的Material类似于Unity中的Shader，其节点图则可认为是Shader代码的定义； Unreal 4中的Material Instance Constant类似于Unity中Material，它是Shader和输入参数的集合. 只有导出的 Parameters 可以进行修改，但仅限在 Editor 下修改，在运行时是不能动态修改参数的。所以一般场景物件（不用动态改材质）都是使用各种Material Instance Constant来进行渲染； Unreal 4中的Material Instance Dynamic类似于Unity中的Material(Instance)。主要区别是，前者需要在Unreal 4中手动指出，后者是Unity在项目运行时，当修改Material参数时动态生成。 四、特殊功能 Unreal 4引擎不仅提供了通用的材质创建、编辑和使用功能，而且还提供了一些辅助的特殊功能。本文将对其中的三种进行详细介绍。 Material Function Unreal 4引擎的材质编辑器内置了丰富的功能性节点，使得开发者在编辑材质节点图时能够灵活地实现许多功能。但是，当编辑的节点图到达一定复杂程度后，维护起来就变得非常困难。Unreal 4引擎提供了一种类似函数式的用户自定义节点，Material Function。当某些功能在多种材质中共用时，可以采用Material Function将其封装成一个节点进行重复利用，降低了维护难度。 Material Function是Unreal 4引擎材质系统中的一种资源，通过右键菜单进行创建，双击即可打开Material Function的编辑器。Material Function的编辑方式与Material类似，也是采用节点图的方式，如下图所示： （上图取自Unreal 4官方网站） 当Material Function创建好后，在“Details”设置界面中勾选“Expose to Library”即可在Material的编辑的“Palette”中找到该节点，并可在节点图中使用，如下图所示： 使用方式与Unreal 4内置的节点相同，如下图所示： Layered Materials 在Unreal 4引擎中，Material Function实现了将某种通用功能封装成一个节点重复利用。而利用Material Function的特点以及“Make Material Attributes”节点可以在一个材质资源中，将多种材质进行混合，如下图所示： （上图取自Unreal 4官方网站） 其中，上图是一个Material Function的节点图，“Make Material Attributes”类似于材质资源中的基础节点，它可以被认为是在Material Function内部完成了一种材质的定义。而在编辑材质资源时，通过将多个预先定义好材质的Material Function进行混合，就可达到Layered Materials混合效果。它可以被用于制作模型表面不同位置用不同材质渲染的情况，如下图所示： （上图取自Unreal 4官方网站） 其中，角色模型用了5种不同的材质进行渲染。这几种材质可以通过Layered Materials方式在一个模型上实现。 Material Parameter Collections 在编辑材质资源的过程中，通常会遇到某一个参数在不同的材质资源中使用的情况。此时，可以利用Unreal 4引擎提供的Material Parameter Collections资源进行管理。该种资源可以维护一系列变量和向量的参数值。这些参数可以在不同的材质中进行引用。当需要修改时，只需修改Material Parameter Collections资源中的共用参数值即可。在Unity中也有类似功能，即使用Shader的SetGlobal方法对全局参数进行设置。 特殊功能Unreal 4 vs Unity小结 相比较而言，Unreal 4引擎提供了更多、更复杂特殊效果支持，使得美术在制作时能够更灵活、便利地实现复杂的材质。 材质系统小结 与我们熟悉的Unity引擎一样，Unreal 4引擎对当前流行的PBR材质模型同样进行了深度的支持，且在材质编辑方面，Unreal 4原生提供了更为直观方便的节点图交互方式。而在功能和效果上，Unreal 4引擎提供了丰富的模板和Material Function功能，从而让开发团队可以高效地创作出惊艳的渲染效果。希望随着移动硬件设备的逐渐提升，这些惊艳的效果可以在更多的项目中得到体现。 参考文献 【1】 https://www.assetstore.unity3d.com/en/#!/content/14147 【2】 https://www.assetstore.unity3d.com/en/#!/content/100332 【3】 https://www.assetstore.unity3d.com/en/#!/content/3254 以上即为我们对Unreal 4引擎就渲染模块的材质系统的讲解，之后我们会将继续分享渲染模块下的图像后处理等其他学习心得，欢迎大家的关注！我们希望本系列文章能让更多的中国游戏开发者了解和理解Unreal 4引擎的重要功能和所能达到的效果，也让更多的中国游戏开发者对Unreal引擎和Unity引擎融会贯通，提升技术储备。 最后非常感谢您能阅读到这里，希望能对您的项目有所帮助，如对文中的内容有异议或者进一步的补充说明，欢迎在后台给我们留言，谢谢！