【问题标题】:Random number in OpenGL GLSL fragment shaderOpenGL GLSL片段着色器中的随机数
【发布时间】:2017-08-14 13:24:05
【问题描述】:

我一直在研究很多关于在片段着色器中生成随机数的问题。但是,它们都没有形状:

float rand() {
    ...
    return random_number;
}

它们都需要输入参数。有没有什么方法可以在不输入的情况下得到一个随机数?

【问题讨论】:

  • 你能举个例子吗?正如你所说,我在我的 c++ 代码中创建了一个随机数,可以用作time。 @Rabbid76
  • 这个相关问题可能有用:stackoverflow.com/questions/5149544/…

标签: c++ opengl glsl fragment-shader


【解决方案1】:

计算机是执行算法的确定性设备。随机性不能凭空显现。虽然许多 CPU 确实具有某种形式的随机生成结构,但即使您没有看到它也需要某种输入。

这就是为什么随机数算法在技术上称为"pseudo-random number" generators (PRNG)。他们接受输入并根据该输入生成输出。 PRNG 的诀窍在于它们生成的输出(理论上)无法从输入中预测。除了基于硬件的随机生成器之外,所有计算机 RNG 都以这种方式工作。

即使是 C/C++ 的 rand 函数也可以,尽管它将输入隐藏在 srand 设置的种子状态后面。 rand 使用可由srand 初始化的内部状态,该状态用作 PRNG 函数的输入。 rand 的每次执行都会改变这种状态,大概是以一种不容易预测的方式。

理论上,您可以在着色器中尝试rand 技巧,方法是使用Image Load/Store 功能来存储内部状态。但是,这仍然可以作为输入。该函数可能不接受输入,但 shader 肯定会;您必须提供纹理或缓冲区以用作内部状态。

此外,由于图像加载/存储读取和写入的incoherent nature,它也不起作用。多个调用将读取和写入相同的状态。这不可能发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多