Perlin的OpenGL噪音

时间:2010-11-23 03:05:41

标签: opengl graphics perlin-noise

我通过@ http://dindinx.net/OpenGL/index.php?menu=exemples&submenu=shaders的一些例子研究了Perlin的噪音,并且不禁注意到他make3DNoiseTexture() perlin.c使用noise3(ni)代替PerlinNoise3D(...)

现在为什么? Perlin的噪音不应该是不同噪声频率和振幅的总和吗?

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

提前致谢:)

2 个答案:

答案 0 :(得分:2)

我现在理解为什么,并且我将回答我自己的问题,希望它能帮助其他人。

Perlin的噪音实际上是渐变噪音的综合。在生产过程中,我们必须使用随机生成的梯度向量计算从输入点到输入点本身的一个角指向的矢量的点积。

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

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

中的一个RGBA插槽中

noise3(ni)是方法1的实际实现,而PerlinNoise3D(...)则表示后者。

在我个人看来,方法1要好得多,因为你在着色器中使用每个八度音程的灵活性要大得多。

答案 1 :(得分:1)

我猜测在noise3(ni)中使用make3DNoiseTexture()的原因是PerlinNoise3D(...),如果您在着色器中使用该噪点纹理,则希望能够复制和修改功能{/ 1}}直接在着色器中。

我对PerlinNoise3D(...)背后的推理的猜测是,直接使用音量的x,y,z不能给出好的结果,所以通过用频率缩放噪声而不是可以调整分辨率噪音与音量大小无关。