虚幻引擎4中的动态网格图绘制


在本虚幻引擎4教程中,您将学习如何在任何类型的网格上绘制颜色。

网格绘图允许玩家为游戏中的物体着色。 网格绘图的示例: Super Mario Sunshine中的涂鸦(圆环), Portal 2中的凝胶和Splatoon中的墨水。 绘画可以用作游戏元素,也可以只是图形设计。 尽管如此,按网格绘制为游戏设计师和美术师开辟了新的可能性。

尽管在上面的示例中几乎平等地使用了这种效果,但是您可以将网格绘制用于许多其他效果。 例如,您可以使用油漆罐在物体上绘画,在角色上绘制伤口,甚至让玩家自己绘制自己的脸!

在本教程中,您将学习如何在骨架网格物体上绘制。 为此,我们将执行以下操作:

  • 将网格扩展到其UV形状
  • 使用线迹相交点创建球形网格遮罩
  • 使用场景捕获在渲染目标中渲染扩展的网格和球形蒙版
  • 使用遮罩在角色材料中混合纹理。

请注意,本教程与绘制顶点无关 。 绘制顶点取决于网格的分辨率,并且在游戏过程中无法更改。 相比之下,本教程中使用的方法不管网格的分辨率如何都可以工作,并且可以在游戏中使用。

注意:据了解,您已经了解使用虚幻引擎的基础知识。 如果您是虚幻引擎的新手,那么请阅读面向初学者的虚幻引擎教程系列(共 10部分)。
注意:本教程是有关在虚幻引擎中使用渲染目标的一系列教程的第四部分:

开始工作


首先下载本教程的资料。 解压缩它们,转到MeshPainterStarter并打开MeshPainter.uproject 。 单击播放以查看将要着色的字符。


就像在雪地和草丛中的教程中一样,此方法也需要场景捕获。 为了节省时间,我已经创建了一个捕捉场景的蓝图。 如果您想了解有关捕获选项的更多信息,请阅读有关在雪中创建足迹的教程。

首先,让我们找出如何在网格上绘制。

网格图


在大多数情况下,必须使用的网格已经进行了UV扫描。 因此,使用渲染目标创建遮罩,然后将其应用于网格是合乎逻辑的。 但是,直接在渲染目标上生成蒙版(使用“绘制材质到渲染目标”)通常会导致UV壳破裂。

这是UV立方体扫描和球形蒙版纹理的示例:


这是应用于多维数据集的蒙版:


如您所见,二维球形蒙版不会在拐角处弯曲,也不会考虑几何形状。 为了生成正确的蒙版,球形蒙版必须采样世界上的位置 。 使用“绘制材质来渲染目标”节点时如何访问世界上的位置?

如果您研究了通过网格绘制的方法,则可能会发现Ryan Brooke的一段视频,介绍了使用渲染目标绘制字符损坏的情况 (本教程中使用的方法基于他的方法)。 在视频中,他成功地生成了三维球形蒙版并将其累积在渲染目标中。 他之所以能够做到这一点,是因为他创建了一个用于存储世界上网格位置的渲染目标,然后可以使用球形蒙版对其进行采样。 让我们更详细地看一下这种方法。

瑞安法


此方法包括四个步骤。 第一步是“部署”所需的网格。 您只需要移动所有顶点即可使网格处于其UV形状。 例如,这是角色的UV坐标:


这是部署到虚幻引擎之后的角色:


您可以通过简单计算世界位置的位移来扩展网格(我们将在下面讨论)。

第二步是在渲染目标中编码世界位置。 这可以通过将扫描材质的颜色设置为“ 绝对世界位置”并使用场景捕获来捕获扫描来完成。 渲染目标如下所示:


注意:渲染目标会更改颜色,因为角色已设置动画。 这导致世界地位的不断变化。

第三步是创建球形蒙版。 访问了世界上的网格位置后,我们可以将它们采样到球形蒙版上,然后直接在第二个渲染目标上绘制球形蒙版。

最后一步是在角色的材质上应用遮罩,以混合颜色,纹理或材质。 这是第三和第四阶段的可视化:


现在让我们看看我提出的方法。

拟议方法


尽管Ryan的方法可行,但他需要以下条件:

  • 两个渲染目标渲染。 第一个捕获未显影的网格,第二个捕获球形蒙版。
  • 一个用于存储世界位置的渲染目标
  • 渲染目标以收集球形蒙版。 对于要在其上绘制的每个演员,您将需要一个单独的渲染目标。

本教程中描述的方法拒绝第二次渲染,并且拒绝目标在世界上的位置。 通过将扫掠和球形蒙版组合到一种材料(扫掠材料)中,这是可能的。 之后,使用累加复合模式捕获扫描以累积球形蒙版。

值得注意的是,当网格没有重叠的UV时,这两种方法都效果最佳。 如果UV重叠,则像素具有公共的UV空间,因此有关蒙版的信息相同。 例如,角色的两只手可以在同一空间中进行UV部署。 如果将遮罩应用于一只手,则也将其应用于另一只手。

现在我们已经熟悉了该方法,让我们从创建扫描材质开始。

创建平面材料


转到“ 材料”文件夹并创建一个新材料。 将其命名为M_Unwrap ,然后将其打开。

更改以下选项:

  • 阴影模型:未点亮。 因此,场景捕获将无法捕获照明信息。
  • 双面:启用。 有时,展开的面可能看起来相反(这取决于对网格进行UV扫描的方式)。 双面参数可确保我们看到所有反面。
  • 用法\与“骨骼网格物体”一起使用:已启用。 启用此参数后,将编译材质在骨骼网格上工作所需的着色器。


接下来,我们扩展网格。 为此,请创建以下图表。 请注意,我已经在MPC_Global 资产中创建了CaptureSizeUnwrapLocation参数


因此,我们将在指定位置以指定大小执行UV扫描。 请注意,如果网格的唯一UV扫描位于单独的通道中,则需要更改TextureCoordinate节点的Coordinate Index 。 例如,如果唯一的UV坐标在通道1中,则必须将Coordinate Index设置为1

下一步是创建球形蒙版。 为此,我们需要两个参数:交点和球体的半径。 创建选定的节点:


对于球形蒙版内的像素,此方案将返回白色,对于球形蒙版内的像素,此方案将返回黑色。 不必担心为参数设置值,因为我们会简单地进行此操作。

将“ 绝对世界位置”节点设置为“ 绝对世界位置”(不包括“材质明暗器偏移”)很重要 。 这是必要的,因为像素在世界中的位置将由于展开而发生变化。 不包括“材质明暗器偏移”,可以让我们在部署之前在世界范围内处于起步位置。

这就是清扫材料所需要的。 单击“ 应用”并关闭材料。 接下来,我们需要将材料应用于角色以进行扩展。

角色部署


在本教程中,抓斗的蓝图将进行部署和抓取。 首先,我们需要一个动态的扫描材质实例。 转到Blueprints文件夹并打开BP_Capture 。 然后将突出显示的节点添加到Event BeginPlay中 。 确保将Parent设置为M_Unwrap


接下来,我们需要一个函数来执行扫描和捕获。 创建一个名为PaintActor的新函数。 然后创建以下输入:

  • ActorToPaint:类型必须具有值Actor 。 这是我们将对其进行扫掠和捕获的演员。
  • HitLocation:输入Vector 。 这将是球形蒙版的中心点。
  • BrushRadius:键入Float 。 球形蒙版的半径,以世界为单位。


尽管此绘制方法可以与任何actor一起使用,但我们仅检查结果的actor是否继承自Character类。 为了简化代码,我们将骨架网格物体组件存储在一个变量中,因为我们将不得不多次引用它。 为此,我们将添加选定的节点:


现在是时候进行球形掩模的开发和应用了。 为此,将选定的节点添加到节点链的末尾:


这是每行的作用:

  1. 首先,我们保留网格源材料,以便以后可以重新应用它。 然后我们应用扫掠材料。
  2. 这条线通过扫描材料的​​交点和笔刷半径以应用球形蒙版

要测试扫掠,我们首先需要跟踪玩家的直线以获得相交点。

获取相交点


单击编译,然后返回到主编辑器。 然后关闭BP_Player 。 打开“ 拍摄”功能并添加突出显示的节点。 对于本教程,将Brush Radius设置为10


单击编译,然后关闭BP_Player 。 单击“ 播放” ,然后在角色上单击鼠标左键以向下钻取并应用球形蒙版。


如果您不了解蒙版为何继续移动,那是因为零件相对于球形蒙版移动。 但是,这不是问题,因为我们仅在相交时执行扫掠捕获。

现在我们已经解开了网格,我们需要进行扫掠捕获。

扫掠捕获


对于初学者,最好在扩展的网格后面添加一个不亮的黑色平面。 这样可以避免UV壳边缘上的接缝。 打开BP_Capture ,然后添加一个名为BackgroundPlane平面组件。 为了节省时间,我已经创建了黑色材质。 对于材质,选择M_Background


在本教程中,我们使用500×500单位进行展开和捕获,因此背景平面应不小于这些尺寸。 将缩放设置 (5.0,5.0,1.0)


由于平面的位置和扫掠的位置相同,因此最好将平面向下移动以避免z冲突。 为此,请设置位置(0.0,0.0,-1.0)


接下来,我们需要执行捕获。 返回PaintActor函数并添加突出显示的节点:


因此,我们将捕获扩展的网格,然后将再次应用网格的源材料。

在结果方案中,场景捕获将覆盖渲染目标的内容。 为了积累球形蒙版,我们需要将场景捕获添加到先前的内容中。 为此,选择SceneCapture组件,然后将Scene Capture \ Composite Mode设置Additive


单击“ 编译” ,然后关闭蓝图。 现在我们需要在角色材质中使用渲染目标。

口罩使用


转到“ 角色\模特\材料”,然后打开“ M_Mannequin” 。 然后添加突出显示的节点。 将纹理样本设置为RT_Capture


此方案将在蒙版为白色时显示红色,在蒙版为黑色时显示橙色。 但是,我们可以混合纹理或材质层。

单击“ 应用”并关闭材料。 单击播放然后在角色上单击鼠标左键以开始绘制。



接下来要去哪里?


可以从此处下载完成的项目。

尽管在本教程中我们使用了球形蒙版,但这并不是唯一可以使用的图形。 毕竟,有立方体,圆柱体,圆锥体等等! 要了解有关这些形状的形式以及如何使用它们的更多信息,您可以阅读以下两篇文章:


如果要学习在网格上绘制的另一种方法,请阅读Tom Lohman的文章Rendering Wounds on Characters 。 代替累积球形蒙版,它使用固定数量的球形蒙版。 此方法的优点是便宜(取决于球形蒙版的数量)和动画化蒙版的相对简单性。 该方法的缺点是严格限制了球形掩模的数量。

Source: https://habr.com/ru/post/zh-CN423165/


All Articles