0

许多 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 演示将不胜感激。
4

1 回答 1

3

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

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

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

“官方”回购:https ://gist.github.com/KdotJPG/b1270127455a94ac5d19 (Java)

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

3D Perlin vs 3D OpenSimplex,在 2D 切片中:( 在此处输入图像描述 左边是原始噪声(x,y,0),接下来是负片/正片的黑白,接下来是接近零的黑色,接下来是噪声(x,y,0.5))

2D OpenSimplex:( 在此处输入图像描述 为了比较,请注意 2D Perlin Noise 在 z=0 时看起来几乎与 3D 相同)

于 2014-10-20T07:41:13.913 回答