有没有好的GLSL散列函数? [英] Is there a good GLSL hash function?

查看:0
本文介绍了有没有好的GLSL散列函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我对这个问题的古老评论仍然获得好评:What's the origin of this GLSL rand() one-liner?

这让我想到,一个好的GLSL散列函数应该是什么样子的?它有明显的用例,如柏林噪声。在一个好的实现中,我会寻找一些属性。

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

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

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

推荐答案

https://www.shadertoy.com/view/WttXWX样式的散列函数似乎对这种应用程序执行得很好,请查看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;
}

这篇关于有没有好的GLSL散列函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆