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

Showcases

What the upscaler buys you, made visible — bigger scenes built to be looked at rather than to test one feature.

Examples

Single-purpose demos — one feature or integration each.

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.RenderPipeline 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
12
Temporal guides
The upscaler as a data-products provider: the split dispatchGuides() / dispatchUpscale() frame, with the published dilated motion, disocclusion, and depth guides sampled live as TSL texture nodes.
integration
13
Guides node
The guides bundle as TSL: temporalGuides() publishes the products into the post graph, a toy effect tints disoccluded pixels pre-upscale, and upscale({ guides }) shares one computation across both — the split frame, declaratively.
integration
14
Path tracer · alpha
A transparent canvas over page content: three-gpu-pathtracer's WebGPU renderer accumulates at half resolution with a zero-alpha background, and the FSR1 spatial path upscales coverage along with color.
integration
15
Transparent canvas
Alpha on the temporal path: coverage reconstructed from jitter rather than interpolated. Thin sub-texel wires over page content, with a temporal/spatial toggle to see the difference.
integration
16
Spatial node
upscaleSpatial(color) for inputs with no depth or motion: an in-graph pass() or an external texture, with RCAS sharpness and denoise controls and HDR highlights sharpened in conditioned space.
integration

Other engines

@pmndrs/upscaler/core on a bare GPUDevice — the contract every engine adapter is written against — and the adapters built on it.

W1
Raw WebGPU
No three.js: a hand-written WebGPU scene renders color, depth and motion, applies the core's jitter to its own projection, and encodes the upscale into its own command encoder — scene, upscale and present in one submit.
integration
B1
Babylon.js
The experimental Babylon adapter in a frame graph: geometry renderer → upscale task → image processing, jittered through Babylon's own TAA material plugin so the velocity buffer stays jitter-free.
experimental
P1
pixi.js
The experimental pixi adapter: a pixi stage rendered anti-aliased at half resolution, upscaled by FSR1 between pixi renders, presented on a Sprite.
experimental
P2
pixi-3d
The same adapter under a pixi-3d scene: a View3D rendered at half resolution and upscaled by FSR1. Runs locally with the pixi-3d closed-beta package; without it the page shows how to add it.
closed beta