本文是《Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹》的第二部分,第一部分请见《Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(上)》 作者|Tommy Tran Jun 3 2018 | 翻译 开发游戏的老王

文章目录

  • 设置捕获区域(capture area)大小
  • 存储捕获区域大小
  • 使地形形变(Deforming the Landscape)
  • 投影渲染目标


设置捕获区域(capture area)大小

因为渲染目标的分辨率要尽可能低,所以我们必须确保充分利用它的空间。也就是说要确定一个像素对应多大的实际面积。比如,如果捕获区域和渲染目标的分辨率相同,那么我们称其比例为1:1,即每个像素对应1×1大小的实际面积(单位是世界单位)。

对于雪地上的足迹,并不需要1:1 的比例因为我们不需要那么多的细节。笔者建议使用更大的比例,这样我们就能把低分辨率的渲染目标用到更大的捕获区域上。注意,也不要用太大的比例,那样会损失细节。本例中,我们使用8:1 的比例,即一个像素对应8×8的世界单位。

我们可以通过Scene Capture\Ortho Width调整捕获区域大小。比如,想捕获1024×1024的区域,那么就把Scene Capture\Ortho Width设为1024.因为使用的比例是 8:1,所以将它设为2048(默认的渲染目标分辨率是256×256)。

unreal 转为 H5_UE4

这意味着Scene Capture将捕获 2048×2048大小的区域(大约是20×20米)。

地面的材质也需要访问捕获区域的大小从而准确投影渲染目标。一种简单的方式是将捕获区域的大小存储在材质变量集(Material Parameter Collection),这是因为任何材质都可以访问变量集。

存储捕获区域大小

回到主界面,在Materials文件夹中创建一个材质变量集(命令位置在Materials & Textures下面)。不用着急设置属性值,我们会在蓝图中做这件事。

unreal 转为 H5_UE4_02

回到BP_CaptureEvent BeginPlay节点后添加如下高亮节点。请确保:

  • Collection 设为 MPC_Capture
  • Parameter Name 设为 CaptureSize

unreal 转为 H5_unreal 转为 H5_03

这样,材质就可以从CaptureSize中读取Ortho Width的值了。scene capture就完成了。点击编译并回到主编辑器。下一步就是要把渲染目标投影到地面并根据它使地形形变。

使地形形变(Deforming the Landscape)

打开M_Landscape并在细节面板中做如下设置:

  • Two Sided设为enabled。这是因为scene capture是自底向上看地面,只能看到它的背面。默认情况下,引擎并不渲染背面,这样也就无法把地面深度存储到深度缓冲区。因此我们要让引擎对地面进行双面渲染。
  • D3D11 Tessellation 设为 Flat Tessellation(使用PN Triangles也可以)。 Tessellation 会把网格的三角面分解成更小的三角面。从而有效提高网格分辨率,是我们在顶点置换时获得更多的细节。否则,顶点密度过小很难生成生动的足迹。

译者注:Tessellation即内嵌,在三角面中分割嵌套小的三角面。

unreal 转为 H5_游戏开发_04


当我们开启了tessellationWorld Displacement通道和Tessellation Multiplier通道也会被启用。

unreal 转为 H5_unreal 转为 H5_05

Tessellation Multipler 通道控制内嵌三角面的数量。本例中不对该通道连接,这意味着使用其默认值1

World Displacement通道获取输入的向量值,根据向量的方向和大小移动顶点。要计算这个引脚的值,我们先得把渲染目标投影到地面。

投影渲染目标

完成如下连接来计算UV坐标,从而进行投影:

unreal 转为 H5_UE4_06


解释一下:

  1. 首先获取当前顶点的XY位置。因为是自底向上捕获的,X坐标是翻转的,所以我们把它反过来(如果是自顶向下捕获的就不用这样做了)。
  2. 这部分实际上要做两件事。首先使渲染目标居中即中心在世界坐标的 (0, 0),后面将把它转换到UV坐标系。

按照下图连接,并确保Texture Sample’s texture设为 RT_Capture

unreal 转为 H5_虚幻_07


这样,我们就把渲染目标投影到地面了。然而存在一个问题,由于渲染目标仅应用于捕获区域内部的顶点,而捕获区域外部的顶点会从渲染目标的边缘采样。于是就出现下面的问题:

unreal 转为 H5_自底向上_08

解决办法就是去除所有UV在0-1以外的顶点的遮罩。笔者定义了一个函数MF_MaskUV0-1用于处理这件事。当UV在0-1区间时返回1,否则返回0。将这个函数和结果相乘来确定遮罩。