Spektrafilm-style WebGL grain shader

Port of the Poisson-Binomial particle model from agx_emulsion/grain.py to a WebGL2 fragment shader. Drag the divider to compare original vs grain. The grain pass uses a single Poisson draw per channel per sublayer (Poisson-thinning shortcut), Gaussian-approximated for large λ, with a PCG3D hash for per-pixel seeding.

Original
With grain
25 μm
0.20 μm²
0.970
2.0×
0.02
0.65 px · 16 μm