Introduction

WebGPU denoising for the web: OIDN for path-traced frames on interchangeable runtimes, FidelityFX real-time shadow and reflection denoisers, and three.js TSL nodes.

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 default AutoRuntime picks 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 same GPUDevice.
  • Real-time temporal denoising for raster and hybrid pipelines behind the TemporalDenoiser API, 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's GPUDevice and 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

Warning

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.

BrowserStatus
Chrome / Edgestable
Safari26+
Firefoxstable on Windows; other platforms in progress

Where WebGPU or a required feature is missing, Denoiser.create() rejects with a DenoiserUnsupportedError rather than failing silently.