流行的Perlin Noise伪随机函数不起作用

时间:2014-10-18 23:23:58

标签: javascript perlin-noise noise-generator

许多Perlin Noise教程和实现(hereherehere等)使用函数生成伪随机值,如下所示:

function Noise(integer x, integer y)
    n = x + y * 57
    n = (n<<13) ^ n;
    return ( 1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    
end function

此功能提供奇怪的输出:http://jsfiddle.net/byoybjkw/
功能不起作用,因为它经常返回常量(非伪随机)值。

  1. 为什么这个功能如此受欢迎,每个人都推荐它?
  2. 其他可能的实施方式是什么? jsfiddle demo将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,重要的是要注意你所看到的并不是Perlin Noise。你在看Hugo Elias&#39;解释一些叫做价值噪音的东西,这个链接可能导致90%以上的混淆。值噪声肯定会产生一些类似的效果,但速度要慢得多(特别是如果你使用立方插值器,这是你想要的大多数效果)。此外,您正在查看的函数只是随机基数,而不是实际的插值噪声函数。

其次,说实话,我会跳过Perlin Noise并看一下名为OpenSimplex Noise的声音。 Perlin Noise是一种较老的算法,通过沿主轴和45度对角线排列所有特征,往往会出现明显的网格伪影。 OpenSimplex Noise基本上与Perlin Noise完全相同:噪声采用输入点(2D,3D或4D)并返回介于-1和1之间的值,输出值随输入坐标变化平滑变化。

OpenSimplex Noise实际上是我自己开发的一种算法,作为游戏开发项目的一部分,用作替代3D +实现的专利的Simplex Noise算法。

&#34;官方&#34; repo:https://gist.github.com/KdotJPG/b1270127455a94ac5d19(Java)

其他人的Javascript端口:https://gist.github.com/KdotJPG/b1270127455a94ac5d19(注意:到目前为止只有2D实现,但您可能不需要更多)

3D Perlin vs 3D OpenSimplex,2D切片: enter image description here  (左边是原始噪声(x,y,0),接下来是负数/正数的b / w,接下来是接近零的黑色,接下来是噪声(x,y,0.5))

2D OpenSimplex: enter image description here (为了比较,请注意2D Perlin Noise在z = 0时看起来几乎与3D相同)