![8aa547557bd8362ccb9186d8cb6c323a.png](https://i-blog.csdnimg.cn/blog_migrate/cc2fcc61dbbad93ff288721b335d06da.png)
首先这两种噪声都是基于晶格的方法(Lattice based),Simplex噪声是对Perlin噪声的一种改进,基本思想是一样的。
Perlin噪声
Perlin噪声属于梯度噪声,其原理是简单来说就是将坐标系划分成一块一块的晶格,之后在晶格的顶点处生成一个随机的梯度,通过与晶格顶点到晶格内点的向量进行点乘加权计算后得到噪声。
![4694b339e98548c71c3542977106a89c.png](https://i-blog.csdnimg.cn/blog_migrate/da4e717ee4e6775bfd84e25940969af9.png)
具体的三个步骤:
- 定义晶格结构,例如在shader中通过float2 p = i.uv * n可以得到 n x n 的结构,图2展示的是二位的晶格结构,三维的话则是立方体网格。得到晶格后通过floor操作获取晶格id,之后便可得到晶格四个顶点的信息,通过伪随机设定每个顶点的梯度向量(其实就是一个随机的二维向量),梯度向量的值需要最终需要处[-1, 1]之间。
![cacbdf766627a1956676d339b7523f51.png](https://i-blog.csdnimg.cn/blog_migrate/b4aebbd381961b06ca3b3762f7643587.jpeg)
2. 在fs中通过插值后的的uv信息获取当前p点,通过frac操作获取相对于晶格id的偏移值。之后计算其所在晶格的顶点到p点的距离向量。之后分别与晶格顶点的梯度向量点乘
3. 通过插值计算权重。其中插值使用的缓和曲线(ease curves)有两种:最初的Perlin噪声中使用的是:
![5bc0140bbc9334bc614b3680dac948bd.png](https://i-blog.csdnimg.cn/blog_migrate/5d497e1752f079e03680f871e5ae3c34.png)
之后提出了新的缓和曲线:
![cb14158cf51852714a0c6e0023b2623a.png](https://i-blog.csdnimg.cn/blog_migrate/97ffeb613ddb1e6f9c8bbd7038ba6c56.png)
相比于原来的曲线,新的缓和曲线二阶导和一阶导在0与1处都为0,得到的噪声在晶格相互交界处更加平滑。
代码:
float2 perlin_random(float2 p)