找回密码
 立即注册
查看: 469|回复: 2

[译文]Unreal Engine 4 渲染目标(Render Target)教程 之 可交互的草地(上)

[复制链接]
发表于 2021-4-9 12:55 | 显示全部楼层 |阅读模式
原文|《Unreal Engine 4 Tutorial: Creating Interactive Grass in Unreal Engine 4》
作者|Tommy Tran Aug 10 2018  | 翻译 开发游戏的老王 阅读时长|20分钟 内容难度|中级
本教程将会介绍如何使用Scene Capture和粒子实现可交互的草地。
一直以来,游戏中的草地经常使用地面上的纹理来表现,而不是独立渲染每一根草。但是,随着硬件的性能不断提高,我们已经有能力渲染草了。比如著名的《地平线:黎明时分》以及《塞尔达传说:荒野之息》。在游戏中不仅玩家可以穿越草地,更重要的是草会和玩家发生交互。
更幸运的是,实现这样一个系统并不困难。在本教程中我们就会学习如何实现它!本文将会介绍:
    使用Scene Capture和粒子系统(Particle System)创建向量场(Vector Field)使用向量场使草弯曲
注意:本教程假定读者已经掌握了Unreal Engine的基本用法。


注意:本教程渲染目标系列教程四部曲之一:
第一部分:使用渲染目标绘制
    第二部分:雪地上的足迹

    第三部分:可交互的草(当前位置!)第四部分:网格模型绘制(敬请期待)
开始吧

译者注: 本教程提供了范例工程,如果需要可以到原文网站免费注册并下载
解压范例工程,在InteractiveGrassStarter文件夹中打开InteractiveGrass.uproject。我们可以看到一小片草场,以及笔者创建的一个窗口小部件来显示Scene Capture的渲染目标。




阅读本文之前,请确保已经完成了如下前导程,因为一些讲述过的内容本文将不再赘述:
注意,本文还会使用Scene  Capture以及投影。为了节省时间,笔者已经用蓝图设置了Scene  Capture,其方法也和雪地足迹教程中的差不多。
首先,我们来看看如何创建可交互的草。最常见的方法就是将角色的位置发送给草的材质,然后用一个球形遮罩让指定半径范围内的草弯曲(本方法简称球形法)。
这种方法是不错的,但它的扩展性不好。如果我们要添加多个可以和草交互的角色,那么对于每个角色,都必须添加其位置和球形遮罩到草的材质中。其实,有一种扩展性更好的方法,那就是向量场(vector field)
什么是向量场(Vector Field)

向量场其实就是一个简单的纹理,它的每一个像素都代表着方向。如果你以前用过流程图作业图(flow map),它们都是一回事。不同的是,这次我们是使用世界位置偏移量(World Position Offset )引脚移动顶点,而不是移动UV。与球形法不同的是,材质只需要对向量场采样一次以获得弯曲方向。
接下来看看如何个把方向存储到纹理中。请看下面这个网格:




假设红色的点就是我们要移动的对象。如果把它移动到右下角,应该用什么向量表示本次移动?没错,就是 (1, 1)!也许你也知道,其实我们还可以用颜色来表示向量,这就是我们在纹理中存储向量的方法。咱们把向量值填入虚幻的颜色拾取器看看得到什么颜色。




如你所见,方向值(1, 1)返回黄色。这意味着如果我们想让草向XY的正方向弯曲,我们使用这个颜色就可以了。现在,我们看一下所有向量对应的颜色。




右下脚的象限看起来非常不错,因为它在两个轴向都有梯度。这意味着我们可以把该象限内的任何向量存储为颜色(因为这个象限内任何的向量值正好等于它的颜色值)。
但是其它三个象限就不行了,要么只有一个轴有梯度要么干脆一个都没有。这意味着多个向量会共用一个颜色。比如:向量 (-1, 1) 和 (0, 1)的颜色是相同的。
之所以另外三个象限不能找到和向量值一一对应的颜色,是因为颜色颜色分量的取值范围是0到1,而这三个象限使用的是该范围之外的负值。
解决改题的方法就是将每个向量(包括所有四个象限)重新映射使其值在0到1之间。我们可以让向量乘以0.5再加上0.5。下图就是重映射后的效果:




现在每个向量都拥有了一一对应的颜色。如果我们需要使用它,仅需要将它重新映射会-1到1的区间即可了。下面是重映射以后几个颜色以及它们所代表的方向:
    (0, 0): - X和+ Y(0.5, 0.5): 无移动(0, 1): - X和- Y(1, 0): + X和- Y
接下来,咱们看看如何在虚幻中创建向量场。
创建向量场

和上一教程中的雪地足迹不同,我们无须捕获物体的形状,取而代之的是,我们将直接使用“笔刷”在渲染目标上绘制。所谓笔刷就是自定义向量场的图片。这种笔刷我称之为方向笔刷(direction brushes)
我们并非使用蓝图向渲染目标绘制,而是使用粒子(particles)。粒子将显示方向笔刷并从角色所在位置发射。要实现向量场,我们只需使用scene capture并捕获粒子。这个方法的好处在于很容易创建拖尾(trail),并且允许我们方便地控制诸如拖尾时长以及大小等参数。粒子还会产生半持久化(semi-persistent)的拖尾,因为它们在角色离开并再进入所在区域后依然存在。
译者注: 雪地足迹一文中提到的半持久化方法就体现在这里了。
下面有几个可供选择的方向笔刷,以及它们在草坪上产生的效果。注意:下面的例子中粒子是不可见的。


现在,我们来实现可以显示方向笔刷的材质吧。
创建方向材质

有两种方法创建方向笔刷:
    数学法:本方法中我们在材质中直接定义方向和形状。优点就是无须额外的软件并且对于简单图形非常方便。转换法线贴图法:本方法中我们需要为期望的方向和形状创建一个法线贴图,然后把法线贴图转换成向量场。转换方法就是将蓝色通道去掉就可以了。优点是可以非常轻松地实现复杂的形状。比如下面这个形状,就很难直接用上面的数学法实现。




本教程中,我们会使用数学法创建向量场。在Materials文件夹打开M_Direction。注意将材质的光照模型设为无光照(Unlit)。这一点非常重要,因为这样 scene capture才能够在无光照影响的情况下捕获粒子。
简单起见,我们将实现一个材质,它会使草向远离粒子的中心的方向倒下。请按下图连接节点:




接下来我们要做重映射,按下图高亮所示连接节点:


接下来,构造一个圆形。按下图高亮所示连接节点:


RadialGradientExponential是圆的大小和边缘硬度。将它乘以Particle Color将允许我们控制粒子在粒子系统中的不透明度(opacity)。我们将会在下面的部分详细介绍这一点。
下图就是笔刷的样式:




点击Apply并关闭材质。现在材质已经实现完毕,接下来该用粒子系统实现拖尾了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-4-9 13:02 | 显示全部楼层
原神的做法跟这个差不多
发表于 2021-4-9 13:10 | 显示全部楼层
这套教程虽然有点老,不过原理应该还没过时,关键师步骤详细,堪称良心
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 22:38 , Processed in 0.068241 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表