35 lines
1.0 KiB
GLSL
35 lines
1.0 KiB
GLSL
// PCG Random Number Generator
|
|
|
|
#ifndef RNG_GLSL
|
|
#define RNG_GLSL
|
|
|
|
uint pcg_hash(uint seed) {
|
|
uint state = seed * 747796405u + 2891336453u;
|
|
uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
|
|
return (word >> 22u) ^ word;
|
|
}
|
|
|
|
// Improved seed initialization with spatial-temporal decorrelation
|
|
uint init_seed(ivec2 pixel_coords, ivec2 image_size, uint frame_count) {
|
|
uint pixel_index = uint(pixel_coords.x) + uint(pixel_coords.y) * uint(image_size.x);
|
|
|
|
// Spatial hash to decorrelate neighboring pixels
|
|
uint spatial = pcg_hash(pixel_index);
|
|
|
|
// Temporal hash with pixel-dependent multiplier to avoid frame correlation
|
|
uint temporal = frame_count * (spatial | 1u); // OR with 1 to ensure non-zero multiplier
|
|
|
|
return pcg_hash(spatial + temporal);
|
|
}
|
|
|
|
float random_float(inout uint seed) {
|
|
seed = pcg_hash(seed);
|
|
return float(seed) / 4294967296.0;
|
|
}
|
|
|
|
vec3 random_vec3(inout uint seed) {
|
|
return vec3(random_float(seed), random_float(seed), random_float(seed));
|
|
}
|
|
|
|
#endif // RNG_GLSL
|