运行时虚拟纹理(RVT)是虚幻引擎4.23版开始提供的一项功能,它可以在运行时使用GPU按需生成和缓存纹理数据。借助此功能,材质可以直接绘制到材质编辑器中的运行时虚拟纹理 (RVT),以及对 RVT 纹理进行采样。

1、过去的解决方案

在虚幻引擎中引入运行时虚拟纹理之前,通常使用Render Target来实现地形混合和景观变形系统。Render Target是可以在运行时绘制的纹理。可以使用蓝图代码将形状和材质绘制到特定纹理。Render Target要求所有材质都是addtive类型,以便它们可以在相同的纹理中相互绘制。将所有内容绘制到纹理后,需要通过在蓝图代码中调用"ClearRenderTarget 2D"节点来手动清除纹理,以便重置并再次启动该过程。此过程有时会导致闪烁问题。

Render  Target有以下缺点:

  • 纹理尺寸有限
  • 要执行大量步骤才能完成绘制
  • 无法将大小和位置从命中点转换为Render Target的大小
  • 设置为不同掩码的通道数量有限(RGB 和 alpha 要求材料设置为AlphaComposite)
  • 不支持的照明
  • "世界位置"节点有时会返回意外值

与Render Target相比,运行时虚拟纹理的优势如下:

  • 支持较大的纹理分辨率(横向着色)
  • 无需蓝图即可将材质的图纸处理到纹理上
  • 适用于程序化图案和复合层状材料
  • 植被实例(用于贴花散射)
  • 可用于创建样条贴花类型效果
  • 将草地、岩石和水与景观融为一体,呈现自然外观

2、用RVT实现雪痕

让我们看看如何使用运行时虚拟纹理为角色创建雪迹。在本演示中,使用了Drawer材质和Receiver材质。

首先,转到"项目设置"。在"引擎>渲染>虚拟纹理"类别下,将"启用虚拟纹理支持"设置为 true。

然后在项目目录中创建名为"RVT"的运行时虚拟纹理资源:

转至Add New > Blueprint Class,在All Classes部分下搜索 RuntimeVirtualTextureVolume,然后选择它以创建名为"RVT_Volume"的新蓝图类。

打开"RVT_Volume"蓝图类,转到VirtualTextureComponent的详细信息选项卡,然后在"Virtual Texture"类别下,将"RVT"资源分配给Virtual Texture

将"RVT_Volume"放在关卡中,然后缩放和旋转它以包含景观。完成此缩放是因为,如果景观超出体积边界,Drawer将停止渲染到 RVT。

现在,创建一个名为"M_Footprint"的封装材质,它将充当运行时虚拟纹理中的Drawer。Drawer将使用RadialGradientExponential 函数将一个圆输出到 RVT 基色输出中。

确保将RadialGradientExponential 函数连接到 RVT 的Opacity输出,以便在多个轨迹可以相互重叠的情况下实现平滑变形。封装的"Radius"和"Density"也可以通过创建两个标量参数并将其连接到RadialGradientExponential函数中的相应输入引脚来调整。

创建一个名为"M_Snow"的景观材质,该材质将充当运行时虚拟纹理中的Receiver。Receiver将采样"RVT"资源,使用其 BaseColor 在"Snow Color"和"Ground Color"之间线性插值,并将其连接到材质的"Base Color"输出。

在景观材质的详细信息选项卡的"Tessellation"类下,将"Tessellation Mode"设置为"PN Triangles",将"Maximum Displacement"设置为任何正值(例如:256),并将"Crack Free Displacement"设置为 true,以便在材质中启用"World Displacement"和"Tessellation Multiplier"输出。

RVT 样本中的 BaseColor 与沿顶点法线的名为"Height"的标量参数一起使用,以便达到可变形雪面的高度。在这里,应为Tessellation Multiplier应用一个正值,以便在游戏中实现世界位移的可见性。

将材料"M_Snow"应用于景观。

现在,让我们来看看如何在角色行走时获得雪的变形。

打开角色蓝图,放置两个"Add Static Mesh Component"节点,并将其Relative Transform连接到角色双脚的套接字位置。这可以通过与事件 Tick 连接来调用每一帧。

将"Add Static Mesh Component"节点的"静态网格体"和"材质"分别设置为"平面"和"M_Footprint"。

此外,将"碰撞预设"设置为"NoCollision"。取消选中"投射阴影",然后将"RVT"资源添加到渲染到虚拟纹理数组。将"虚拟纹理传递类型"设置为"仅虚拟纹理",以便在播放时看不到这些平面。

RVT 现在应显示为已应用接收器材质的景观。

为了避免在角色跳跃时创建轮廓线,在添加轮廓线平面网格之前,可以连接Branch节点以检查角色是否在行走。

检查字符速度是否大于零的条件可以使用AND节点与前一个条件联接,以避免在字符处于空闲状态时连续创建占用空间。

高度也可以通过Drawer材料进行控制。在"M_Footprint"材料中,将具有正值(例如:10)的名为"强度"的标量参数与径向梯度指数相乘,以获得所需的变形深度。请注意,Drawer的强度将限制为Receiver材料中设置的高度。假设Receiver是Drawer可以达到的最大高度乘数。

完成所有这些过程后,当玩家沿着雪面行走时,角色的雪迹将可见。

这个实现角色基本可变形雪迹的演示是使用虚幻引擎4.25制作的。该过程还可用于变形不同类型的表面,如沙子,泥土,水,草等。

请注意,蒙皮基元和动画基元不能用于渲染到 RVT。但是,运行时虚拟纹理允许执行许多以前可能仅限于呈现器目标的可能性。由于运行时虚拟纹理仍在开发中,我们希望虚幻引擎的未来更新中将提供许多功能。


原文链接:Runtime Virtual Texture (RVT) in Unreal Engine 4

BimAnt翻译整理,转载请标明出处