webgpu-pt

monte carlo path tracer
Contents

random.wgsl

1.2 kB
 1fn init_random(state: ptr<function, u32>, value: u32) {
 2    * state ^= value;
 3    * state = pcg(*state);
 4}
 5
 6fn pcg(n: u32) -> u32 {
 7    var h = n * 747796405u + 2891336453u;
 8    h = ((h >> ((h >> 28u) + 4u)) ^ h) * 277803737u;
 9    return (h >> 22u) ^ h;
10}
11
12fn uniform_uint(state: ptr<function, u32>, max: u32) -> u32 {
13    * state = pcg(*state);
14    return * state % max;
15}
16
17fn uniform_float(state: ptr<function, u32>) -> f32 {
18    * state = pcg(*state);
19    return f32(*state) / 4294967295.0;
20}
21
22fn animated_blue_noise(coord: vec2<i32>, frame_count: u32, frame_count_cycle: u32) -> vec2f {
23    // spatial 
24    let tex_size = vec2<u32>(textureDimensions(blueNoiseTexture).xy);
25    let wrapped_coord = vec2<i32>((coord.x % i32(tex_size.x) + i32(tex_size.x)) % i32(tex_size.x), (coord.y % i32(tex_size.y) + i32(tex_size.y)) % i32(tex_size.y));
26    let blue_noise = textureLoad(blueNoiseTexture, wrapped_coord).xy;
27    let idx = (f32(wrapped_coord.y) % blue_noise.y) * blue_noise.x + (f32(wrapped_coord.x) % blue_noise.x);
28    // temporal
29    let n = frame_count % frame_count_cycle;
30    let a1 = 0.7548776662466927f;
31    let a2 = 0.5698402909980532f;
32    let r2_seq = fract(vec2(a1 * f32(n), a2 * f32(n)));
33    return fract(blue_noise + r2_seq);
34}