Perlin噪声:来自细胞指数的随机梯度

时间:2018-10-09 21:52:43

标签: random perlin-noise noise-generator

我正在尝试在具有某些限制的渲染引擎中实现Perlin噪声,并且我不知道如何为给定单元格的每个角生成梯度。

主要限制是我没有随机数生成器,它可以为给定的输入返回相同的结果(意味着没有种子可用)。 另一个限制是,由于呈现引擎不支持数组,因此无法创建任何查找表(如建议的here)。

我知道我必须创建一个函数,该函数应为给定的矢量索引返回四个伪随机梯度。 我的第一次尝试是使用我得到的here这个函数,该函数以我正在使用的伪RSL语言给出:

float randomf (vector vec) {
    float t = sin(vec . vector(12.9898, 78.233, 43.47865)) * 43758.5453123;
    return t - floor(t);
}

我可以为每个梯度调用两次此函数,并进行一些变化以生成梯度向量,然后可以对其进行归一化,但是我觉得有更好的解决方案,需要的计算量更少。

我找到了一个解决方案here,但即使是Inigo Quilez,也肯定有更好的哈希函数。这是glsl函数:

vec2 hash( vec2 x )
{
    const vec2 k = vec2( 0.3183099, 0.3678794 );
    x = x*k + k.yx;
    return -1.0 + 2.0*fract( 16.0 * k*fract( x.x*x.y*(x.x+x.y)) );
}

通常,我想从任何字段中找到一些资源,这些资源可以为我提供一些有关如何创建伪随机哈希函数的准则。 据我了解,这些功能通常是在多次试验后构建的,每个星期参数一次,直到结果令人满意为止。 即使我了解该功能应该做什么,也不知道什么是一个很好的起点。

感谢您的帮助。 请让我知道是否需要澄清。

0 个答案:

没有答案