Hi,
My name is Guillaume Abadie, principal graphics programmer at Epic Games, author of Temporal Super Resolution in UE5.
The goal of the TSR is to be a temporal upscaler that answer the anti-aliasing need of displaying unprecedented Nanite amount of details on screen, while accommodating enough GPU performance to entire renderer by rendering lower resolution than we were before, to in turn enable as many rendering feature as possible to produce the best image as possible on all the platform we support (such as Lumen, VSM, Volumetric clouds and many more). But the cherry on the cake for TSR being such a technical challenge is the fact that absolutely all 3D rendered pixels are going through it, transforming the problem to solve into a very delicate balance between needs of pretty much all the different rendering use cases each art department may envision in their own project. As a result the development of TSR has been a humbling 3 years ride of exploratory research and experimentations, many more failures than successes to learn from, and major changes of technical directions upon each incremental technical discovery.
It started with very early experimental prototype after our experience of Lumen in the land of Nanite demo and how such technology was required to hope to ship at 60hz on now current gen consoles PS5 and XSX. While born in UE5, it was “hidden” in 4.26 (r.TemporalAA.Algorithm=1) because we wanted to experiment how much work it would be to ship in Fortnite that was still on UE4 at this early time. Suffice to say I wouldn’t recommend a ship to project with it, and it became a very different beast in 5.0 from our learning of shipping the Matrix Awakens demo at 30hz on console.
It then substantially changed again for the shipping at a production scale of Fortnite Chapter 4 at 60hz on console: needed to shrinking its runtime cost from 3.1ms to 1.5ms on console 1080p → 4k; and yet improve on the compatibility with the gigantic amount of content that had already been authored in previous seasons of Fortnite without adding migrating cost on the art team.
Release schedule 5.1 compared to Chapter 4 and all the changes needed in TSR made it such that is was still not stable enough which is not great considering absolutely all 3D rendered pixels are going through it. This is where the upcoming 5.2 release is in fact a big deal for TSR being the first release both production proven state, stable and with more debuging tools.
For instance 5.2 adds a VisualizeTemporalUpscaler show flag designed to quickly diagnose common ghosting problem (wrong velocity vector of object, translucency ghosting, overdark pre-exposure of our internal buffers causing TSR to be mislead of the actual exposure of pixels to the user, or more generally any artifacts actually produced by other rendering algorithms).
There’s been quite some hype and noise about upscalers recently and sometimes technical information is mixed up with marketing messages, and that could lead to misunderstandings: for instance there was some confusion around its role to fit the Matrix Awakens demo in GPU budget on consoles ( The Matrix Awakens Tech Analysis + PS5 vs Xbox Series S/X Performance Analysis - YouTube ). In this instance TSR got a little bit victim of its own success hiding too well how low the rendering resolution was on this demo and changed/eliminated previous paradigm used by news channel to know what is in fact the rendering resolution ( https://twitter.com/Dachsjaeger/status/1469927361365880835 ). Also shortly after that time there were UE 4.2x games that had exposed the older prototype as TSR to the player, and that caused even more confusion as to what TSR was actually able to deliver.
TSR 5.0 Low (r.AntiAliasingMethod=4, sg.AntiAliasingQuality=0), ScreenPercentage=50, 8x zoom in on camera cut (r.Test.SecondaryUpscaleOverride=8, r.Test.CameraCut=1), without the spatial anti-aliaser where it is easy to count rendering resolution thanks to the aliasing on geometric edges.
TSR 5.0 Medium (r.AntiAliasingMethod=4, sg.AntiAliasingQuality=1), ScreenPercentage=50, 8x zoom in on camera cut (r.Test.SecondaryUpscaleOverride=8, r.Test.CameraCut=1) with the spatial anti-aliaser that introduced between 5.0 Early Access and The Matrix Awakens for 5.0 where it is no longer that easy to count rendering resolution on geometric edges.
Therefore we have been very careful projecting a fair image of the tech to our players and developers: Showing just frame rate increases as the rendering resolution lowers is glancing over an important compromise any temporal upscaler is subject to: discarding previously accumulated details for various reasons brings on a fundamental problem that is is impossible to know how a new details should ultimately look on screen until enough information is accumulated.
(CitySample editor, r.AntiAliasingMethod 4, r.Test.SecondaryUpscaleOverride 4, ScreenPercentage=61)
(CitySample editor, r.AntiAliasingMethod 0, r.Test.SecondaryUpscaleOverride 4, ScreenPercentage=61)
Knowing this information is in fact directly tied to knowing more information about the details that is limited by how fast detailed information is accumulated. Therefore 5.2 added a new stat tsr
command that shows how two very important metrics the TSR output quality is directly dependent:
-
TSR feed: how many pixels per second is being rendered that represent total amount of information TSR can work with to converge to the image. This metric has the property of communicating how a final image can look at macroscopic level at distance of the monitor, regardless of the displayed resolution.
-
TSR 1spp: the convergence speed of details per pixel displayed. The lower the resolution gets (either r.ScreenPercentage or r.DynamicRes.*) the more frames are needed to have 1 rendered pixel per displayed pixel. How fast a frame is accumulated being directly tied to frame rate that not only depends on GPU performance, but also CPU performance and VSync, this metric is shown in milliseconds to display a better understanding how all of this is tied together and directly affects TSR’s microscopic details accumulation.
(stat tsr command completing stat unit command in UE 5.2)
I personally hope you will like TSR whether it is in UE 5.2, Fortnite Chapter 4 season 2 or Fortnite Creative 2.0. I also hope that these few words would convince any of our licensees shipping a title on 5.0 or 5.1 to consider merging 5.2’s TSR and its tools back. But also hope this catalyzes healthy feedback on this thread about what you think of TSR, and most importantly where are the weaknesses that affects your project with concrete illustration, and would like to see it improve in future release of Unreal Engine.
Looking forward to hearing from you!
(giff of TSR 5.2 Epic scalability at ScreenPercentage=50)