找回密码
 立即注册
查看: 439|回复: 1

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

[复制链接]
发表于 2021-4-12 09:39 | 显示全部楼层 |阅读模式
本文是《Unreal Engine 4 渲染目标(Render Target)教程 之 可交互的草地》的下半部分,上半部分请见
作者|Tommy Tran Aug 10 2018 | 翻译 开发游戏的老王
实现拖尾粒子系统

ParticleSystems文件夹中打开PS_GrassTrail。时间的关系,笔者已经创建好了我们所需的所有模块。




解释一下各个模块对拖尾的影响:
    Spawn: 产生率影响拖尾的平滑度,如果你发现拖尾看起来生硬有顿感,那么就把Spawn调大点。本文使用其默认值20。Lifetime: 草回到其默认状态的时长。Initial Size: 拖尾的大小。Color Over Life: 因为我们在材质中使用了例子颜色(Particle Color),所以可以在这里控制不透明度(opacity)。同时也可以调整透明度曲线(alpha curve)来控制拖尾的渐变(fade)。例如,我们可以使用线性渐变来渐入/渐出。本教程我们就使用默认的线性渐变。Lock Axis: 确保粒子朝向scene captureInitial Rotation: 确保粒子朝向正确的轴向(后面会详细解释)。
首先,我们要设置材质。选择Required模块并将Material设为M_Direction,顺便将(排序模式)Sort Mode设为PSORTMODE Age Newest First




这种排序模式能够确保新生粒子将渲染在老的粒子之上。如果不这样做,老粒子就会代替新粒子影响草地。
接下来设置拖尾的生命周期。选择Lifetime模块,并将Constant设为5.这意味着拖尾将在5秒钟后消失。




现在,我们需要确保粒子面朝scene capture。因为本教程中scene capture是自顶向下捕获的,所以粒子要朝向Z轴的正方向。只要选择Lock Axis模块把Lock Axis Flags设为Z就可以了。




最后,我们要设置粒子的旋转。目前,笔刷的颜色(译者注:颜色即方向)并未和粒子的方向对齐。这是因为,在默认情况下粒子系统会自带一个90度的旋转。要解决这个问题,我们得选择Initial Rotation模块然后将Constant设为-0.25。这实际上是把粒子逆时针回转90度。




粒子系统部分就完工了。
接下来,我们要把粒子系统添加到我们想创建拖尾的地方。本例中,我们把它添加到角色(player character)上。
添加粒子系统

Characters\Mannequin文件夹中打开BP_Mannequin。然后创建Partice System组件并更名为GrassParticles




接下来,我们要设置粒子系统。在细节面板中将Particles\Template设为PS_GrassTrail


如果玩家在游戏中能看到拖尾,会很奇怪,所以最好通过开启Rendering\Owner No See将它设为对于玩家不可见。




点击Compile然后按下Play。注意此时粒子系统从玩家的摄像机中消失了,但是在渲染目标中依然可见。




当前,scene capture被设为捕获一切。显然这样不好,因为只有粒子才会影响草。在下一个部分我们将学习如何只捕获粒子。
捕获粒子

如果我们现在就捕获粒子,那么草在没有粒子的地方会得到一些非预期的弯曲。这是因为渲染目标的底色是黑色的,而黑色代表的移动方向是XY轴的负方向(重映射后),从而导致了弯曲。为了让没有粒子的地方不发生弯曲,我们要让渲染目标的底色为(0.5, 0.5, 0)。一种简单的实现方法就是创建一个巨大的平面,并将它放到角色身上。
首先,我们为背景创建一个材质。回到资源管理窗口,打开Materials\M_Background。然后为Emissive Color设定一个常量值 (0.5, 0.5, 0)



注意:和粒子材质一样,任何我们要捕获的材质都应该设为unlit
点击Apply然后关闭材质。回到BP_Mannequin新建一个Plane组件并命名为Background




接下来,设置如下属性:
    Location: (0, 0, -5000),设得足够低,这样就不会遮挡任何粒子了。Scale: (100, 100, 1),放到足够到,以至于覆盖掉整个捕获区域。Material: M_Background。


和粒子系统一样,如果玩家看到这个大黄板会很奇怪,所以开启Rendering\Owner No See把它隐藏起来。


这样,背景就完工了,现在可以捕获粒子了。我们可以把粒子系统添加到scene captureshow-only list中这是一个scene capture将会忽略的组件列表。
使用Show-Only List

在添加Show-Only List之前,我们需要获取所有能够影响草地的角色。一种实现方法就是使用标签(tag)。标签就是可以指定给角色和组件的简单字符串。我们可以使用Get All Actors With Tag节点来获取所有带着某个标签的角色。
因为玩家角色将会影响草地,所以要给它添加标签,本例中为其添加标签GrassAffector


因为Show-Only List仅接受组件,所以我们也需要为那些会影响草地的组件添加标签。分别为GrassParticles组件和Background组件添加标签GrassAffector
然后把所有可影响草地的组件全部添加到Show-Only List中。点击Compile并关闭BP_Mannequin。然后,打开Blueprints\BP_Capture。为Event BeginPlay事件添加如下高亮节点。




这段代码将会遍历所有带有GrassAffector标签的角色,然后检查它们是否有GrassAffector标签的组件,如果有则将它们添加到show-only list
接下来,我们要告诉scene capture使用 show-only list。选择SceneCapture组件,在细节面板上找到Scene Capture属性区。将Primitive Render Mode设为Use ShowOnly List




点击Compile关闭蓝图。点击Play,我们将看到渲染目标现在仅捕获粒子以及黄色的背景。




下一个部分,就是我们期待已久的实现折草效果了。
折草

首先我们要把渲染目标投影到草地上。在Materials文件夹中打开M_Grass。然后创建下面的节点,请确保纹理设为RT_Capture




因为我们已经把颜色重映射到了0到1的范围,我们需要再把它重映射回-1到1的范围:


现在我们已经得到了折草的方向(下文简称:折向),还需要把草向这个方向旋转。幸运的是,RotateAboutAxis节点就可以做这件事。创建一个吧。




让我们从NormalizedRotationAxis引脚开始。正如其名,这是顶点旋转所围绕的轴。要计算这个轴向,我们只需要让折向(0, 0, -1)做向量积运算:




接下来处理RotationAngle,这个引脚是顶点绕轴旋转的角度。默认情况下,接受0到1区间的值。其中0代表0度;1代表360度。我们通过折向的长度乘以最大旋转角度获得旋转角度。


乘以值为0.2的醉倒旋转意味着最大旋转角度为72度(即0.2*360)。
计算轴心点(PivotPoint)需要点技巧,因为草的网格模型包含多个草叶子。这就意味着我们无法使用Object Position节点了,那样的话每个草叶子都会返回相同的点。
本教程中我们近似地找到一个轴心点。计算方法就是简单地从顶部向下移动某个偏移量。


通过添加如下节点,实现上述计算:


本教程中,草大约是80个单位高度,所以我把PivotOffset也设成这个值。
接下来,我们需要两个遮罩。第一个用于确保草的根部不要移动;第二个要确保在捕获区域以外的草不要被向量场影响。
遮罩

本例中,我已经为草设置了顶点色(vertex colors),底部是黑色顶部是白色。


RotateAboutAxisVertex Color节点相乘,就可以确保根部不会旋转了。


将前面的结果乘以如下高亮节点,就能够确保范围之外的草不受向量场影响。




点击Apply并关闭材质。然后点击Play,在草原里尽情奔跑吧!


本帖子中包含更多资源

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

×
发表于 2021-4-12 09:46 | 显示全部楼层
[爱][爱][爱]
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-26 03:48 , Processed in 0.156341 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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