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.
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.
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.