@pmndrs/upscaler — Examples

FSR1 spatial + FSR2/3-style temporal upscaling for the three.js WebGPURenderer.

WebGPU-only — open in Chrome/Edge 113+ (or a browser with WebGPU enabled). Each demo renders the scene at a lower resolution and upscales it back to full size.

01
Hello FSR3
The minimal temporal upscale — one model, a slow orbit, no UI. The copy-paste starting point.
starter
02
FSR1 vs FSR3
Switch between paths and toggle features one at a time to see what each stage of the upscaler buys you.
showcase
03
Split compare
Native vs FSR side-by-side with a wipe slider — the same scene, the same moment, at two pixel budgets.
A/B
04
Aliasing torture
Dense thin geometry and a moiré floor under a moving camera — where naive upscaling falls apart and temporal holds.
quality
05
Transparency & particles
Particles and transparent geometry have no reliable motion — an honest look at ghosting and why reactive masks matter.
limitations
06
Screen-space effects
Expensive GTAO / SSR / SSGI rendered at low resolution, then upscaled back to full size through FSR3.
advanced
07
FSR3 as a TSL node
The declarative drop-in — post.outputNode = upscaleScene(scene, camera). The whole upscaler as one node in a THREE.PostProcessing graph.
integration
08
Composing FSR3
The upscaler node feeding a downstream TSL effect — upscaleScene(...).mul(vignette) — showing it lives in a post graph.
integration
09
Kitchen sink — SSGI + SSR
A full screen-space stack (SSGI + SSR) rendered at low res and upscaled by the composable upscale(...) node — one TSL post graph, effects and all.
advanced
10
SSGI denoise A/B
Experimental scratchpad comparing SSGI denoisers before FSR3 upscales — documents why a second temporal resolver (recurrentDenoise) fights FSR3's jitter. Not part of the library.
experimental
11
Reactive mask (node)
The reactive mask through the composable upscale() node — transparents and particles authored as an in-graph coverage pass. Toggle it to A/B the ghost trails.
integration