Introduction
Denoiser is a WebGPU denoising library for the web. It has three parts:
- Single-image and progressive denoising of path-traced frames with Intel
Open Image Denoise (OIDN)'s pretrained
networks, matching native OIDN output. The network runs on an interchangeable
runtime: hand-written WGSL, WebNN, Hugging Face kernels, or onnxruntime-web
(
denoiser/ort, opt-in). The defaultAutoRuntimepicks per model: WebNN when the browser exposes it, WGSL otherwise. Every pre/post-processing step (normalization, tiling, overlap blending, color transforms) is WGSL compute on the sameGPUDevice. - Real-time temporal denoising for raster and hybrid pipelines behind the
TemporalDenoiserAPI, starting with AMD's FidelityFX shadow and reflection denoisers ported to WGSL. See Real-time (temporal) denoising. An OIDN 3 temporal model is planned. - three.js
WebGPURenderer/ TSL nodes (denoise(),ffxShadows(),ffxReflections()) that share the renderer'sGPUDeviceand compose with@pmndrs/upscaler(FSR3). See three.js & TSL.
There's no server round-trip and no native binary: the noisy frame goes in, the clean frame comes out, on the GPU that rendered it. Everything is validated on Apple GPUs only so far.
Live gallery demo → — pre-rendered path-traced scenes denoised live in your browser: before/after slider, sample-count ladder, albedo+normal toggle. For an interactive scene, see the live path tracer demo.
When to use it
- Path-traced / ray-traced renders. OIDN's weights are trained on Monte Carlo render noise — this is its home turf, not a general-purpose image filter.
- Real-time shadows and reflections. Per-frame temporal denoising of 1-sample ray-traced signals in a raster or hybrid renderer, with the FidelityFX denoisers.
- Progressive preview. Denoise every few samples while a path tracer accumulates and watch noise disappear well before convergence. See Performance for pacing patterns.
- Final frames. Whole-frame inference handles images up to roughly 1080p in a single model run, with an automatic tile ladder above that — see How it works.
When NOT to use it
Photos and sensor noise are the wrong training domain. OIDN's models never saw camera-sensor grain — feeding one a real photo "does something," but the result isn't designed to look right and shouldn't be judged as if it were.
- Photos / sensor noise — off-label use, see above.
- Per-frame real-time denoising with the OIDN networks. The OIDN models are
single-frame, so running them every frame would flicker. For real-time shadows and
reflections use the temporal FidelityFX denoisers (
denoiser/ffx, see Real-time (temporal) denoising); OIDN doesn't ship temporal weights yet (upstream OIDN 3.x), and a temporal OIDN model is planned. - Non-WebGPU browsers. v2 is a WebGPU-only rewrite with no fallback. If you need
broader coverage, stay on
denoiser@0.0.11(v1, TensorFlow.js-based — its WebGL2 fallback covers non-WebGPU browsers) — see Migrating from v1 for what changed and why.
Browser support
Needs WebGPU. The library requests the adapter's maximum device limits itself on creation — whole-frame U-Net intermediates need more buffer headroom than the default WebGPU device grants — so there's nothing extra to configure.
| Browser | Status |
|---|---|
| Chrome / Edge | stable |
| Safari | 26+ |
| Firefox | stable on Windows; other platforms in progress |
Where WebGPU or a required feature is missing, Denoiser.create() rejects with a
DenoiserUnsupportedError rather than failing silently.