如何在金属着色器中获取随机数?

Hex*_*ons 6 random metal

我将如何在金属着色器中获取随机数?

我在金属着色语言规范中搜索“随机”,但什么也没找到。

Qua*_*ees 8

因此,我正在为另一个项目开发随机数生成器,并希望将其打包到一个简洁的框架中一段时间​​。

你的问题促使我这么做。如果您不介意无耻的插件,这里有一个非常简单的框架,它将根据您提供的(最多)三个种子在金属着色器中为您生成一个随机数。该代码基于以下研究论文,该论文描述了如何在并行处理器上创建随机数以进行蒙特卡洛模拟。它的(理论)周期也为 ,2^121因此它应该适合在 GPU 上完成的最合理的计算。

您只需在着色器中调用一个初始化程序,然后调用rand(),如下所示:

// Initialize a random number generator, seeds 2 and 3 are optional
Loki rng = Loki(seed1, seed2, seed3);

// get a random float [0,1)
float random_float = rng.rand();
Run Code Online (Sandbox Code Playgroud)

我还在存储库中包含了一个示例项目,以便您可以了解它是如何使用的。


Bil*_*ard 6

看起来没有内置函数。MetalShaderShowcase /AAPLWoodShader.metal的示例代码定义了自己的简单rand函数。

// Generate a random float in the range [0.0f, 1.0f] using x, y, and z (based on the xor128 algorithm)
float rand(int x, int y, int z)
{
    int seed = x + y * 57 + z * 241;
    seed= (seed<< 13) ^ seed;
    return (( 1.0 - ( (seed * (seed * seed * 15731 + 789221) + 1376312589) & 2147483647) / 1073741824.0f) + 1.0f) / 2.0f;
}
Run Code Online (Sandbox Code Playgroud)