您当前的位置: 首页 >  ar

开发游戏的老王

暂无认证

  • 2浏览

    0关注

    803博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(中)

开发游戏的老王 发布时间:2021-04-03 18:03:44 ,浏览量:2

本文是《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)。

在这里插入图片描述

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

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

存储捕获区域大小

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

在这里插入图片描述

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

  • Collection 设为 MPC_Capture
  • Parameter Name 设为 CaptureSize

在这里插入图片描述

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

使地形形变(Deforming the Landscape)

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

  • 将Two Sided设为enabled。这是因为scene capture是自底向上看地面,只能看到它的背面。默认情况下,引擎并不渲染背面,这样也就无法把地面深度存储到深度缓冲区。因此我们要让引擎对地面进行双面渲染。

  • 将D3D11 Tessellation 设为 Flat Tessellation(使用PN Triangles也可以)。 Tessellation 会把网格的三角面分解成更小的三角面。从而有效提高网格分辨率,是我们在顶点置换时获得更多的细节。否则,顶点密度过小很难生成生动的足迹。

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

在这里插入图片描述 当我们开启了tessellation,World Displacement通道和Tessellation Multiplier通道也会被启用。

在这里插入图片描述

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

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

投影渲染目标

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

在这里插入图片描述 解释一下:

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

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

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

在这里插入图片描述

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

关注
打赏
1656935939
查看更多评论
立即登录/注册

微信扫码登录

0.0522s