Edge-preserving denoise (169 neighbours per pixel), then exposure, white balance, shadows and highlights, contrast, saturation, sharpening and vignette. The whole pipeline is plain Kotlin; Kernelin compiles it to WebGPU. The test chart shows the effect in numbers: PSNR against the noise-free original.
Edge-preserving filters look at every neighbour of every pixel: 169 × 3.8 million = 650 million weighted samples per frame. On a CPU that's seconds per slider move; on the GPU it's interactive.
The test chart (ColorChecker patches, Siemens star, zone plate, gray wedge) is drawn and noised on the GPU, so PSNR against the clean original says exactly how much the denoise recovers.
The same Kotlin functions run in the browser on the GPU, in a JVM batch tool for servers, and in unit tests. No GLSL, no WGSL, no CUDA to keep in sync.
loading…