The Resolution Dial
RenderScene grows an upscale_mode pin: render the 3D pass at 50, 67, or 75 percent resolution and a temporal upscaler reconstructs full size from jitter, history, and motion vectors. The Upscale node, meanwhile, now admits to being a bicubic filter.

Somewhere in the engine there has been, for two months, a complete FSR3-style temporal upscaler. Compute pipeline, Catmull-Rom reconstruction, YCoCg clamp, history management, the lot. Finished, tested, and connected to absolutely nothing. The commit that landed it described the node wiring as deferred to a follow-up. The follow-up is this release.
What you get
RenderScene has a new upscale_mode pin: Off, Temporal50, Temporal67, Temporal75. Pick Temporal50 and the 3D pass renders at half resolution per axis, which is a quarter of the pixels, while the upscaler rebuilds your full-resolution image from the sub-pixel jitter pattern and the motion vectors the renderer already produces for TAA. The temporal part is doing real work: in our gate, a single upscaled frame contains zero hard edge transitions, and after the history converges there are twenty thousand of them. That detail was not in any one frame. It accumulated.
The dial matters most when the GPU is the bottleneck. On our test hardware the thousand-light club scene gets 11 percent faster at Temporal50, and heavier shading scales the win further; the laptop and browser tiers this exists for will feel it more than a desktop RTX does. When the upscaler is active it takes over temporal accumulation entirely, so it replaces TAA rather than stacking on top of it, and shares the same alpha and history plumbing. Off means off: bit-identical to yesterday’s pipeline.
A node stops lying
The texture.Upscale node has been advertising “one node, three algorithms”: a temporal TSR resolver, AMD’s FSR 3.1, and a DLSS placeholder, with quality tiers, a depth input, a motion input, and a sharpness control. What the shader actually did, regardless of any of those pins, was a single bicubic Catmull-Rom sample. The depth, motion, and sharpness pins were read into variables named underscore and dropped on the floor.
It now has two pins, texture and upscale_scale, and documentation that describes a bicubic filter, because it is a bicubic filter. A perfectly good one — sharper than bilinear, no halos, HDR-safe. The temporal reconstruction it used to promise lives on RenderScene, where the depth, motion vectors, and history actually exist. MotionBlur in the same file lost its decorative depth pin too, and its docs no longer cite a paper the shader doesn’t implement. A registration gate now pins both nodes to exactly the pins their shaders read, so the decorations do not grow back.
The second parallel upscale pipeline stack we found gathering dust alongside the first one has been deleted. One upscaler, wired, beats two upscalers in a drawer.