我一直在研究关于在片段着色器中生成随机数的很多问题。但是,它们都不是形状:
float rand() {
...
return random_number;
}
所有这些都需要一个输入参数。有没有办法在没有任何输入的情况下获得随机数?
计算机是执行算法的确定性设备。随机性不能凭空表现出来。虽然许多 CPU 确实具有某种形式的随机生成构造,但即使您没有看到它,也需要某种输入。
这就是随机数算法在技术上被称为“伪随机数”生成器 (PRNG) 的原因。他们接受输入并根据该输入生成输出。PRNG 的诀窍在于它们生成的输出(理论上)无法从输入中预测。除了基于硬件的随机生成器之外,所有计算机 RNG 都以这种方式工作。
甚至 C/C++ 的rand
函数也是如此,尽管它隐藏了由srand
. rand
使用可由 初始化的内部状态srand
,并且该状态用作 PRNG 函数的输入。每次执行都会rand
改变这个状态,大概是以一种不容易预测的方式。
理论上,您可以rand
在着色器中尝试该技巧,通过使用图像加载/存储功能来存储内部状态。但是,这仍然可以作为输入。该函数可能不接受输入,但着色器肯定会;您必须提供纹理或缓冲区以用作内部状态。
此外,由于图像加载/存储读取和写入的不连贯性质,它不起作用。多次调用将读取和写入同一状态。那不可能发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句