denoiser — realtime compare

A deliberately noisy screen-space effect (stochastic SSR reflections on the floor and metal) denoised two ways, live on one shared WebGPU device. Left uses three.js's temporal recurrentDenoise() screen-space denoiser (runs every frame). Right composites the same raw noisy reflections into the beauty frame and denoises the whole frame with our OIDN network every few frames. Toggle motion to see where each wins.

Camera
every 6 frames
OIDN aux
Quality
LEFT · three.js recurrentDenoise() — temporal, every frame
initializing…
RIGHT · our OIDN full-frame denoise — cadence-based
initializing…

Left — three.js recurrentDenoise()

The three.js addon (SSRNode → temporalReproject → recurrentDenoise, mode:'specular') is a screen-space-effect denoiser: it filters the noisy SSR buffer using the G-buffer (depth / normal / roughness / ray-length) and blends across frames. It is cheap and runs every frame, so it tracks motion — but it needs several frames of history, so it can smear or lag on a cut.

Right — our OIDN full-frame denoise

We composite the same raw noisy SSR into the beauty frame, then run the full OIDN U-Net (denoiseTextures, hdr, optional albedo+normal aux) on the entire image. It is a heavier, per-invocation pass, so we run it on a cadence (every N frames). It has no temporal history: each run is a clean still, but during motion it visibly lags behind the live frame.

Why this is the fair comparison. recurrentDenoise() is designed to denoise screen-space effects (AO/SSGI/SSR), not a path-traced beauty frame — so we pit it against a noisy SSR effect, the job it was built for, and give our denoiser the same raw noise (composited into the frame) to clean.

Different points on the quality/latency curve, complementary rather than competing: temporal realtime denoising for continuous motion, OIDN-class quality for stills and converged/refined frames. (A temporal OIDN mode waits on upstream OIDN 3.x weights.)

About the PSNR. "Measure PSNR" holds the camera still and scores each side against a converged reference (the raw SSR averaged over many frames). That is the temporal denoiser's best case — it accumulates toward exactly that reference, so it wins this number on a static shot. Our single-shot OIDN pass doesn't wait for convergence: its edge is a clean frame on demand and during motion, where the temporal side smears. Toggle motion to see that side of the trade.