所以我对这个问题的古老评论仍然得到了支持:这个 GLSL rand() 单行代码的起源是什么?
这让我开始思考,一个好的 GLSL 哈希函数应该是什么样的?它有明显的用例,例如柏林噪声。我会在良好的实现中寻找一些属性。
实际上,我认为大多数人只是通过将 x,y 输入与一些素数相乘,将它们相加,再次相乘,然后在具有最近采样的随机数平铺纹理中查找结果坐标来混合 x,y 输入。
所以这个问题不是寻找“答案”,而是好奇是否有好的方法可以做到这一点。我还想知道为什么这是不可能的。
“Murmur”风格的哈希函数似乎对于此类应用程序表现非常好,请查看 https://nullprogram.com/blog/2018/07/31/ 和 https://www.shadertoy.com /查看/WttXWX。引用后面的话:
//bias: 0.17353355999581582 ( very probably the best of its kind )
uint lowbias32(uint x)
{
x ^= x >> 16;
x *= 0x7feb352dU;
x ^= x >> 15;
x *= 0x846ca68bU;
x ^= x >> 16;
return x;
}
// bias: 0.020888578919738908 = minimal theoretic limit
uint triple32(uint x)
{
x ^= x >> 17;
x *= 0xed5ad4bbU;
x ^= x >> 11;
x *= 0xac4c1b51U;
x ^= x >> 15;
x *= 0x31848babU;
x ^= x >> 14;
return x;
}
这个问题是 Google 上的最高结果,所以我想引导所有倒霉的路人阅读 Nathan Reed 基于 this paper 撰写的博客文章,该文章得出的结论是,在视觉效果和性能和质量方面的最佳权衡噪音是一个非常简单的哈希,称为 PCG Hash:
uint pcg_hash(uint input)
{
uint state = input * 747796405u + 2891336453u;
uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
return (word >> 22u) ^ word;
}
来源: https://www.reedbeta.com/blog/hash-functions-for-gpu-rendering/