如何将两轴1-D噪声组合成可信的2-D噪声?

时间:2014-10-28 06:34:07

标签: c 2d noise-generator

首先,我很想在这里提问(虽然我已经潜伏了很长一段时间)所以如果我没有正确格式化或说出来,请原谅我。
其次,我寻找任何图书馆的链接(个人而言,我不喜欢他们,因为我无法访问源...而且,在我看来< / em>,他们感觉像是一个等待发生的潜在安全漏洞),我只是在简单的旧C代码之后执行所需的任务(最好不使用对象/结构)。


我试图产生二维噪音,我似乎遇到了障碍。

我编写了自己的伪随机数生成器,您可以在其中为其提供种子/输入值,并且它始终为相同的种子/输入提供相同的输出(从0.0 - > 1.0)。换句话说,它可以愉快地产生确定性的一维噪声 使用这种方法,我可以创建单独的x / y噪声轴(我会发布示例图像来演示我的意思,但我需要10个代表点来发布图像...但是足以说它们看起来像黑色/灰色/白色条形码水平/垂直定向)
然而,我与两个轴组合的努力导致了一个类似黑色和黑色的图像。白色“格子呢”模式(再次,如果可以,我会发布演示图像)。我正在采用“蓬松的云”风格模式,就像perlin噪音一样。

我的目标是拥有一个功能,当提供种子/ x / y值时,它会提供所需的2-D输出。

预先计算一组值(这是我在谷歌的几个地方找到的方法)是不可能的。噪声用于程序世界生成,2-D输入坐标可以从-1,088,391,168到+1,088,391,168(对于x和y轴都是(4 *(10 ^ 18))字节)...所以输出必须直接取决于给定和即时计算的输入值。


我的问题是:给定两个单独的1-D噪声轴(x轴/ y轴),如何将两个轴组合成一个2-D噪声值?或者换句话说,如何将水平和垂直条形码组合在一起以创建二维噪声场?


编辑:

const double noise_x1 = Noise(seed, x);
const double noise_x2 = Noise(seed, x + 1);

const double noise_y1 = Noise(seed + 1, y);
const double noise_y2 = Noise(seed + 1, y + 1);

这将获取x / y轴的噪声值以及下一个x / y点的噪声值。如何在数学上将这4个值组合起来用作“网格单元”的“角”?我只是将它们平均化了吗? EG:

const double noise_x1y1 = (noise_x1 + noise_y1) * 0.5;
const double noise_x2y1 = (noise_x2 + noise_y1) * 0.5;
const double noise_x1y2 = (noise_x1 + noise_y2) * 0.5;
const double noise_x2y2 = (noise_x2 + noise_y2) * 0.5;

那么公式/算法用于内插给定“单元格”内的确切点是什么? 我见过其他人使用“基于网格的逻辑”来测试噪音,但似乎让我困惑:P


更新(2014年10月30日下午7点35分,澳大利亚东部标准时间/澳大利亚东部标准时间):

进一步研究这个问题后,我遇到了Morton代码(实际上与噪声函数没有关系,尽管它们可以用来将输入坐标“哈希”成一个数字)。莫顿码交织两个输入数字的位,如下所示:
第一个输入数字......

00000001 -> 00000000 00000001 = 1  
00000010 -> 00000000 00000100 = 4  
00000100 -> 00000000 00010000 = 16  
00001000 -> 00000000 01000000 = 64  
00010000 -> 00000001 00000000 = 256  
00100000 -> 00000100 00000000 = 1024  
01000000 -> 00010000 00000000 = 4096  
10000000 -> 01000000 00000000 = 16384  

第二个输入数字......

00000001 -> 00000000 00000010 = 2  
00000010 -> 00000000 00001000 = 8  
00000100 -> 00000000 00100000 = 32  
00001000 -> 00000000 10000000 = 128  
00010000 -> 00000010 00000000 = 512  
00100000 -> 00001000 00000000 = 2048  
01000000 -> 00100000 00000000 = 8192  
10000000 -> 10000000 00000000 = 32768  

然后将这两个输出数字组合成一个数字。这个过程可以很容易地扩展到两个32位输入(形成一个64位输出)。

然后可以将输出数字输入到1维噪声函数中,为任何32位输入提供确定性输出。

2 个答案:

答案 0 :(得分:0)

只需使用:https://gist.github.com/KdotJPG/b1270127455a94ac5d19

2D,3D和4D噪音,其定向伪影明显少于Perlin噪音,特别是与您尝试做的相比。

答案 1 :(得分:0)

获得真实的确定性xD噪声的最简单方法是使用一些散列函数将坐标组合在一起:

  1. 将坐标转换为所需粒度的整数。

  2. 将整数散列在一起。您的要求介于用于哈希表的简单函数和加密哈希产生的过度杀伤之间。你实现妥协的地方完全取决于你,所以我不能过多地建议使用哪种散列函数。

  3. 将生成的哈希转换为0到1之间的浮点数。