procedural-3d-engine/shaders/glsl/raytracinggltf/random.glsl

37 lines
1.1 KiB
Text
Raw Normal View History

/* Copyright (c) 2023, Sascha Willems
*
* SPDX-License-Identifier: MIT
*
*/
// Tiny Encryption Algorithm
// By Fahad Zafar, Marc Olano and Aaron Curtis, see https://www.highperformancegraphics.org/previous/www_2010/media/GPUAlgorithms/HPG2010_GPUAlgorithms_Zafar.pdf
uint tea(uint val0, uint val1)
{
uint sum = 0;
uint v0 = val0;
uint v1 = val1;
for (uint n = 0; n < 16; n++)
{
sum += 0x9E3779B9;
v0 += ((v1 << 4) + 0xA341316C) ^ (v1 + sum) ^ ((v1 >> 5) + 0xC8013EA4);
v1 += ((v0 << 4) + 0xAD90777D) ^ (v0 + sum) ^ ((v0 >> 5) + 0x7E95761E);
}
return v0;
}
// Linear congruential generator based on the previous RNG state
// See https://en.wikipedia.org/wiki/Linear_congruential_generator
uint lcg(inout uint previous)
{
const uint multiplier = 1664525u;
const uint increment = 1013904223u;
previous = (multiplier * previous + increment);
return previous & 0x00FFFFFF;
}
// Generate a random float in [0, 1) given the previous RNG state
float rnd(inout uint previous)
{
return (float(lcg(previous)) / float(0x01000000));
}