找回密码
 立即注册
查看: 488|回复: 0

[译文]Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(上)

[复制链接]
发表于 2021-4-3 08:38 | 显示全部楼层 |阅读模式
原文|《Unreal Engine 4 Tutorial: Creating Snow Trails in Unreal Engine 4》
作者|Tommy Tran Jun 3 2018  | 翻译 开发游戏的老王 阅读时长|25分钟 内容难度|入门级

本教程将介绍如何使用 scene capture渲染目标(render target) 雪地足迹效果




所谓 scene capture ,简单讲就是一种可以向渲染目标输出的摄像机。
最近如果你在玩AAA游戏,你可能会在有雪景的游戏中发现一种趋势,典型的例子比如:《地平线:黎明时分》、《古墓丽影:崛起》以及《战神》。在这些游戏中,最引人注目的一件事就是:可以在雪地上产生足迹了!
允许玩家和环境发生交互是提升沉浸感(immersion)的极好方法。它会让环境看起来更加真实而且真的太有趣了。如果能让玩家在地上蹦跶蹦跶画画雪天使就乐在其中,还非花好几个小时设计各种机制干嘛呢?
本教程将会介绍:
    使用scene capture对近地面物体进行遮罩,从而实现足迹在场景材质中使用遮罩实现可形变的雪通过只显示角色附近的足迹进行优化
注意:本教程假定读者已经掌握了Unreal Engine的基本用法。




注意:本教程渲染目标系列教程四部曲之一:

    第一部分:使用渲染目标绘制

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

译者注: 本教程提供了范例工程,如果需要可以到原文网站免费注册并下载
下载工程并解压后,找到SnowDeformationStarter文件夹,并打开SnowDeformation.uproject。本教程中,我们将会在这个第三人称角色和几个箱子的场景中实现雪地足迹。




在开始之前,必须声明一下本教程中的方法仅能够存储一个限定区域的足迹而不是整个世界的。因为区域大小依赖于渲染目标的分辨率(render target’s resolution)。
例如,如果我们想为一个很大的区域存储足迹,那就必须增加分辨率。这样做的同时,scene capture的性能影响以及渲染目标的内存占用量也会加大。因此,我们得通过限制有效区域和分辨率来进行优化。
接下来,咱们看一下如何实现雪地足迹。
实现雪地足迹

首先,我们要为足迹创建渲染目标。这里的渲染目标是一个灰度遮罩,其中白色代表着足迹,褐色代表非足迹。我们将渲染目标投影到地面,然后用它来混合纹理以及置换顶点。




接着,我们得找到一种方法只遮罩那些可影响雪的物体。我们可以先把对象渲染到自定义深度(Custom Depth)缓冲区,再使用一个带有后期处理材质的scene capture对所有渲染到自定义深度的对象进行遮罩,然后再把遮罩输出给渲染目标。
scene capture的关键是它放置的位置。下图是一个由自顶向下视角记录场景并输出给渲染目标的例子(下文简称顶视角)。这里,第三人称角色和箱子都被遮罩了。




第一感觉,这种顶视角的效果还不错吧,形状都很准确貌似没什么问题。
其实不然,顶视角的问题在于它无法记录宽点下面的内容,如图所示:




假想一下,黄色的线箭头会一直延申到地面。对于立方体和锥体箭头会一直保持在物体内部。然而,对于球体箭头会在趋近于地面的时候离开球体。而从摄像机的角度看,箭头依然在球体内部。以下就是摄像机眼中的球体:




尽管近地面的部分很小,这会使得球体的遮罩大于它的应有大小。并且使我们很难判断出物体是否接触地面。
译者注:下文简称这个问题为“大肚子问题”。




解决上述问题的方法就是从底部开始拍摄。
从底部拍摄

所谓从底部记录就是像下图这样:




如我们所见,摄像机从底部也就是接触地面的角度拍摄。这样就解决了顶视角的“大肚子问题”。
要判断物体是否接触地面,我们可以使用后期处理材质进行深度检测。这个检测会告诉我们物体是否高于地面深度且低于指定的偏移量。如果这两个条件均为true,我们就可以为这一像素遮罩。




以下是一个高于地面20个单位的拍摄区域的例子。注意遮罩仅仅在物体通过某个点时才产生,并且物体越接近地面遮罩也变得越宽。




下面,我们创建一个后期处理材质进行一下深度检测。
创建深度检测材质

要进行深度检测,我们需要两个深度缓冲区。一个针对地面;另一个针对影响雪的物体。因为scene capture仅能看到地面,场景深度(Scene Depth)缓冲区 将会输出地面的深度。要获取物体的深度,我们只需要将它们渲染到 自定义深度(Custom Depth)缓冲区
注意:为了节省时间,原作者已经将角色和盒子渲染到了自定义缓冲区。如果你还要添加影响雪的物体,请确保开启它们的Render CustomDepth Pass
首先,我们需要计算每个像素到地面的距离。打开Materials\PP_DepthCheck并创建如下连接:


接下来,我们需要创建拍摄区域(capture zone),请按下图高亮所示连接:




现在,如果某像素距地面25个单位以内,那么它将被遮罩。遮罩的强度(masking intensity)依赖于像素和地面的距离。点击应用并回到主编辑器。
接下来,我们将创建scene capture
创建Scene Capture

首先,我们需要一个用于场景记录写入的渲染目标。在RenderTargets文件夹中创建新的Render Target 并命名为 RT_Capture
现在我们创建scene capture。本教程中,我们要在蓝图中创建场景记录以便后续对它进行编程。打开Blueprints\BP_Capture 添加Scene Capture Component 2D组件并命名为SceneCapture




首先,设置scene capture的朝向使它向上对着地面。在细节面板上将Rotation设为(0,90,90).




应为遮罩是2D的,所以我们要去除所有透视干扰,因此将Projection\Projection Type设为 Orthographic




Scene Capture\Texture Target 设为 RT_Capture,从而告诉scene capture写入到那个渲染目标。




最后,我们需要使用深度检测材质。将PP_DepthCheck添加到 Rendering Features\Post Process Materials中。为了使后期处理正常工作,我们还要把Scene Capture\Capture Source改为Final Color (LDR) in RGB


现在scene capture就设置完毕了,我们需要指定拍摄区域的大小。

本帖子中包含更多资源

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

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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