每天一个shader技巧 day2 - 值噪音
噪音是什么及其应用
我的理解就是用一些数学方法去随机生成一些看起来杂乱的数据。废话少说,直接上图(我也不是很会描述)

可以看到,噪音图看起来杂乱无章(吵到眼睛了),那我们为什么要生成这一堆杂乱的像素呢。实际上在图形,游戏领域中,噪音图的应用是非常广泛的,可以用来模拟水的流动,云层的流动,火焰的燃烧等。还可以用于游戏中自然地形的生成(我的世界的地形就是基于噪音算法生成的)。本文将会先介绍最简单的值噪音如何生成及其应用。
噪音生成
上面提到了“用一些数学方法去随机生成噪音”,下面就来看看是什么数学方法。我们先看一维的噪音怎么生成。定义一个随机函数 ,我们要做的便是使不同的x经过计算后所得到的y看起来足够“乱”。下面介绍常用的做法
结合使用fract函数和sin函数
fract函数
若将x作为输入,fract函数取的是x的小树部分,也就是说该函数的返回值是0-1。

sin函数
经典的三角函数了,直接上图

不难想到我们可以将sin函数的值输入到fract函数中

看起来是不是有点乱了,但是还不够乱,我们给sin函数加两个控制变量写成(来控制振幅和偏移),然后再传入fract中。

是不是就很“噪音”了,这就是一维噪音的生成了,下面看看2维的噪音如何生成。
2维噪音
先介绍最简单的2维值噪音,先看下面这张图。

和一维同理,我们要做的就是构造一个函数,z值则为我们想要的随机噪音值。
那不难想到,我们可以在每个交叉点处生成一个随机值,然后中间用插值过度即可(对就是这么简单)
看看随机数生成函数(可以随意选择生成函数)
接下来就可以通过差值生成噪音图了,直接上代码。
然后应用获得的噪音值
结果如下

但是!是不是看起来一块一块的,这样的噪音图是无法用来平滑的模拟水流,火焰燃烧等效果的,那么我们就需要一个分形布朗运动来解决这个问题。
分形布朗运动(Fractal Brownian Motion)
先说本质,本质就是把不同的噪音图按一定权重叠加起来。通常会定义五个值来控制不同噪音图如何相加。分别为:
amplitude:表示每一次噪声叠加的权值,
frequency:则是叠加噪声的比例
octaves:是循环次数,可以看成叠加几张噪声
lacunarity和gain则是用于修改amplitude和frequency 的值,让每次叠加的噪声权值和大小都不同。
直接上FBM的代码。
效果如下

平滑了很多是不是,接下来就能运用了。
模拟水纹
其实很简单,只需要在对纹理进行采样的时候,使用噪音图对采样的uv做一个偏移即可,直接上代码和效果图
