本系列学习资料来源,Ben Cloward的油管空间,B站的搬运翻译
之后几节是一个新的系列,有关perlin噪点或者说程序化噪点
的使用
举例来说,以此图案作为基本,进行几次缩放比例组合到一起,可以创建一个分形图案,这些组合比例中的每一个称为octave
下图只是一些例子,Peilin噪声也被广泛应用于地形的生成过程,它是程序化生成的基础
像是《我的世界》,《无人深空》等等很多游戏,也会使用类似Perlin噪声的其他噪声,去产生整个世界。
Perlin噪声也被广泛接受于特效,3d软件的渲染器中。
正是为此这个噪声的发明者Ken Perlin在1997年获得了奥斯卡奖,以表彰他对电影行业的贡献
下图就是生成基本的Perlin噪声的核心代码公式,此代码也出现在《GPU Gems》这本书中
这是专门为了在现代显卡上能快速运行而编写的,也就是说这是优化的版本
接下里不再看这个代码
因为在学习过程中,我们希望简洁性,能一看到它进行阅读就能了解它在做什么,直接看代码显然不太容易理解
放这个代码图只是对算法的复杂性有个基本的印象
当上面这些代码被shader编译的时候,大约会变成61个像素着色器的指令和8个纹理样本,这是核心的基本Perlin噪声图
用的时候,通常循环3~8次来获得所需要的图案作为mask(8次的话,就有488个指令和64个纹理样本)
这么多消耗显然不行,我们需要找到一个更高效的方法
一种解决办法是在三维空间创建出体积纹理,把61条指令和8个纹理样本变成一个纹理样本
这确实会让消耗变少,但是体积较大,并且有一些缺点
要是这种体积纹理工作,我们要让它在三个维度上平铺,有点难办,并且平铺纹理的话,就不是无限不重复了
但是我们可以挑选彼此不对齐的纹理来隐藏平铺的效果
回到虚幻中,其自带了这个噪声节点
如果选择3d纹理那一项,我们就是对Peilin噪声的体积纹理进行采样,而不是做代码中的各种数学运算
什么也不做,只是把这个节点连到BaseColor中,得到一个很多细节的噪声图
我们选择世界位置作为noise的种子,所以加入位置信息,并且调整大小
我们来看看noise节点的设置
原视频地址,内有本节要用的贴图链接
在本节会介绍程序噪声的第一个小例子,一个白雪皑皑的树干
回顾上节,我们所用的3d的噪声,似乎并未给出什么是3d的含义,其实看下面的图和动图就了解了
通常,如果想让森林里的每棵树都有不同,那么我们需要分别创建每个树,为每个树创建独特的纹理
在现实的生产生活环境中,这么制作是不太行的,但不这么做,所有的树会长得一样
为了解决这个问题,可以使用程序化噪声生成独特外观的树
我们会用一个噪声去融合树皮和雪的纹理
这样设置的噪声用来确定哪里下雪,哪里不下雪
其实很简单,给出两个图用噪声去当mask插值就行
如果要雪都在底部,可以树干乘以Z世界空间的位置;如果要融化某一个面,可以雪乘以Y等等
这样做的好处是什么呢?看以下动图
这是一个雪的场景,我们也引用了我们的shader,当树移动时,我们可以明显看到积雪的变化
因为我们之前是用位置作为噪声的信息,这意味着每棵树在场景中都有不同的雪型,比起为每棵树绘制不同的纹理,我们使用的是程序化的方法决定雪的样子
原视频地址,内有本节要用的贴图链接
这一节我们学习使用程序噪声去创造地质岩层
为什么会这么做呢?Ben Cloward阐述了理由
这是一些岩层的图片,岩石在层与层之间融合,这也是我们要模仿的特征
下面这张地理渐变的贴图是在PS中创建的,其是一个很小的纹理,有着不同的颜色
我们会用它来模仿岩层
我们直接插入RGB看到效果
我们现在是用UV去采样图的,但是我们想要岩石无论怎么旋转都保持着岩层横向渐变的性质,所以需要把它投影到世界空间
投影到世界空间,然后加上些许噪声
以位置作为噪声的信息
我们来看看真实应用这个东西的例子会是怎么样
我们有了一个岩石的资产,在旋转组成岩石的过程中,渐变纹理仍保持一致,使其看着像是一个整体
在这一节,我们会使用程序噪声和世界坐标对齐的纹理投影两种方法,去创建一些可以混合在一起的材质
BenCloward提及了一下制作动机
我们需要把材质投影到 前,上,侧 三平面上
纹理依然可以tilling吗?答案是肯定的
我们要做的也是创建两组tilling不同的纹理,再做世界坐标对齐,使用程序噪声去混合他们
我们简单体会一下世界坐标对齐,比如选了XY,那么只有在XY的方向上是对齐的,Z方向就拉伸了(和我们之前做雨水时,只要雨水流动从上往下流的效果很像)
简单连一连(思想就是利用3d空间的噪声作为mask)