Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(下)
本文是《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 Tick中DrawToPersistent节点的前面添加MoveCapture。
移动完Scene Capture,本方案只完成了一半,我们还必须移动持久化缓存。否则就会出现下面奇怪的结果:
移动持久化缓存
要移动持久化缓存,我们需要传入之前计算好的偏移量。打开M_DrawToPersistent并添加如下高亮节点:
上述代码会使用提供的偏移量移动持久化缓存。就像地面材质一样,我们需要翻转X坐标并实施遮罩。点击Apply并关闭材质。
接下来,我们需要传入偏移量。打开BP_Capture并打开DrawToPersistent。然后,添加如下高亮节点:
上述代码会将MoveOffset转换成UV坐标并传入draw material。
点击Compile并关闭蓝图。点击Play,无论你跑多远,雪地上的足迹将永远伴随着你!
Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(下)相关推荐
- Unreal Engine 4 渲染目标(Render Target)教程 之 使用渲染目标绘制(下)
本文是<Unreal Engine 4 渲染目标(Render Target)教程之 使用渲染目标绘制>的下半部分,上半部分请见<Unreal Engine 4 渲染目标(Rende ...
- Unreal Engine 4 渲染目标(Render Target)教程 之 可交互的草地(上)
原文|<Unreal Engine 4 Tutorial: Creating Interactive Grass in Unreal Engine 4> 作者|Tommy Tran Aug ...
- Unreal Engine 4 渲染目标(Render Target)教程 之 实现雪地足迹(上)
原文|<Unreal Engine 4 Tutorial: Creating Snow Trails in Unreal Engine 4> 作者|Tommy Tran Jun 3 201 ...
- Unreal Engine 4 渲染目标(Render Target)教程之 使用渲染目标绘制(上)
原文|<Unreal Engine 4 Tutorial: Painting With Render Targets> 作者|Tommy Tran Jun 18 2018 | 翻译 开发游 ...
- 【学习笔记】Unreal Engine 4 虚幻引擎蓝图中级教程物理碰撞教程
教程链接:Unreal Engine 4 虚幻引擎蓝图中级教程物理碰撞 想共享的小伙伴可以E-mail我:lxbcolorgalaxy@qq.com 目录 第一章 常见的物理现象及分析 1蓝图模板中的 ...
- ArcGIS Maps SDK for Unreal Engine通过UI方式显示地图教程
前言 一个 UE 项目,可以包括多个关卡(level),关卡可以在菜单栏中新建(文件->新建关卡). 使用快捷键 Ctrl+S 可以保存当前关卡,你可以保存到上面提到的演示文件放置的位置,你可以 ...
- Unreal Engine 4(UE4)下载教程
首先登陆到UE官方网站https://www.unrealengine.com 下载EpicGamesLauncherInstaller-2.1.3-2533468.msi文件 按照提示进行安装 如 ...
- 什么是渲染目标(render target) 渲染到纹理(Render To Texture, RTT)详解
渲染到纹理(Render To Texture, RTT)详解 RTT是现在很多特效里面都会用到的一项很基本的技术,实现起来很简单,也很重要.但是让人不解的是网上搜索了半天只找到很少的文章说这个事儿, ...
- 【什么是渲染目标(render target)】
渲染目标是一个缓冲,显卡通过这个缓冲使用一个Effect类绘制场景的像素. 默认的渲染目标叫做后备缓冲- 物理上就是包含下一帧要绘制的信息的一块显存.你可以使用RenderTarget2D类创建另一个 ...
最新文章
- 南外计算机课,南外小升初,怎么考?
- 集合2--毕向东java基础教程视频学习笔记
- 去掉开始菜单中新装程序的红色标记【Windows】
- oracle中print,oracle中print_table存储过程实例介绍
- java添加音乐_Java加入背景音乐
- iconfont阿里巴巴矢量图标库使用步骤
- Ubuntu18.04 安装 Matlab2020a
- 再读红宝书(第四版)第二章 html 中的 javascript
- PE下安装win XP 64位实战
- 物联网产品的平台架构
- 嵌套在iframe页面打印去掉页眉页尾
- Mysql 刷题笔记 0104 求出NAME中每组累加/每组总数的比例大于0.6的ID和NAME
- 基于李雅普诺夫函数的跟踪控制(三)
- SpringBoot整合MongoDB实现ResultFul风格接口
- 攻防世界-Crypto-Railfence
- 数字抽奖小程序_发挥想象力,用 PowerBI 做抽奖小程序
- split() 和 split(‘ ‘) 的区别
- c++调用python接口打包_在QT C++中调用 Python并将软件打包发布(裸机可运行)
- NYOJ-备用2350 彩排(位运算)
- 云计算的概况和发展:Ubiquitous Supercomputing Power