我正在尝试编写一个严格的FP16限制的紧凑而简单的噪声函数。这是到目前为止我得出的结果,但是我认为该操作的某个地方对于fract或sin来说,这个数字变得太小了,因为在GPU中,我必须为这些写在 FP16限制。关于我在做什么错的任何想法吗?顺便说一句,我不能使用时间变量,也不能采样噪声纹理。我需要正确实现的功能必须紧凑,小巧且自给自足,并产生简单的粒状噪声效果。注意:下一种算法在任何台式机GPU卡上都能正常工作,但是在“ MALI 400 MP” GPU上完全失败,因为该算法对浮点值有FP16限制。
建议任何其他随机函数,但严格限制为FP16,那也很好。我知道其他随机实现,例如单纯噪声,但是对于我需要做的事情来说,它们太大且太慢。因此,Perlin和Simplex噪声算法不是一个选择。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限制的紧凑而简单的噪声函数。这是到目前为止我得出的结果,但是我认为该操作的某个地方对于fract或...
这些是我使用的,但我不知道它们是否都在FP16限制内工作:
散列函数就足够了吗? Pearson hashing过去是为8位寄存器设计的,它非常简单:您对一个256字节的查找表进行硬编码(或者如果没有问题,则可以进行某种简单但非线性的排列)。我们将其称为T。对于输入的每个字节,您都将其与哈希值进行XOR运算,然后查找该值以获取新的哈希值。
使用Gold Noise,均匀的标准化分布。它是专为以低精度(lowp
)运行而设计的。它还接受种子(例如时间)。