Random glsl lowp随机数生成(用于图形)的好算法是什么?

Random glsl lowp随机数生成(用于图形)的好算法是什么?,random,glsl,Random,Glsl,我需要一个随机数生成器来创建一些图形静态。我不是在寻找噪声算法——我只是想要白噪声。我所需要的就是glsl中的随机数生成器。具体来说,我将使用它来创建一个随时间推移的每个片段的随机亮度偏移 要求: 生成介于0.0和1.0之间的数字(不关心是否包含/排除) 这不必那么随意。这不会被用于任何安全目的,它只需要是“随机”的肉眼 它只需要使用低值浮动即可计算!(用于移动设备) 只有fragment_x、fragment_y和time_mod_ten_pi作为输入(time_mod_ten_pi就是它听

我需要一个随机数生成器来创建一些图形静态。我不是在寻找噪声算法——我只是想要白噪声。我所需要的就是glsl中的随机数生成器。具体来说,我将使用它来创建一个随时间推移的每个片段的随机亮度偏移

要求:

  • 生成介于0.0和1.0之间的数字(不关心是否包含/排除)
  • 这不必那么随意。这不会被用于任何安全目的,它只需要是“随机”的肉眼
  • 它只需要使用低值浮动即可计算!(用于移动设备)
  • 只有fragment_x、fragment_y和time_mod_ten_pi作为输入(time_mod_ten_pi就是它听起来的样子;游戏开始后的时间(以秒为单位),mod(10*3.1415)以浮点数的形式传入,以允许简单、连续的振荡,而不必担心精度问题。30秒的时间足够长,人类不会注意到重复的噪音)
  • 当显示在fragment_x*fragment_y网格上时,我不想要任何可见的图案(静态或动态)
  • 越简单/越快越好

想在这里重申-只需使用低位浮动即可运行。互联网上的一行代码(fract(sin(dot(…)))不能满足这个条件!(至少,我认为问题出在低浮点数上……也可能是非常脆弱的sin实现……所以如果你也能避免高数字的sin?奖金?

这是我能想到的最好的,但我仍然不是100%满意(如果你足够努力的话,你仍然可以看到一个小的万花筒一样的效果

float rand(float frag_x, float frag_y, float t)
{
  float r = t*7.924;
  return fract(sin(frag_y+frag_x)*r+sin(frag_y-frag_x)*r*.7);
}
(7.924和.7是键盘上的me mashing-仅此而已)

GLSL ES 1.0(OpenGL ES 2.0和WebGL 1.0中使用的GLSL版本)至少需要支持片段着色器和其他着色器中的
mediump
精度数字。出于您的目的,
mediump
数字至少覆盖范围内的所有整数(-1024,1024)(因此除了符号位之外还有10位精度)和
mediump
浮点数覆盖范围[0,1]中1/1024的所有倍数。但是,这些范围非常小。(有关
mediump
数字要求的更多信息,请参阅第4.5节“精度和精度限定符”,符合GLSL ES 1.0规范)

但是,您使用的术语“lowp floats”相当模糊,因此出于这个问题的目的,我假设您使用“lowp floats”是指满足GLSL ES 1.0中
mediump
数字最低要求的浮点数,这些数字必须在GLSL ES 1.0的所有实现中都可用。(请注意,GLSL ES 1.0的
lowp
数字的范围可以低至(-2,2)位,精度可以低至8位,这使得它们更不适合您的用途。)

因此,对于刚才定义的“lowp float”,您应该找到一个伪随机数生成器(或哈希函数),可以计算:

  • 仅使用5位整数。该函数可以对生成器执行两次调用(一次调用前5位,另一次调用后5位),合并结果,然后除以1024.0
  • 仅使用10位整数。因此,该函数可以执行生成器的一次调用,然后将生成的数字除以1024.0
这种方法将在区间[0,1]内生成一个伪随机数,该区间是1/1024的倍数


对于GLSL,一种可行的替代方法可能是从由均匀分布的伪随机数组成的纹理中进行采样。另请参见“”以了解涉及蓝色噪声纹理采样的类似方法。显然,由于“lowp float”的精度低至10位,因此纹理宽度不应超过1024像素或高1024像素