Start here
The API in a few lines, then what good input looks like.
Hello world
A noisy render, Denoiser.create(), denoise(), canvas. No three.js, no build tricks.
Before / after gallery
Pre-rendered path-traced scenes at 1 to 16 samples per pixel, denoised live: drag the divider, step the noise ladder, toggle albedo + normal.
Aux inputs, explained
What the network sees: albedo and normal conventions, plus three real bugs you can switch on and watch degrade the output.
Path tracing + OIDN
Whole-frame denoising of path-traced renders with the OIDN networks, in three.js, raw WebGPU and Babylon.js.
three.js path tracer
three.js WebGPUPathTracer and the denoiser on one GPUDevice: an interactive scene, path traced progressively and denoised live.
LDraw Eiffel Tower
A LEGO Eiffel Tower: raster preview while you orbit, path trace and denoise when the camera comes to rest.
Raw WebGPU
No framework: a single-file WGSL path tracer and the denoiser sharing one GPUDevice. The copy-paste integration recipe.
Babylon.js
Babylon renders, the denoiser cleans it: over a timed CPU round trip between two devices, or zero-copy on Babylon's own GPUDevice.
Real-time denoising
One ray per pixel, every frame: the FidelityFX shadow and reflection denoisers, and how they compare.
Ray-traced shadows & reflections in a raster app
A three.js raster scene that traces two effects at 1 ray per pixel, denoised every frame by ffxShadows() / ffxReflections(), vs shadow maps and env maps.
Reflections, explained: probe, SSR, ray tracing
A guided tour of how engines find reflections (probes, SSR, ray tracing, the hybrid): split-screen comparisons of where each one breaks, a view of where every pixel's reflection comes from, and what each costs.
Reflections in two rooms: probes, SSR and rays
A probe per room and one in the doorway give every surface the right reflection for almost nothing; SSR and one traced ray per pixel + ffxReflections() add the moving mirror ball, contact and what the probes never saw. Lights that change colour, probes re-baked or frozen.
Reflection probes on r186 (preview of three.js #35046)
Ben Houston's box-projected, blended reflection probes, running on three r186 until his PR lands: two rooms, a doorway probe, same API, swap in his when it ships.
Baked + dynamic shadows: when to split
Bake what never moves (a lightmap, denoised once with OIDN, or a world-space cache), trace only the moving objects every frame with FFX: what the split buys, what it costs, and when to use it.
three.js SSR: FidelityFX vs recurrentDenoise
three's SSR denoise example with the ffxReflections() TSL node swapped in, split-screen against three's own denoiser.
FidelityFX shadows & reflections
AMD's FidelityFX denoisers ported to WGSL: 1-sample ray-traced signals denoised every frame vs a converged reference.
Realtime vs OIDN
Noisy SSR denoised two ways: three's temporal recurrentDenoise every frame vs OIDN single-image denoising on a cadence.
Pipelines & performance
Denoise and upscale on one GPUDevice, and the numbers behind it.
Tools & tests
Internal harnesses, smoke tests and probes. They run locally with yarn examples and are not deployed.
evalEval vs native OIDN source ↗ Every OIDN RT model on every runtime and precision vs native OIDN: quality and speed.wgsl-benchWGSL runtime bench source ↗ The Denoiser facade on ORT, HF kernels and hand-written WGSL: parity and warm timings.webnn-benchWebNN bench source ↗ The OIDN U-Net built as a WebNN graph vs the WGSL runtime: network-only timings and parity.kernels-smokeHF kernels smoke test source ↗ The OIDN U-Net op by op on @huggingface/kernels, checked against onnxruntime-web.webgpu-ort-smokeORT WebGPU smoke test source ↗ A converted OIDN ONNX U-Net on onnxruntime-web (WebGPU EP) with zero-copy GPU-buffer IO.aux-split-verifyAux split-graph check source ↗ Verifies the ORT split-graph workaround for aux models against a WASM reference.denoiser-package-testPackage end-to-end test source ↗ import { Denoiser } from 'denoiser' with the default AutoRuntime, end to end.upscale-pipelineUpscaler wiring check (synthetic noise) source ↗ Raster scene + injected fake noise → denoiser → @pmndrs/upscaler (FSR3 or FSR1) on one device. Checks the texture hand-offs; not path-traced input.