有一个好的GLSL散列函数吗



所以我对这个问题的古老评论仍然得到了支持:What';这是GLSL rand()一行的由来吗?

这让我思考,一个好的GLSL散列函数会是什么样子?它有一些明显的用例,比如Perlin噪声。在一个好的实现中,我会寻找一些属性。

  • 在不同精度(中等、高)下稳定。这可以是可配置的
  • 应该在ES2中可用,因此不能使用整数支持
  • 仅ALU,无纹理
  • 不是为了寻找加密质量,而是为了寻找大周期和"感知"随机性
  • 理想情况下,应该在最低规格的ES2实现上产生相同的结果

实际上,我认为大多数人只是通过将x,y输入与一些素数相乘,相加,再相乘,然后在具有最近采样的随机数的平铺纹理中查找结果坐标。

因此,这个问题不是为了寻找"答案",而是好奇是否有好的方法可以做到这一点。我也想知道为什么这是不可能的。

"Murmur";散列函数的风格似乎在这种应用程序中表现得很好,请查看https://nullprogram.com/blog/2018/07/31/和https://www.shadertoy.com/view/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;
}

最新更新