我正在尝试编写一个具有严格FP16限制的紧凑而简单的噪声函数。到目前为止,这是我得出的结论,但我认为在操作的某个地方,对于fract或sin来说,数字太小了,因为在 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,那也很好。我知道其他随机实现,例如单纯形噪声,但这些对于我需要做的事情来说太大而且太慢了。所以Perlin和Simplex噪声算法不是一个选择。