原文|《Unreal Engine 4 Tutorial: Dynamic Mesh Painting in Unreal Engine 4》
作者|Tommy Tran Sep 7 2018 | 翻译 开发游戏的老王
阅读时长|15分钟 内容难度|中级
在本教程中,您将学会如何在任意类型的网格上绘制颜色
文章目录
网格绘制指的是游戏运行时玩家在物体上绘制的能力。比较经典的例子:《超级马力阳光》中的粘性物质,《传送门》中的凝胶剂,《喷射战士》中的染料。网格绘制可用于游戏性元素也可纯粹用于视觉效果。无论如何,它都给游戏设计师和艺术家提供了大量的可能性。
尽管上述经典案例的效果相似,你依然可以使用网格绘制实现喷溅物体、渲染角色的伤口甚至允许玩家为他们的角色画脸谱!
本教程内容重点是在骨骼网格(skeletal mesh)上绘制。我们会介绍:
- 为一个网格展UV
- 使用射线追踪的撞击位置为网格进行球形遮罩
- 使用scene capture将展过UV的网格和球形遮罩渲染到渲染目标
- 使用遮罩将纹理和角色材质进行混合
本教程并非顶点绘制教程。顶点绘制依赖于网格的分辨率并且无法在运行时改变。而本教程中的方法不依赖于网格分辨率并且可以在运行时执行。
注意:本教程假定读者已经掌握了Unreal Engine的基本用法。
注意:本教程渲染目标系列教程四部曲之一:
开始吧
译者注: 本教程提供了范例工程,如果需要可以到原文网站免费注册并下载。
在MeshPainterStarter文件夹中打开MeshPainter.uproject,点击Play的话,你会看到一个小人儿,这就是我们要绘制对象。
和前面雪地足迹教程和可交互草地教程一样,本教程也需要scene capture,为了节省时间,笔者已经创建好了scene capture蓝图。如果想了解scene capture设置,请参阅前面的教程。
首先,咱们看一下如何在网格上绘制。
网格绘制
大多数情况下,我们使用的网格都已经展好UV了,这时我们只需要使用渲染目标创建遮罩并将其应用到网格上就可以了。然而,直接在渲染目标上绘制遮罩会使UV壳(UV shell)出现一些不连续的问题。
以下为一个立方体UV和一个球形遮罩的例子:
当我们把遮罩应用到立方体上:
如你所见,一个2D球形遮罩无法包裹那些拐角。如果要生成正确的遮罩,球形遮罩需要在网格的世界坐标系中采样。然而,我们绘制渲染目标时如何才能访问到世界坐标呢?
在油管上一个名为Ryan Bruck的UP主做了一个关于使用渲染目标实现角色伤害效果的视频(本教程中的方法就基于Ryan Bruck的方法)。在他的视频中,他成功地生成了3D球体遮罩,并把它应用到了渲染目标上。之所以能够实现,是因为Ryan Bruck创建了一个渲染目标来存储网格的世界坐标,这样他就可以用球形遮罩来采样了。下面,咱们深入聊一聊这事儿。
Ryan的方法
Ryan的方法一共有4个步骤。第1步就是对网格“展UV”。例如,下图就是角色的UV:
下面是角色在虚幻中展完UV的样子:
我们可以在给网格展UV的时候使用点简单的世界位置偏移量计算(后面会解释这个)。
展完UV,第2步就是要把网格的世界位置编码到渲染目标中。我们可以将展开材质(unwrap material)的颜色设为绝对世界位置(Absolute World Position),然后使用scene capture来捕获展开。
注意:之所以渲染目标的颜色会改变,因为角色是带动画的,因此世界位置也是持续改变的。
第3步就是创建球形遮罩。现在我们就可以访问网格的世界位置,并使用球形遮罩对其采样。我们可以将球形遮罩直接渲染到第二个渲染目标上。
第4步就是在角色的材质中使用遮罩来混合颜色、纹理以及材质。以下是第3、4步的可视化表示:
接下来我们来看一下笔者提出的方法。