2D Perlin Noise看起来很奇怪

时间:2015-01-22 05:56:51

标签: c noise perlin-noise

我不确定我的Perlin Noise发生器是否正常工作,它产生的噪音与我在网上看到的图像看起来非常不同。我看起来太均匀了(这是三个不同的图像):

enter image description here enter image description here enter image description here

而我通常看到的是:

enter image description here

我的代码基本上是:

/* Get the coord of the top-left gradient of the grid (y, x) falls in */
int j = floor(x);
int i = floor(y);
/* Get the distance (y, x) is from it */
double dx = x-j;
double dy = y-i;
/* Influence of (g)radient(i)(j) (starting at the top-left one) */
double g00 = dot(grad(hashes, hsize, grads, i, j), dy, dx);
double g01 = dot(grad(hashes, hsize, grads, i, j+1), dy, dx-1);
double g10 = dot(grad(hashes, hsize, grads, i+1, j), dy-1, dx);
double g11 = dot(grad(hashes, hsize, grads, i+1, j+1), dy-1, dx-1);
/* Interpolate the influences using the blending function */
/* Linear interpol the top 2 */
double lt = lerp(g00, g01, fade(dx));
/* Linear interpol the bottom 2 */
double lb = lerp(g10, g11, fade(dx));
/* Linear interpol lb lt, completing the bilienear interpol */
return lerp(lt, lb, fade(dy));

Complete code。它主要基于this教程。我正在使用this script来绘制csv文件。

我理解基础知识,但在阅读了几个通常相互矛盾的“教程”和不太可读的“参考实现”后,我有些疑惑。插值的(x, y)点应该在什么区间内?据我了解,它应该是[0, GRID_SIZE-1](例如[0, 255],如果使用具有256个随机值的预先计算的表格)。但是,当(x, y)映射到[0, 1]时,我的代码只能生成相当漂亮的图像,我看到一些在线实现无论网格大小如何都将其映射到[0, 255]。我也不确定我是否正确地从表中选择渐变。

1 个答案:

答案 0 :(得分:4)

您将像素坐标标准化为整个图像。您应该将其标准化为单纯形网格的大小。

所以代替内循环的代码:

  double x = j/(double)w;
  double y = i/(double)h;

做的:

  double x = j / gridsize;
  double y = i / gridsize;

其中网格大小是一个附加参数,例如:

  double gridsize = 32.0;

(应该选择它以均匀地适合图像尺寸。)