UE4 Material 101学习笔记——19-22 程序化噪声的使用(Noise节点)

Posted 清清!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 Material 101学习笔记——19-22 程序化噪声的使用(Noise节点)相关的知识,希望对你有一定的参考价值。

UE4 Material 101学习笔记——19-22 程序化噪声的使用(Noise节点)

本系列学习资料来源,Ben Cloward的油管空间,B站的搬运翻译

Lec19 程序化噪声 Procedural Noise

之后几节是一个新的系列,有关perlin噪点或者说程序化噪点
的使用

19.1 What is it?

  • Peilin噪声是一种用来生成随机图案的很好的算法,图上就是一个算法生成的结果
  • 这是一个无限的非重复图案,图上展示的只是一小部分。
    可能会觉得这个无限大而永不重复的黑白图看起来很无聊,但是我们可以以它为基本图案进行修改。

举例来说,以此图案作为基本,进行几次缩放比例组合到一起,可以创建一个分形图案,这些组合比例中的每一个称为octave

  • 右边的这个图可能会比较熟悉,像是PS中渲染云的图案,其正是Perlin噪声的应用,我们能通过各种各样的组合来创建不同的噪声纹样

下图只是一些例子,Peilin噪声也被广泛应用于地形的生成过程,它是程序化生成的基础
像是《我的世界》,《无人深空》等等很多游戏,也会使用类似Perlin噪声的其他噪声,去产生整个世界。

Perlin噪声也被广泛接受于特效,3d软件的渲染器中。
正是为此这个噪声的发明者Ken Perlin在1997年获得了奥斯卡奖,以表彰他对电影行业的贡献

19.2 Optimized for Real-Time

下图就是生成基本的Perlin噪声的核心代码公式,此代码也出现在《GPU Gems》这本书中
这是专门为了在现代显卡上能快速运行而编写的,也就是说这是优化的版本
接下里不再看这个代码
因为在学习过程中,我们希望简洁性,能一看到它进行阅读就能了解它在做什么,直接看代码显然不太容易理解
放这个代码图只是对算法的复杂性有个基本的印象

当上面这些代码被shader编译的时候,大约会变成61个像素着色器的指令和8个纹理样本,这是核心的基本Perlin噪声图
用的时候,通常循环3~8次来获得所需要的图案作为mask(8次的话,就有488个指令和64个纹理样本)
这么多消耗显然不行,我们需要找到一个更高效的方法

一种解决办法是在三维空间创建出体积纹理,把61条指令和8个纹理样本变成一个纹理样本
这确实会让消耗变少,但是体积较大,并且有一些缺点
要是这种体积纹理工作,我们要让它在三个维度上平铺,有点难办,并且平铺纹理的话,就不是无限不重复了
但是我们可以挑选彼此不对齐的纹理来隐藏平铺的效果

19.3 Back to Unreal

回到虚幻中,其自带了这个噪声节点
如果选择3d纹理那一项,我们就是对Peilin噪声的体积纹理进行采样,而不是做代码中的各种数学运算

什么也不做,只是把这个节点连到BaseColor中,得到一个很多细节的噪声图

我们选择世界位置作为noise的种子,所以加入位置信息,并且调整大小

我们来看看noise节点的设置

  • 这里有很多可以选择的公式





  • 我们经常会选择3d纹理的形式,这样比较节约

    我们了解了噪声,我们怎么用它呢?这正是我们之后要做的

Lec20 枯木积雪着色器 Snowy Tree Trunk Shader

原视频地址,内有本节要用的贴图链接
在本节会介绍程序噪声的第一个小例子,一个白雪皑皑的树干
回顾上节,我们所用的3d的噪声,似乎并未给出什么是3d的含义,其实看下面的图和动图就了解了

  • 我们使用了位置信息加上三维或者立体的噪声,让噪声存在与世界空间里
    意味着如上图,移动球体时噪声会移动
    这是程序噪声很重要的一个特性,利用这一点,我们这一节要创造一个白雪皑皑的森林

通常,如果想让森林里的每棵树都有不同,那么我们需要分别创建每个树,为每个树创建独特的纹理
在现实的生产生活环境中,这么制作是不太行的,但不这么做,所有的树会长得一样
为了解决这个问题,可以使用程序化噪声生成独特外观的树

我们会用一个噪声去融合树皮和雪的纹理
这样设置的噪声用来确定哪里下雪,哪里不下雪


其实很简单,给出两个图用噪声去当mask插值就行
如果要雪都在底部,可以树干乘以Z世界空间的位置;如果要融化某一个面,可以雪乘以Y等等
这样做的好处是什么呢?看以下动图


这是一个雪的场景,我们也引用了我们的shader,当树移动时,我们可以明显看到积雪的变化
因为我们之前是用位置作为噪声的信息,这意味着每棵树在场景中都有不同的雪型,比起为每棵树绘制不同的纹理,我们使用的是程序化的方法决定雪的样子

Lec21 层积岩着色器 Rock Layer Shader

原视频地址,内有本节要用的贴图链接
这一节我们学习使用程序噪声去创造地质岩层
为什么会这么做呢?Ben Cloward阐述了理由

  • 其工作中,艺术指导发现了几个现象:
    环境艺术家创造了一大堆岩石,我们要做的是把这些岩石塞在一起成为岩层
    但是真正去做的时候,这些岩石就像是一堆混乱的石头,有什么方法能够让他们看起来像是放在一起的结构,方法便是程序化噪声



这是一些岩层的图片,岩石在层与层之间融合,这也是我们要模仿的特征

下面这张地理渐变的贴图是在PS中创建的,其是一个很小的纹理,有着不同的颜色
我们会用它来模仿岩层

我们直接插入RGB看到效果
我们现在是用UV去采样图的,但是我们想要岩石无论怎么旋转都保持着岩层横向渐变的性质,所以需要把它投影到世界空间

投影到世界空间,然后加上些许噪声

以位置作为噪声的信息

我们来看看真实应用这个东西的例子会是怎么样
我们有了一个岩石的资产,在旋转组成岩石的过程中,渐变纹理仍保持一致,使其看着像是一个整体

Lec22 与世界坐标对齐 World-Aligned Shader

在这一节,我们会使用程序噪声和世界坐标对齐的纹理投影两种方法,去创建一些可以混合在一起的材质
BenCloward提及了一下制作动机

  • 艺术家们制作了一些基本模块,希望能够拼在一起创造洞穴,但是看着太模块化了,接缝处过于明显,看起来就像是乐高积木的拼接
  • 能不能用一个材质,在不使用UV的情况下,把这些接缝接上,创建一个可以在世界空间投射的材质

我们需要把材质投影到 前,上,侧 三平面上

纹理依然可以tilling吗?答案是肯定的
我们要做的也是创建两组tilling不同的纹理,再做世界坐标对齐,使用程序噪声去混合他们

我们简单体会一下世界坐标对齐,比如选了XY,那么只有在XY的方向上是对齐的,Z方向就拉伸了(和我们之前做雨水时,只要雨水流动从上往下流的效果很像)

简单连一连(思想就是利用3d空间的噪声作为mask)

以上是关于UE4 Material 101学习笔记——19-22 程序化噪声的使用(Noise节点)的主要内容,如果未能解决你的问题,请参考以下文章

UE4 Material 101学习笔记——23-29 水涟漪/水深/折射反射/Gerstner海浪/波光焦散/泡沫/FlowMap

UE4 Material 101学习笔记——30-37 植物叶片(透光/mask/面片隐藏/法线调整/AO/渐隐/世界空间色彩/随风舞动)

UE4-注册已序列化Shaderl流程

UE4-注册已序列化Shader流程

UE4-注册已序列化Shader流程

ue4 material custom node - global function and method