algorithm - 具有 FP16 限制的 GLSL-ES 随机颗粒噪声

标签 algorithm random shader 16-bit glsles

我正在尝试编写一个具有严格 FP16 限制的紧凑而简单的噪声函数。 这是我到目前为止得出的结果,但我认为在操作的某个地方,数字对于 fractsin 来说太小了,因为在 GPU 中我必须为这些都在 FP16 限制范围内。关于我做错了什么的任何想法?顺便说一下,我不能使用时间变量,也不能采样噪声纹理。我需要正确实现的功能必须紧凑、小巧且自给自足,并产生简单的颗粒状噪声效果。 注意:下一个算法在任何桌面 GPU 卡上都能正常工作,但在“MALI 400 MP”GPU 上完全失败,因为这个算法对浮点值有 FP16 限制。

vec3 noise(vec3 color)
{
    float variation = length(color);
    float dot_product = dot(variation, -0.577350269);
    float sin_result = sin(dot_product) * 1.19245;
    float random = fract(sin_result);
    return color + vec3(random);
}

如果有人可以为 GLSL-ES 推荐任何其他随机函数,但严格遵守 FP16 限制,那也很好。我知道其他随机实现,例如单纯形噪声,但这些对于我需要做的事情来说太大太慢了。因此,PerlinSimplex 噪声算法不是一种选择。

最佳答案

这些是我使用的,但我不知道它们是否适用于 FP16 限制:

// source: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/
highp float rand(vec2 co)
{
      highp float a = 12.9898;
      highp float b = 78.233;
      highp float c = 43758.5453;
      highp float dt= dot(co.xy ,vec2(a,b));
      highp float sn= mod(dt,3.14);
      return fract(sin(sn) * c);
}

 float rand2(vec2 co)
{
      return fract(sin(dot(co.xy,vec2(12.9898,78.233))) * 43758.5453);
}

这两个都不是我创建的。原作者链接在上面。我实际上使用 rand2 并且没有那个博客上提到的问题。要制作灰度噪声,请执行以下操作:

float randColor = rand(v_position);
gl_FragColor = vec4(randColor);

要制作全色噪点,需要 3 倍的时间,而您会这样做:

gl_FragColor = vec4(rand(v_position), rand(v_position), rand(v_position), 1.0);

要为您正在绘制的任何内容添加噪音,您可以:

float randColor = rand(v_position) * .1;  // to add 10% noise
gl_FragColor = vec4(gl_FragColor.r + randColor, gl_FragColor.g + randColor, gl_FragColor.b + randColor, 1.0);

顺便说一句,这很慢。在 iPhone5 上,这工作正常,没有明显的减速。但在 4S 上,它以 fps 下降到 30。如果我删除添加噪音,它会提高到 60。所以要小心。

关于algorithm - 具有 FP16 限制的 GLSL-ES 随机颗粒噪声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540603/

相关文章:

algorithm - 我的启发式算法是否正确? (数独求解器)

将字符串拆分为标记并计算元音的 C 程序

java - 手机无法编译shader

algorithm - 使用 GLSL 组成图 block 的纹理坐标

python - 使用动态规划查找 A 和 B 的最短交错字符串

arrays - 从数组中获取平均均衡

C 编程 - 来自 rand() 的奇怪输出

sql - 有没有更好的方法从 Oracle 表中检索随机行?

javascript - 如何在 JavaScript 中生成 30 倍数的随机整数

opengl-es - GLSL:gl_FragCoord 问题