我正在尝试在具有某些限制的渲染引擎中实现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)) );
}
通常,我想从任何字段中找到一些资源,这些资源可以为我提供一些有关如何创建伪随机哈希函数的准则。 据我了解,这些功能通常是在多次试验后构建的,每个星期参数一次,直到结果令人满意为止。 即使我了解该功能应该做什么,也不知道什么是一个很好的起点。
感谢您的帮助。 请让我知道是否需要澄清。