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

时间:2015-10-27 04:37:00

标签: random glsl

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

要求:

  • 生成介于0.0和1.0之间的数字(如果包容性/排他性,请不要小心)
  • 这不需要 随机。这不能用于任何安全目的,它只需要随机"随机"肉眼。
  • 只需使用 lowp 浮点数即可计算! (用于移动设备)
  • 只有fragment_x,fragment_y和time_mod_ten_pi作为输入(time_mod_ten_pi正是它听起来的样子;自游戏开始以来的时间(以秒为单位),mod(10 * 3.1415)作为浮点传入以允许轻松,连续在不担心精确度问题的情况下振荡.30秒是人类不会注意到重复噪音的时间。
  • 当显示在fragment_x * fragment_y网格上时,我不想要任何可见的模式(静态或动态)
  • 越简单越快越好!

想在此重申 - 只需要使用lowp浮点数 。互联网上的单行(fract(sin(dot(...))))满足这个条件! (至少,我认为这个问题与lowp浮点数有关......也可能是非常虚弱的罪恶实施......所以如果你能避免高数字罪?奖金?)

2 个答案:

答案 0 :(得分:1)

您对“ lowp floats”一词的使用含糊不清,因为OpenGL / GLSL的不同实现可以支持lowp个数字的不同精度。

出于这个问题的目的,我假设您使用“ lowp浮点数”来表示具有10位精度的16位二进制浮点数(通常称为半浮点数)。因此,这种格式的数字可以精确表示[0,1]中1/1024的任何倍数。

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

  • 仅具有8位整数。该函数可以执行两次生成器调用(一个用于前8位,另一个用于后2位),合并结果,然后除以1024.0。
  • 仅具有10位整数。因此,该函数可以执行一次生成器调用,然后将生成的数字除以1024.0。

此方法将在[0,1)间隔内生成一个随机数,该间隔是1/1024的倍数。


对于GLSL,可行的选择可能是从均匀分布的随机数组成的纹理中采样。另请参阅“ Free blue noise textures”以获取涉及采样蓝噪声纹理的类似方法。显然,由于“ lowp floats”具有10位精度,因此纹理宽度不应超过1024像素或高度不超过1024像素。

答案 1 :(得分:0)

这是我能够想到的最好的,但我仍然不是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是我在键盘上捣碎 - 仅此而已)