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.
What the upscaler buys you, made visible — bigger scenes built to be looked at rather than to test one feature.
Single-purpose demos — one feature or integration each.
post.outputNode = upscaleScene(scene, camera).
The whole upscaler as one node in a THREE.RenderPipeline graph.
upscaleScene(...).mul(vignette) — showing it lives in a post graph.
upscale(...) node — one TSL post graph, effects and all.
recurrentDenoise)
fights FSR3's jitter. Not part of the library.
upscale() node —
transparents and particles authored as an in-graph coverage pass. Toggle
it to A/B the ghost trails.
dispatchGuides() / dispatchUpscale() frame, with
the published dilated motion, disocclusion, and depth guides sampled live
as TSL texture nodes.
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.
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.
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.
@pmndrs/upscaler/core on a bare GPUDevice — the contract every
engine adapter is written against — and the adapters built on it.