转自:https://www.unrealengine.com/zh-CN/blog/getting-the-most-out-of-noise-in-ue4

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

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

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

我首先要感谢渲染工程师兼客座教授 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)”和将要创建的纹理。

沃罗诺伊噪声

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

从左到右:
1) 一个倍频程,幂 = 2
2) 一个倍频程,反转 (1-x)
3) 三个倍频程,反转

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

下面是生成步骤的详解:

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

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

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

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

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

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

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

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

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

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

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

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) 1 级质量
2) 2 级质量
3) 3 级质量
4) 4 级质量

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

性能特性

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

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

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

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

充分利用 UE4 中的噪声的更多相关文章

  1. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  2. UE4 中在 Actor 中动态 Create Component 与ChildActor 的 小笔记

    Note:旧版本的UE4 的Attach 和12.13版本有些不一样 创建Component: UCpp_MyComponent* temp_imageCom = NewObject<UCpp_ ...

  3. UE4中使用数据表(Data Table)

    本文依据官方文档数据驱动游戏性元素整理而来. 做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决.下面我们来简单说一下UE4中 ...

  4. 3D游戏开发之在UE4中创建非玩家角色(NPC)

    接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...

  5. UE4中的集合:TSet容器

    好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...

  6. UE4中的单映射:TMap容器

    一.TMap<T>是么 TMap<T>是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的.类似 ...

  7. 【转载】 [unreal4入门系列之七] UE4中的Actor类和Pawn类

    原文地址: http://www.52vr.com/article-558-1.html 现在我们开始进入UE4的代码开发工作.首先,UE4的类框架是非常庞大的,看起来有点让人措手不及.不过正因为UE ...

  8. UE4中Bebavior Tree中Delay及其后面代码失效的原因

    具体原因是因为节点的执行过程中,该节点及其父节点的Decorator条件不满足,而节点又受到flow control的影响,导致中途强制结束了Task节点的执行,具体如下. UE4中的Behavior ...

  9. UE4中Timeline的使用

    UE4中经常需要一些和时间相联系的功能,例如在一段时间内完成一个动作,播放一段动画,或者只是单纯的延迟函数的执行时间,即调整事件的执行顺序.在UE4的蓝图自带函数中有一个很好用的函数可以完美地解决这些 ...

随机推荐

  1. MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  2. 去掉UItableview headerview黏性(sticky)

    // 去掉UItableview headerview黏性(sticky) - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFlo ...

  3. 自定义php安装(2)—mysql安装和php整合

    1.      写一段php 代码来测试是否成功! //目前你看不懂,没关系 <?php $conn=mysql_connect("localhost","root ...

  4. js 合并表格

    1.css和js部分 <style type="text/css">table.altrowstable { font-family: verdana,arial,sa ...

  5. oracle 游标使用大全

    转:http://www.cnblogs.com/fjfzhkb/archive/2007/09/12/891031.html oracle的游标和例子! 游标-----内存中的一块区域,存放的是se ...

  6. Apache 常用伪静态配置

    1. /a/b?c=d => index.php?_a=a&_m=b&c=d 2. /xxx/detail-yyy.html => index.php?_a=xxx& ...

  7. step by step 之餐饮管理系统二

    昨天写了餐饮管理系统的相关需求,得到了园友的一些好的建议,感到很高兴,确实写的也不全面,现在补充一下需要的业务,这次主要做的主要是前台收银系统,所以业务主要集中在前台点菜收银这块,而后面数据管理这块则 ...

  8. React与ES6(四)ES6如何处理React mixins

    React与ES6系列: React与ES6(一)开篇介绍 React和ES6(二)ES6的类和ES7的property initializer React与ES6(三)ES6类和方法绑定 React ...

  9. [原] XAF 如何将数据库中Byte array图片显示出来

    问题比较简单,直接上代码. private Image _Cover; [Size(SizeAttribute.Unlimited), ValueConverter(typeof(ImageValue ...

  10. Yaf零基础学习总结3-Hello Yaf

    Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Y ...