OpenGL GLSL 片段着色器中的随机数
Random number in OpenGL GLSL fragment shader
我一直在看很多关于在片段着色器中生成随机数的问题。但是,其中 none 个形状为:
float rand() {
...
return random_number;
}
它们都需要一个输入参数。有什么办法可以不用任何输入就得到一个随机数吗?
计算机是执行算法的确定性设备。随机性不能凭空出现。虽然许多 CPU 确实具有某种形式的随机性生成结构,但即使您看不到它也需要某种输入。
这就是随机数算法在技术上称为 "pseudo-random number" generators (PRNG) 的原因。他们接受输入并根据该输入生成输出。 PRNG 的诀窍在于它们生成的输出(理论上)无法从输入中预测。在基于硬件的随机生成器之外,所有 计算机 RNG 都是这样工作的。
甚至 C/C++ 的 rand
函数也可以,尽管它隐藏了由 srand
设置的种子状态后面的输入。 rand
使用可由 srand
初始化的内部状态,该状态用作 PRNG 函数的输入。 rand
的每次执行都会改变这种状态,大概是以一种不容易预测的方式。
理论上您可以在着色器中尝试 rand
技巧,方法是使用 Image Load/Store 功能来存储内部状态。但是,这仍然有资格作为输入。该函数可能不会接受输入,但 shader 肯定会;您必须提供纹理或缓冲区以用作内部状态。
另外,由于图像 load/store 读写的 incoherent nature,它不会工作。多次调用将读取和写入相同的状态。这不可能发生。
我一直在看很多关于在片段着色器中生成随机数的问题。但是,其中 none 个形状为:
float rand() {
...
return random_number;
}
它们都需要一个输入参数。有什么办法可以不用任何输入就得到一个随机数吗?
计算机是执行算法的确定性设备。随机性不能凭空出现。虽然许多 CPU 确实具有某种形式的随机性生成结构,但即使您看不到它也需要某种输入。
这就是随机数算法在技术上称为 "pseudo-random number" generators (PRNG) 的原因。他们接受输入并根据该输入生成输出。 PRNG 的诀窍在于它们生成的输出(理论上)无法从输入中预测。在基于硬件的随机生成器之外,所有 计算机 RNG 都是这样工作的。
甚至 C/C++ 的 rand
函数也可以,尽管它隐藏了由 srand
设置的种子状态后面的输入。 rand
使用可由 srand
初始化的内部状态,该状态用作 PRNG 函数的输入。 rand
的每次执行都会改变这种状态,大概是以一种不容易预测的方式。
理论上您可以在着色器中尝试 rand
技巧,方法是使用 Image Load/Store 功能来存储内部状态。但是,这仍然有资格作为输入。该函数可能不会接受输入,但 shader 肯定会;您必须提供纹理或缓冲区以用作内部状态。
另外,由于图像 load/store 读写的 incoherent nature,它不会工作。多次调用将读取和写入相同的状态。这不可能发生。