【转载】充分利用 UE4 中的噪声

453 阅读9分钟

原文链接

前言

UE4 推出基于材质的程序式噪声已经有一段时间了,但是大多数用户因其高昂的性能成本而不得不限制对其的使用。因此,许多用户采用的方法是在其他程序中编写平铺噪声纹理,然后将其放进 UE4 中使用。很多人都希望能在 UE4 中执行这个步骤,但是找不到足够方便的方法来实现。

我们已经在虚幻引擎 4.13 中满足了这些需求。这些改进可以分为几个类别:

  • 平铺噪声选项
  • 新增加的沃罗诺伊噪声
  • 性能优化和其他改进

我首先要感谢渲染工程师兼客座教授 Marc Olano,他与我合作解决了平铺和沃罗诺伊选项。他还完成了所有性能改进和代码整理工作。许多原有的选项经过了优化,而且现在工具提示会描述成本。请注意,尽管这些优化有很大帮助,但大部分的程序式噪声形式仍然有很高的渲染成本,因此我们将谈一谈可以让我们首先烘焙静态纹理的平铺噪声选项。在最后一节我们将说说不同噪声功能的相对开销。

平铺噪声

在 4.13 中,如果把一个 “噪声(Noise)” 节点放进材质中,您将会注意到底部有两个新的选项,名为 平铺(Tiling)重复大小(Repeat Size)

如果选中 平铺(Tiling) ,噪声将按指定的 重复大小(Repeat Size) (即域)重复。如果您想烘焙掉一些平铺噪声,设置起来很简单。您需要确保重复大小与您将要烘焙掉的取样大小相符。最简单的方法就是对 位置(Position) 输入使用默认的 0-1 纹理坐标,然后将 比例(Scale)重复大小(Repeat Size) 设置为与上面的示例图相同的值。

我们之所以对位置使用默认 0-1 UV,是因为这样一来我们就可以使用渲染工程师 Daniel Wright 提供的 将材质绘制到渲染目标(Draw Material to Render Target) 这个新功能。顺便说一下,在本文中我们介绍的内容相对于这个功能所能实现的效果仅仅是皮毛而已。您一旦完成下面的步骤,就可以将它复用于任意数量的相关操作,因此请耐心看下去。

首先我们需要在内容浏览器中生成一个新的 Actor 蓝图。单击 新增(Add New) ,然后单击 蓝图类(Blueprint Class) 。当新的对话框弹出时,单击 Actor,然后给该资产命名。

接下来,我们需要在内容浏览器中生成一个渲染目标。单击 “新增(Add New)” ,然后单击 “材质和纹理(Materials and Textures)” ,再单击 “渲染目标(Render Target)”。接着双击这个新的渲染目标,将 分辨率 设置为您需要准备的大小。我们就快完成了!

现在打开新添加的蓝图,导航至 “事件图(Event Graph)” 。添加一个 定制事件,将它命名为 “Bake” 。指定要烘焙的材质和您创建的渲染目标。

然后导航至 “构造脚本(Construction Script)”,调用定制事件 Bake

编译蓝图后,系统将把您的材质写入渲染目标。现在您要做的就是右键单击渲染目标,然后选择 “创建静态纹理(Create Static Texture)” 和将要创建的纹理。

沃罗诺伊噪声

沃罗诺伊噪声非常适合用于翻腾的烟云腐蚀图案自然界中的许多其他图案。它有时也被称作 沃利噪声蜂窝噪声 ,指的都是一回事。下面是您可以直接用虚幻引擎实现的一些基本可能:

从左到右:

  • 一个倍频程,幂 = 2
  • 一个倍频程,反转 (1-x)
  • 三个倍频程,反转

下面就是在 UE4 中纯粹用沃罗诺伊噪声生成的龟裂沙地

下面是生成步骤的详解

从左到右:

  • 1 倍频程的原始沃罗诺伊噪声,已反转
  • 通过使用添加到输入位置的少量 “梯度” 噪声而应用了扭曲的沃罗诺伊噪声
  • 使用使边缘细节均衡化的 “高通滤波” 材质取样的沃罗诺伊噪声。
  • 使用 “根据高度贴图建立法线贴图” 功能生成法线贴图。

最后的沙地图像是通过使用上文第 3 步中的纹理作为 视差遮蔽贴图材质 中的 高度贴图 而生成的。

“高通滤波” 是使用新的材质功能 “高通滤波纹理(High Pass Texture)” 执行的。边缘变化是通过添加另一个 梯度噪声 来实现的,该噪声的作用是使偏移宽度变化。此版本的高通滤波功能需要一个纹理,所以在此时保存了该纹理以便使用:

还有一种版本的 “高通滤波功能” 使用的是其他功能而非纹理,适用于喜欢这种方法的人。

要烘焙法线,只需要将上面第 3 步的结果烘焙到 渲染目标,然后使用 “根据高度贴图建立法线贴图” 功能,再将此材质渲染到 渲染目标

请注意,只要进行少量的更改,例如降低 高通滤波偏移量 和增加 高通滤波强度,就可以得到这样的腐蚀图案纹理变体:

下面是一个样式化的翻腾烟柱

L3Byb3h5L2h0dHBzL3M1LjUxY3RvLmNvbS9pbWFnZXMvYmxvZy8yMDIxMDgvMDYvZTk2Nzc1NzYyNDJkMTg0NjA2MDc0ZjdiNzg2M2E2YmEuZ2lm.gif

这效果是通过对两个作为 平移纹理 的简单沃罗诺伊纹理进行取样得到的。系统将两个纹理 相乘 ,然后 取平方根 ,以保持翻腾形状的完整性。然后将它应用到 铺嵌 的圆柱体网格上。请注意,要先将 最终高度 乘以 全局空间法线 ,然后才能连接到 全局位置偏移

这里有一个基于沃罗诺伊的大理石纹理示例:

下面是使用沃罗诺伊噪声作为基础生成大理石类纹理的方法

从左到右:

  • 标准沃罗诺伊噪声,1 倍频程
  • 在输入位置添加了 “梯度” 噪声的沃罗诺伊噪声,设置为 0.05
  • 将梯度噪声乘以 0.3 后添加到沃罗诺伊输入位置
  • 使用第 3 步的结果作为来自 引擎/内容 的随机纹理的纹理坐标:

Texture2D /Engine/Engine_MI_Shaders/T_Base_Tile_Specular.T_Base_Tile_Specular

这里使用的是名为梯度贴图的技术。使用的颜色的确切范围是通过 先做加法和乘法再将结果插入纹理 来控制的。您可以描绘定制纹理来寻找所需颜色,也可尝试使用任何具有您想要提取的颜色的图像。

这个示例仅仅在输入位置添加了标量扭曲。您可能已经在上面的图像中注意到,这种做法产生了 对角线条纹图案 。对于大理石纹理来说,这是完美无缺,但是如果要得到其他效果,您可能需要对 X 和 Y 扭曲使用不同的噪声模式,或者使用法线贴图进行偏移。

关于沃罗诺伊噪声成本的说明

沃罗诺伊噪声成本很高,有四种不同的质量级别可选。它们的区别就在于 搜索的单元数量 。一般来说,质量级别数字越小,网格失真越少。请注意,当您放置噪声节点时,它默认设置为 6 倍频程,但是您只会看到 1 个倍频程的指令计数:

  • 1 级质量搜索 8 个单元,每个倍频程约 160 条指令
  • 2 级质量搜索 16 个单元,每个倍频程约 320 条指令
  • 3 级质量搜索 27 个单元,每个倍频程约 540 条指令
  • 4 级质量搜索 32 个单元,每个倍频程约 640 条指令

作为对比,一个典型的材质大约有 100 条指令。一个使用 4 级质量沃罗诺伊噪声的 6 个倍频程的材质将有大约 3800 条指令,渲染成本要高出约 30 倍。1 级质量沃罗诺伊噪声的 1 个倍频程只需要 160 条指令,对于基本材质来说比较合理。

从左到右:

  • 1 级质量
  • 2 级质量
  • 3 级质量
  • 4 级质量

请注意2 级质量要比其他几级暗一点,这是因为使用了两个偏移 2x2x2 的网格,其点阵较为密集。只要乘以 2 就可以解决这个问题。

性能特性

为了演示使用噪声节点的真实成本,我使用一个全屏幕四边形,测量了每种功能使用 1-6 个倍频程的性能成本。我还增加了与矩形纹理取样的比较。对于矩形纹理取样,倍频程只是相加在一起的附加取样。

不出所料,大部分噪声 选项的渲染速度明显慢于 简单的 纹理查找“快速梯度 - 3D 纹理” 显然是最快的纹理功能,因为它已经烘焙到体积纹理上,而其他 “基于纹理” 的选项都使用 2D 噪声纹理 来执行随机性运算,这就需要更多数学运算来以 3D 方式 取样。因此如果您需要使用程序式噪声,也需要使场景的渲染保持快速,那么 “快速梯度” 就是目前的 最佳选择,但是请记住,如果将它用在很大的面积上,或者平铺值增加过多,就会显示重复的图案。

高质量的沃罗诺伊噪声功能是成本最高的,因此如果需要在性能受到限制的环境中使用它们,请务必将它们烘焙到纹理中。

我希望这些信息对您有用,能让您在自己的项目中有效地利用噪声。