【发布时间】:2012-11-12 11:58:03
【问题描述】:
我正在尝试编写一个具有严格 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 噪声算法不是一种选择。
【问题讨论】:
-
通过向颜色添加一个作为颜色函数的值,相同的“噪声”值被添加到具有相同颜色的所有片段。因为对象通常具有颜色渐变,所以您会在对象上出现条带。您可以通过将 dot 函数中的常量更改为更大的值来了解我的意思。
-
这个帖子random number with mali 400 mp有帮助吗?
-
没有多大意义,有了这个接口并且没有能力在函数内部引入随机性,一个由单一颜色组成的色块永远不会产生实际的噪声,因为无论做什么计算,由于输入永远不会改变,因此返回值仍将保持不变。该函数应该有一个额外的参数,一个索引,坐标等等。
-
Anttii,颜色参数是有助于产生噪声的参数,就像单个片段像素颜色一样,因此通过长度(颜色)可以生成随机噪声,因为每个像素都是不同的.除了具有 FP16 的 GPU 之外,该算法在所有 GPU 上都能完美运行
-
恐怕要对真正的噪音进行编码,需要一些静态变量,这些变量在片段中是不允许的。 (uniform 或 in 不可用,因为它们不能为下一个片段更改和/或保留)所以唯一的方法是将失真作为片段位置、颜色或纹理坐标的函数,但这不是噪声:(。
标签: algorithm random shader 16-bit glsles