具有归一化梯度的二维噪声

问题描述 投票:0回答:1

问题:

我正在寻找一个 2D 噪声,其梯度始终具有范数 1。 这相当于说它的等值线始终处于相同的距离。它可以是任何类型的噪声,但其梯度必须是连续的(如果可能的话,二阶导数也是连续的)。我的目标是将其实现为片段着色器中的函数,但只需具备数学原理就足够了。

为了更直观地解释我想要的内容,这是带有等值线和简单闪电的经典梯度噪声:

classic gradient noise

如您所见,等值线密度是可变的,因为斜率不是恒定的。

在第二张图片中,您可以看到完全相同的噪声,但具有不同的闪电,这是我通过标准化第一张图片的梯度而制作的:

modified gradient noise

这看起来更像是我正在寻找的东西,但是,正如您所看到的,等值线仍然是错误的。我只是作弊以获得我想要的闪电,但我仍然没有噪音本身。

思维方式:

在我的研究过程中,我尝试做一些类似于梯度噪声的事情(梯度由每个网格点处的随机向量定义),我专注于方形网格噪声,但单纯形网格也可以工作。我发现了解决问题的两种主要潜在方法:

先求噪声的梯度:

可以找到一个具有其梯度和固定值的函数,它与我用于第二张图片的照明的归一化梯度不起作用的原因是梯度的旋转在任何地方都必须为0(否则函数不能连续)。 因此,我正在寻找的梯度必须具有 0 的旋转,具有 1 的范数,如果我们将其从一个节点积分到另一个节点,结果必须为零(因为梯度噪声的所有节点的值为 0 ).

1 的范数:

我找到了三种方法来处理这个问题:我们可以通过 (cos(a(x, y)), sin(a(x, y))) 来定义梯度,即梯度与其导数之间的点积是 0 或者简单地说梯度与其自身的点积是 1。

旋转:

梯度的 x 分量关于 y 的导数必须等于梯度的 y 分量关于 x 的导数(使用上面看到的三角技术,变成:cos(a)*da/dx = -sin(a)*da/dy )

从一个节点到下一个节点的积分:

我还没有调查过那部分。

找到噪音本身:

它很容易解决nodes = 0的问题,但主要的问题仍然存在:梯度的范数必须到处都是1。

结论:

当然,这些只是想法,如果你的答案与此完全不同,我无论如何都会接受(并带着灿烂的微笑)。

math glsl fragment-shader derivative perlin-noise
1个回答
0
投票

Voronoise 足以满足您的目的吗? https://en.wikipedia.org/wiki/Worley_noise#/media/File:Worley_Noise_F1_Normal.png(也许不是到处都是最大坡度;有些地方更少。但我更喜欢边缘看起来光滑,就像有反-锯齿完成后,应该很容易进行调整,例如对每个单元进行一些数字之外的操作,或者只是进入雕刻程序,采取圆锥形状,将一堆戳到不同的深度,然后切换到表面的另一侧以进行调整。交替进行向下钻取和向上提升板材)

我计划根据我的想法制作一个变体https://drive.google.com/file/d/1jEMAdwTj8kt0QOzcHxghZsLKQevwXL6Y/view?usp=sharing(忽略有关恒定高度滚轮的部分),因为我实际上需要有限的坡度属性(我认为采用(〜倾斜(倾斜听起来像是我从水平开始)平面会很有趣。想要比纯垂直更雄心勃勃)3D 地形的 2D 切片,看看是否这种“倾斜”使得即使我从所有山峰处于同一海拔的基本版本中获取横截面,文物也不会那么明显)。 https://www.reddit.com/user/Educational-Force776/comments/1apg3r4/randomly_ generated_cliffside_path/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button的设计不仅是等距视图,甚至是不同角度的视图,没有悬垂。这就像能够将正弦波旋转小于 45 度并创建与它的(旋转 90 度)反函数不太一样的东西,该函数只能保留一个,因为函数没有两个输出可以共享相同的输入

© www.soinside.com 2019 - 2024. All rights reserved.