许多Perlin Noise教程和实现(here,here,here等)使用函数生成伪随机值,如下所示:
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/
功能不起作用,因为它经常返回常量(非伪随机)值。
答案 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切片: (左边是原始噪声(x,y,0),接下来是负数/正数的b / w,接下来是接近零的黑色,接下来是噪声(x,y,0.5))
2D OpenSimplex: (为了比较,请注意2D Perlin Noise在z = 0时看起来几乎与3D相同)