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

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

[复制链接]
发表于 2023-4-10 07:29 | 显示全部楼层 |阅读模式
本文是《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_CaptureEvent BeginPlay节点后添加如下高亮节点。请确保:
    Collection 设为 MPC_CaptureParameter 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即内嵌,在三角面中分割嵌套小的三角面。

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


Tessellation Multipler 通道控制内嵌三角面的数量。本例中不对该通道连接,这意味着使用其默认值1
World Displacement通道获取输入的向量值,根据向量的方向和大小移动顶点。要计算这个引脚的值,我们先得把渲染目标投影到地面。
投影渲染目标

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

解释一下:
    首先获取当前顶点的XY位置。因为是自底向上捕获的,X坐标是翻转的,所以我们把它反过来(如果是自顶向下捕获的就不用这样做了)。这部分实际上要做两件事。首先使渲染目标居中即中心在世界坐标的 (0, 0),后面将把它转换到UV坐标系。
按照下图连接,并确保Texture Sample’s texture设为 RT_Capture

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


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

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-22 11:41 , Processed in 0.094171 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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