我试图从视觉的角度理解2D Perlin噪声,我想在这里问几个问题,以确保我在正确的轨道上。我使用WebGL并编写用于渲染的自定义着色器。
我首先计算一个网格单元之间的点积,从单元中心的位置向量到一个垂直向量,然后我得到下面的梯度(红色是正值,蓝色是负值)。如果我旋转向量,它也会旋转梯度:

Q1:维基百科上关于“梯度噪声”的内容是“随机梯度的...a点阵,然后对点积进行插值……”。这是不正确的,这里创建实际梯度的是点操作本身,“梯度”向量只是法向量,对吧?
下面是从每个单元的每个角落计算的4个随机向量和4个位置向量之间的4点乘积的3种不同插值,第一种是简单平均,第二种是双线性插值,第三种是带有平滑步的双线性。

Q2:那么,是什么给了柏林噪声它的有机流畅的外观和感觉是插值方法,而不是梯度,特别是双线性插值不是线性的事实,而是二次插值?
谢谢!
发布于 2021-04-05 11:55:36
A1:从技术上讲是正确的。通常我使用术语“梯度矢量”,我认为它更好地传达了我的想法,尽管有时我确实将矢量本身称为“梯度”。也许这比我意识到的更令人困惑,你说得很对。有时我将实际的渐变称为“渐变”,但“渐变”也很好地描述了它。
A2:是的,这是渐变的组合方式。每个栅格顶点都需要以某种方式对其周围的噪波做出贡献,其贡献在范围之外平滑地降为零。淡入淡出曲线lerp实现了这一点。
必须注意:如果你真的要在任何东西中使用噪声,我推荐单纯型噪声(具有良好的梯度向量表,如果将其用于3D+,则为“开放”噪声)或domain-rotated 3D+ Perlin。当教程推荐没有任何警告的Perlin noise时,请持保留态度。Perlin是一种较旧的噪声算法,在没有做任何具体纠正的情况下,会产生大量的正方形,这对于大多数应用程序来说是完全不必要的折衷。我建议在these steps或these domain-rotated Perlin evaluators中使用FastNoiseLite。
如果你想自己实现2D单工,我前段时间在描述过程的地方写了this answer。
https://stackoverflow.com/questions/66939398
复制相似问题