有没有统一的平滑随机函数?

问题描述

我想要的是一个 均匀平滑 随机函数,即有界 beetwen 两个值

平滑随机函数的第一个候选者是柏林噪声,但其分布并不均匀,如图所示


perlin noise distribution




有没有均匀、平滑的钳位随机函数

解决方法

首先,您是否需要具有均匀分布的连续值?还是只需要将区域划分为 N 个等可能的区间?

如果是后者,那就简单了。预先生成一个巨大的噪声数组(例如,大小为 0x10000000)在许多随机坐标处评估,对数组进行排序,然后将数组划分为您需要的任意多个间隔。如果您想利用噪声分布在零附近对称的事实,那么对于每个值,还将其符号翻转值添加到数组中。每个区间开头的排序值是您在边界条件检查中使用的值。

如果您确实需要连续范围的值,那么您可以尝试拟合一个函数来统一噪声输出。我提出了一种修改噪声分布 here 的方法,并尝试了 here。这用于使 4D 噪声具有与 3D 噪声相似的分布,但它也应该用于均匀化。请注意,该公式涉及多项式对整数幂的积分,这取决于您的调整值,但您可以为少数这些情况手动编写评估函数(可能不需要超过 k=3),然后编写lerp 逻辑在这些之上。然后,您可以使用数学或手动+视觉指标来确定最佳调整值。

强制噪声算法选择注意事项:使用质量好的噪声。也就是说,具有良好梯度向量表的单纯形噪声,或域旋转 3D+ Perlin。 FastNoiseLite 支持两者(OpenSimplex2Perlin + SetRotationType3D(ImproveXYPlanes) + GetNoise(x,y,0))。当教程推荐没有警告的 Perlin 噪声时,请持保留态度。 Perlin 是一种较旧的噪声算法,在没有域旋转技术的情况下,会产生大量矩形,这对于大多数应用程序来说是完全不必要的妥协。

编辑:注意图像中的域是 0 到 1。大多数噪声实现,实际上是我链接的库,使用范围 -1 到 1。不过,如果需要,您可以在统一后重新缩放。>