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

文章目录

  • 使用渲染目标
  • 足迹的持久化
  • 创建持久化缓存
  • 回写到scene capture
  • 移动Scene Capture
  • 非连续地移动Scene Capture
  • 移动持久化缓存

使用渲染目标

让我们从颜色混合开始。把上文中的1-x节点和Lerp节点如下图所示连接:

注:你可能好奇为什么我使用一个1-x节点,其实就是翻转一下渲染目标,让计算稍稍简单点。

有足迹的地方地面将会是褐色的,反之是白色的。

接下来,按如下图高亮所示实现顶点置换:

这样,有雪的地方会被提高25个单位;没雪的地方不会被置换,从而实现了足迹效果。

注:我们可以通过DisplacementHeight节点来增减雪的高度。并且DisplacementHeight的值应该是和捕获偏移量(capture offset)相同。把它们设为相同可以使形变更加精确。但有时我们想单独设置它们,因此本文把它设为了独立的参数。

点击Apply并回到主编辑器。在关卡中创建一个BP_Capture的实例并将其位置设为 (0, 0, -2000) 让它置于地下。点击Play,并使用W, A, S,D键移动角色,就可以使雪地形变了。

产生形变了,但是并没有足迹!这是因为每次捕获都会覆盖之前渲染目标之前的内容。我们现在需要实现足迹的持久化。

足迹的持久化

为了使足迹持久化,我们需要另外一个渲染目标作为持久化缓存(persistent buffer),在足迹被覆盖之前把它存储到持久化缓存中。然后再把持久化缓存返回给scene capture。这样我们就得到了两个渲染目标互相写来写去的循环结构,它就是我们实现持久化的方法。

下面,我们先来创建持久化缓存。

创建持久化缓存

RenderTargets文件夹创建一个新的Render Target并命名为RT_Persistent。本教程中,我们无须更改纹理设置。在你自己的项目中,请确保两个渲染目标的分辨率相同。

接下来,我们需要一个材质将之前scene capture内容拷贝到持久化缓存中。打开Materials\M_DrawToPersistent并添加Texture Sample节点。将其纹理设为RT_Capture并如下图连接:

然后点击Apply并打开BP_Capture。首先创建一个动态材质实例(稍后我们再为它传值)。将如下高亮节点添加到Event BeginPlay

Clear Render Target 2D节点的作用是确保每个渲染目标在使用前被清空。

接下来,打开DrawToPersistent函数并添加如下高亮节点:

接下来,将DrawToPersistent函数添加到Event Tick,其目的是确保每一帧都要向持久化缓存中绘制,因为scene capture发生在每一帧。

最后,将持久化缓存添回到渲染目标。

回写到scene capture

点击Compile并打开PP_DepthCheck。然后添加高亮节点,并确保Texture Sample设为 RT_Persistent

现在渲染目标之间可以互相读写了,我们也获得了持久的足迹。点击Apply并关闭材质。点击Play,开始在雪上踩脚印吧!

效果看起来棒棒哒,但此时的效果仅适用于地图上的一个区域,如果角色走出这个区域就没有足迹了。

一种解决办法就是,让scene capture随着角色移动。这就意味着足迹永远回出现在角色所在的区域。

注:随着scene capture的移动,任何其范围之外的区域都会被忽略掉。这就意味着,当我们回到刚才有足迹的地方,它们也会消失。不要着急,在下一个教程中我们会学习如何实现半持久化(semi-persistency)。

移动Scene Capture

你可能觉得我们要做的只是把Capture的XY位置设置为角色的XY位置。但如果你这样做的话,渲染目标就会变得模糊。这是因为我们移动渲染目标的步长小于1个像素。这样一个像素的新位置就会定位在像素之间。于是多个像素对一个像素进行插值,其结果如下:

解决办法是,我们需要非连续地移动移动Scene Capture。我们需要做的就是计算每个像素对应的**实际大小(world size)**然后每次都将Scene Capture移动这个距离。这样每个像素就不会重叠,也就不会有模糊了。

先创建参数存储Scene Capture的位置。地面材质会用这个值计算投影。打开 MPC_Capture添加Vector Parameter并命名为CaptureLocation

接下来,使用新的参数更新地面材质。关闭MPC_Capture 并代开 M_Landscape。如下修改第1部分:

现在,渲染目标就永远被投射到Scene Capture的位置了。点击Apply并关闭材质。

非连续地移动Scene Capture

使用如下公式计算像素的实际大小:

(1 / RenderTargetResolution) * CaptureSize

使用如下公式计算新位置的每一个分量:

(floor(Position / PixelWorldSize) + 0.5) * PixelWorldSize

为了节省时间,笔者为第二个公式创建了一个SnapToPixelWorldSize 宏。打开BP_Capture并打开MoveCapture函数。然后创建如下连接:


上面的代码会计算新的位置并将新旧位置的差存储到MoveOffset中。如果你使用的分辨率不是256×256,请确保你修改了高亮标记的值。

接下来,如下图连接节点:

上述代码会使用计算出的偏移量移动Scene Capture,然后把新的位置存储到MPC_Capture以供地面材质使用。

最后,我们需要每一帧都执行位置更新。关闭函数并在Event TickDrawToPersistent节点的前面添加MoveCapture

移动完Scene Capture,本方案只完成了一半,我们还必须移动持久化缓存。否则就会出现下面奇怪的结果:

移动持久化缓存

要移动持久化缓存,我们需要传入之前计算好的偏移量。打开M_DrawToPersistent并添加如下高亮节点:


上述代码会使用提供的偏移量移动持久化缓存。就像地面材质一样,我们需要翻转X坐标并实施遮罩。点击Apply并关闭材质。

接下来,我们需要传入偏移量。打开BP_Capture并打开DrawToPersistent。然后,添加如下高亮节点:


上述代码会将MoveOffset转换成UV坐标并传入draw material

点击Compile并关闭蓝图。点击Play,无论你跑多远,雪地上的足迹将永远伴随着你!

Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(下)相关推荐

  1. Unreal Engine 4 渲染目标(Render Target)教程 之 使用渲染目标绘制(下)

    本文是<Unreal Engine 4 渲染目标(Render Target)教程之 使用渲染目标绘制>的下半部分,上半部分请见<Unreal Engine 4 渲染目标(Rende ...

  2. Unreal Engine 4 渲染目标(Render Target)教程 之 可交互的草地(上)

    原文|<Unreal Engine 4 Tutorial: Creating Interactive Grass in Unreal Engine 4> 作者|Tommy Tran Aug ...

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

    原文|<Unreal Engine 4 Tutorial: Creating Snow Trails in Unreal Engine 4> 作者|Tommy Tran Jun 3 201 ...

  4. Unreal Engine 4 渲染目标(Render Target)教程之 使用渲染目标绘制(上)

    原文|<Unreal Engine 4 Tutorial: Painting With Render Targets> 作者|Tommy Tran Jun 18 2018 | 翻译 开发游 ...

  5. 【学习笔记】Unreal Engine 4 虚幻引擎蓝图中级教程物理碰撞教程

    教程链接:Unreal Engine 4 虚幻引擎蓝图中级教程物理碰撞 想共享的小伙伴可以E-mail我:lxbcolorgalaxy@qq.com 目录 第一章 常见的物理现象及分析 1蓝图模板中的 ...

  6. ArcGIS Maps SDK for Unreal Engine通过UI方式显示地图教程

    前言 一个 UE 项目,可以包括多个关卡(level),关卡可以在菜单栏中新建(文件->新建关卡). 使用快捷键 Ctrl+S 可以保存当前关卡,你可以保存到上面提到的演示文件放置的位置,你可以 ...

  7. Unreal Engine 4(UE4)下载教程

    首先登陆到UE官方网站https://www.unrealengine.com  下载EpicGamesLauncherInstaller-2.1.3-2533468.msi文件 按照提示进行安装 如 ...

  8. 什么是渲染目标(render target) 渲染到纹理(Render To Texture, RTT)详解

    渲染到纹理(Render To Texture, RTT)详解 RTT是现在很多特效里面都会用到的一项很基本的技术,实现起来很简单,也很重要.但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿, ...

  9. 【什么是渲染目标(render target)】

    渲染目标是一个缓冲,显卡通过这个缓冲使用一个Effect类绘制场景的像素. 默认的渲染目标叫做后备缓冲- 物理上就是包含下一帧要绘制的信息的一块显存.你可以使用RenderTarget2D类创建另一个 ...

最新文章

  1. 南外计算机课,南外小升初,怎么考?
  2. 集合2--毕向东java基础教程视频学习笔记
  3. 去掉开始菜单中新装程序的红色标记【Windows】
  4. oracle中print,oracle中print_table存储过程实例介绍
  5. java添加音乐_Java加入背景音乐
  6. iconfont阿里巴巴矢量图标库使用步骤
  7. Ubuntu18.04 安装 Matlab2020a
  8. 再读红宝书(第四版)第二章 html 中的 javascript
  9. PE下安装win XP 64位实战
  10. 物联网产品的平台架构
  11. 嵌套在iframe页面打印去掉页眉页尾
  12. Mysql 刷题笔记 0104 求出NAME中每组累加/每组总数的比例大于0.6的ID和NAME
  13. 基于李雅普诺夫函数的跟踪控制(三)
  14. SpringBoot整合MongoDB实现ResultFul风格接口
  15. 攻防世界-Crypto-Railfence
  16. 数字抽奖小程序_发挥想象力,用 PowerBI 做抽奖小程序
  17. split() 和 split(‘ ‘) 的区别
  18. c++调用python接口打包_在QT C++中调用 Python并将软件打包发布(裸机可运行)
  19. NYOJ-备用2350 彩排(位运算)
  20. 云计算的概况和发展:Ubiquitous Supercomputing Power

热门文章

  1. 原子操作、锁、同步实现原理
  2. 小米9开发版自带root吗_小米手机MIUI9开发版开启ROOT权限方法,这些经验不可多得...
  3. 影响Google Adsense广告单价高低的因素分析获取更高的收入
  4. python 判断是否为中文
  5. mysql查询的结果拼接字符串_MySql查询结果拼接成字符串
  6. 漫威系列-《复联4》
  7. Python全栈开发教程笔记
  8. BUUCTF刷题笔记
  9. 接入微信自定义版交易组件3.0,小程序对接视频号操作说明
  10. 浏览器显示海康摄像头实时预览画面纯前端解决方案