1

我正在通过一些示例研究 Perlin 的噪声 @ http://dindinx.net/OpenGL/index.php?menu=exemples&submenu=shaders并且不禁注意到他的make3DNoiseTexture()inperlin.c使用noise3(ni)而不是PerlinNoise3D(...)

为什么会这样?Perlin 的噪声不应该是不同噪声频率和幅度的总和吗?

Qestion 2ni, inci, incj, inck代表什么?为什么用nix,y 坐标代替?为什么ni随着
ni[0]+=inci;
inci = 1.0 / (Noise3DTexSize / frequency);
我看到 Hugo Elias 使用 x,y 坐标创建他的 Perlin2D 而增加,PerlinNoise3D(...) 也是如此。

提前致谢 :)

4

2 回答 2

3

我现在明白了为什么,并且将回答我自己的问题,希望它可以帮助其他人。

Perlin 的噪声实际上是梯度噪声的合成。在其生成过程中,我们必须计算从输入点的一个角到输入点本身的向量与随机生成的梯度向量的点积。

现在,如果输入点是一个整数,例如您要创建的纹理的 xyz 坐标,则点积将始终返回 0,这会给您带来平坦的噪声。因此,我们将inci, incj, inck其用作替代索引。是的,只是一个索引,没有别的。

现在回到问题 1,有两种方法可以实现 Perlin 的 Noise: 1.
分别计算噪声值并将它们存储在纹理中的 RGBA 槽中
2.预先合成噪声并将它们存储在其中一个 RGBA 槽中在纹理中

noise3(ni) is the actual implementation of method 1, while PerlinNoise3D(...) suggests the latter.

In my personal opinion, method 1 is much better because you have much more flexibility over how you use each octave in your shaders.

于 2010-12-02T11:41:25.963 回答
1

我对使用noise3(ni)inmake3DNoiseTexture()而不是 if的原因的猜测PerlinNoise3D(...)是,当您在着色器中使用该噪声纹理时,您希望能够PerlinNoise3D(...)直接在着色器中复制和修改功能。

我对背后原因的猜测ni, inci, incj, inck是,直接使用音量的 x,y,z 不会给出好的结果,因此通过使用频率缩放噪声,可以独立于音量大小来调整噪声的分辨率.

于 2010-11-23T14:31:25.840 回答