#pragma once #include namespace fn::gfx { // Devuelve un preamble GLSL que define primitivas RNG PCG32 para inyectar // en un compute shader. El preamble incluye: // // layout(std430, binding = ) buffer RngSeeds { uint rng_seeds[]; }; // // uint pcg32(inout uint state) // step + scramble // float rng_uniform(inout uint state) // [0, 1) // float rng_normal(inout uint state) // N(0, 1) Box-Muller // uint rng_below(inout uint state, uint n) // [0, n) // // Patron de uso en el shader: // void main() { // uint i = gl_GlobalInvocationID.x; // uint s = rng_seeds[i]; // float x = rng_normal(s); // ... // rng_seeds[i] = s; // persistir para siguientes dispatches // } // // Pasar el resultado a gpu_compute_program::compile_compute(..., preamble). std::string glsl_rng_preamble(int seed_binding); // Genera count seeds no-cero deterministas a partir de master_seed usando // SplitMix64. Util para inicializar el SSBO rng_seeds antes del primer // dispatch. Garantiza out[i] != 0 (PCG32 requiere state != 0 para no // quedarse atascado). void seed_walkers_init(unsigned long long master_seed, unsigned int* out, int count); } // namespace fn::gfx