In de zomer van 2020 toonde Epic Games voor het eerst de nieuwste versie van zijn game-engine, Unreal Engine 5. Die eerste demo gooide hoge ogen en bood een eerste blik op de grafische mogelijkheden van de volgende generatie consoles. Inmiddels zijn we twee jaar verder en is Unreal Engine 5 beschikbaar voor het grote publiek. Ontwikkelaars als CD Projekt RED werken aan nieuwe titels op basis van UE5, die een grote stap op het gebied van graphics belooft met functies als Nanite en Lumen voor realistische geometrie en verlichting.
:strip_exif()/i/2005191924.jpeg?f=thumblarge)
Tweakers sprak met twee ontwikkelaars van Epic Games over Unreal Engine 5. Nick Penwarden werkt sinds 2011 bij Epic Games en is daar sinds 2019 vice president of engineering. De Nederlandse Arjan Brussee werkte oorspronkelijk bij Epic Games mee aan games als Jazz Jackrabbit en heeft ervaring bij studio's als Guerrilla Games en EA. In 2017 keerde hij terug bij Epic en later werd hij product director voor Unreal Engine. In dit interview bespreken we met hen onder meer de ontwikkeling van Unreal Engine en gaan we dieper in op een aantal nieuwe features uit Unreal Engine 5: Nanite, Lumen en Temporal Super Resolution.
Over de ontwikkeling van Unreal Engine 5
Unreal Engine 5 werd in 2020 voor het eerst aan de wereld getoond, maar was vast al langer in ontwikkeling. Wanneer zijn jullie begonnen met het werk aan Unreal Engine 5?
Nick Penwarden: “Volgens mij was dat tegen het einde van 2018. Toen zijn we bij elkaar gaan zitten en hebben we nagedacht over hoe Unreal Engine 5 eruit moest zien. We deden op dat moment veel onderzoek en hadden veel technologie in ontwikkeling. We zagen dat een hoop van die ontwikkelingen veelbelovend waren.”
“Bij ons systeem voor gevirtualiseerde geometrie, Nanite, begon bijvoorbeeld alles op zijn plaats te vallen. We begonnen ons steeds meer te verdiepen in de ontwikkeling van dynamische global illumination, ofwel GI, met Lumen. We investeerden in het uitbouwen van World Partition en andere tools voor het maken van grote open spelwerelden. Zo zagen we een hoop technische ontwikkelingen samenkomen en toen we alles bij elkaar optelden, voelde deze set functies aan als een generatiesprong. Dus we hebben dat allemaal samengevoegd in Unreal Engine 5.”
Hoe bepalen jullie welke nieuwe features jullie ontwikkelen voor een toekomstige enginerelease?
:fill(white):strip_exif()/i/2005191304.jpeg?f=thumblarge)
Penwarden: "Ideeën voor functies komen uit verschillende bronnen. Soms komen ze voort uit feedback van onze klanten. We horen dan wat ontwikkelaars proberen te doen met Unreal Engine. We kijken ook naar trends in de industrie. We proberen zo de functies te identificeren die Unreal Engine volgens ons zou moeten hebben om een goede engine te zijn."
“Soms ontstaan ideeën voor nieuwe functies intern. We hebben ontwikkelaars in ons team die natuurlijk ook een visie hebben op iets waarvan zij denken dat het transformerend kan zijn. We proberen tijd voor hen vrij te maken om die ideeën uit te kunnen werken, om erachter te komen of er echt iets in zit. Als het iets is, dan kunnen we daarop voortbouwen en dat in de engine integreren.”
“Twee voorbeelden daarvan zijn me goed bijgebleven. Een daarvan is Nanite, wat een intern door innovatie gedreven initiatief was van Brian Karis, graphics engineer voor Unreal Engine. Hij dacht dat hij een rendersysteem kon bouwen dat in staat was om in real time miljarden en miljarden triangles te streamen en te renderen. Het andere voorbeeld is World Partition, die ontwikkelaars bijvoorbeeld in staat stelt om alleen bepaalde delen van een grote open spelwereld in te laden, zonder dat die handmatig opgedeeld moeten worden in kleinere sublevels. We zagen daar een duidelijke behoefte voor in de sector.”
De focus bij de demo's van Unreal Engine 5 lag op de PS5 en Xbox Series-consoles, maar jullie ondersteunen ook nog steeds last-gen consoles en andere platforms. Is het niet moeilijk om je zo te focussen op die high-end consoles en tegelijkertijd die oudere platforms te moeten ondersteunen?
Penwarden: "Het korte antwoord op je vraag is ja, maar we wilden deze overgang zo pijnloos mogelijk maken voor ontwikkelaars. We wilden zoveel mogelijk huidige Unreal-ontwikkelaars in staat stellen om over te stappen en te profiteren van al het werk dat we in Unreal Engine 5 hebben gestopt."
"We hebben een aantal technologieën die gericht zijn op next-gen hardware, of inmiddels eigenlijk de huidige generatie. Met Nanite en Lumen richten we ons bijvoorbeeld op dat niveau van gpu-prestaties. Dan hebben we nog andere systemen zoals World Partition. Die functionaliteit werkt op alle platforms. En dus wilden we UE5 niet segmenteren om alleen deze generatie consoles te ondersteunen."
Arjan Brussee: "Natuurlijk zie je dat ontwikkelaars altijd supermooie dingen willen maken op platforms die dat ondersteunen, maar de zakelijke kant dicteert ook de behoefte om games op zoveel mogelijk platforms uit te brengen. Misschien zijn er nog wel zaken te doen op de PlayStation 4, de Nintendo Switch of zelfs op smartphones."
"Fortnite heeft die weg in sommige aspecten geleid. Die game schaalt helemaal van high-end consoles naar mobiele telefoons. Maar er zijn meer en meer titels die dat doen en veel daarvan draaien op Unreal om die schaalbaarheid te bereiken. Je maakt de content één keer en je kunt het vervolgens omhoog of omlaag schalen op al deze platforms. Dat vinden we belangrijk."
Tegen wat voor uitdagingen loop je zoal aan bij het ontwikkelen van een nieuwe engine en het implementeren van nieuwe features?
Penwarden: "Een aantal van onze inspanningen waren bedoeld om grote problemen aan te pakken. Sommige daarvan hebben we in het verleden al geprobeerd op te lossen. Dynamische GI is iets waar we, samen met veel anderen in de industrie, al meer dan een decennium mee bezig waren. Nanite kwam natuurlijk voort uit een puur onderzoeksconcept, dus dat was inherent riskant en moeilijk om te realiseren. Elke andere functie heeft verschillende soorten uitdagingen. Ik denk dat het allemaal moeilijk was, maar het is ook een labor of love om al die technologieën te bouwen en het samen te brengen."
Brussee: "Er zijn ook nog veel dingen die we willen doen waar we nog niet aan toe zijn gekomen. Unreal Engine 5.0 is natuurlijk pas de eerste release van veel nieuwe functies. Een voorbeeld daarvan is World Partition voor het bouwen van grote spelwerelden; er is een grote kans dat we daar op voort zullen bouwen in de komende paar jaar. Er is nog zoveel te doen en de eerste release is nog maar het begin. We kijken nu al vooruit en we weten waar we heen willen."
Waar willen jullie nog meer aan werken?
Penwarden: "We hebben veel in de maak, maar ik kan niet alles nu al delen. Er zijn een aantal verbeteringen boven op de technologieën van UE5 die we willen uitbrengen. Nanite willen we bijvoorbeeld uitbreiden tot meer dan alleen rigid meshes. We kijken naar andere scenario's om Nanite in te zetten, zoals foliage. We onderzoeken daarnaast meer verschillende workflows om met Nanite te werken."
"Lumen is een ander goed voorbeeld, want daarmee hebben we een concreet doel voor op de korte termijn. In onze Lumen in the Land of Nanite-, Valley of the Ancient- en The Matrix Awakens-demo's richtten we ons op 30fps voor de hoogst mogelijke kwaliteit, maar we vinden dat 60fps het doel moet zijn voor consolegames. We werken daarom aan een versie van Lumen die goed zal draaien op 60fps. We blijven ook proberen de Unreal Editor te evolueren. We blijven workflows toevoegen om het makkelijker te maken om content te maken. We zijn altijd op zoek naar manieren om de efficiëntie van ontwikkelaars te verbeteren."
Brussee: "We hebben ook een aantal investeringen gedaan in ecosysteemachtige dingen. We proberen met Quixel bijvoorbeeld aan iedere gebruiker gedetailleerde content te leveren. We zien waartoe mensen op eigen houtje toe in staat zijn in Unreal Engine. Ze maken waanzinnige dingen na in de engine."
"We zouden graag zien dat meer en meer makers in dat ecosysteem terechtkomen. We willen van iedereen een bekwame contentcreator of gameontwikkelaar maken. Unreal Engine wordt tegenwoordig gebruikt in van alles, ook films. Dus er is een hoop groei in dat hele ecosysteem nodig en daar willen we verder aan werken."
Gevirtualiseerde geometrie met Nanite
Wat is Nanite?
Nanite is een van de grote nieuwe features in Unreal Engine 5. Wanneer wordt gesproken over Nanite, wordt eigenlijk een concept genaamd 'gevirtualiseerde geometrie' bedoeld. Kort gezegd kunnen ontwikkelaars met Nanite een groot aantal verschillende fotorealistische assets met miljoenen polygonen direct importeren en gebruiken in hun games. Het idee achter Nanite is dat ontwikkelaars zich op die manier minder zorgen hoeven te maken over de hoeveelheid polygonen in een frame.
Assets worden met Nanite opgedeeld in verschillende clusters met polygonen. Tijdens het renderen worden de clusters on-the-fly verwisseld of zelfs helemaal weggelaten op basis van het schermpercentage dat ze innemen, tot op pixelniveau. Dat gebeurt zonder traditionele level-of-detailinstellingen en zonder een merkbaar verlies in kwaliteit wanneer objecten op een grotere afstand van de 'camera' zijn geplaatst.
Met Nanite wordt dus alleen het visuele detail dat daadwerkelijk kan worden waargenomen gerenderd, zonder dat er rekenkracht wordt verspild aan polygonen of details die zo klein zijn dat ze niet bijdragen aan de visuele kwaliteit. Ontwikkelaars kunnen direct hun high-res assets importeren via software als ZBrush en die vervolgens direct in hun games plaatsen, zonder dat dat ten koste gaat van de framerate.
We hadden het er net al over, maar een van de grote toevoegingen aan Unreal Engine 5 is Nanite. Wat probeerden jullie hiermee te bereiken?
Penwarden: "Een van de echte krachten van Nanite, naast het vermogen om goede visuals te leveren, gaat eigenlijk over het in staat stellen van artiesten om niet beperkt te worden door traditionele renderobstakels. Ze hoeven zo niet na te denken over de hoeveelheid triangles in hun 3d-modellen en over hoeveel objecten ze maximaal in de spelwereld kunnen plaatsen."
"We probeerden hen te bevrijden en op het punt te komen waar artiesten zich volledig kunnen concentreren op creativiteit. De engine kan dan dealen met de technische details van gameontwikkeling. Overal waar we dat soort verschuivingen kunnen maken, kunnen ontwikkelaars zich concentreren op wat echt belangrijk is voor hun games: de creatieve delen die echt onderscheidend zijn en games uniek en leuk maken, in plaats van dat ze zich zorgen moeten maken over de technische details."
Is Nanite altijd sneller, of zijn er ook beperkingen en nadelen?
Penwarden: "Dit is eigenlijk een makkelijke vraag. Ja, het is altijd sneller om de Nanite-renderpijplijn te doorlopen."
Jullie zien dus geen nadelen?
Penwarden: "De enige nadelen zijn de huidige beperkingen van wat Nanite kan renderen. Niet alles kan gerenderd worden met Nanite. We ondersteunen op dit moment geen doorzichtige oppervlakken, of het renderen van alphamaskmaterialen. We ondersteunen op dit moment ook nog geen dingen zoals World Position Offset in combinatie met Nanite. Maar zolang je binnen de grenzen blijft van wat Nanite kan, is het altijd beter.
Een weergave met Nanite-clusters (links) en het eindresultaat. Bron: Epic Games
Dynamische global illumination en reflecties met Lumen
Wat is Lumen?
Lumen is een functie die dynamische GI en reflecties mogelijk maakt, die het pad van omgevingslicht realistisch volgt en in real time laat reageren op de omgeving, inclusief indirecte verlichting via weerkaatsingen en bijbehorende reflecties op oppervlakken als glas. Traditioneel wordt dat gedaan op basis van de screenspace of met raytracing, maar respectievelijk de kwaliteit en prestaties laten daarmee te wensen over. Lumen gebruikt een soort hybride aanpak.
Lumen heeft in wezen twee versies. De standaardversie voert een soort softwarematige raytracing uit. Daarmee wordt het pad van de rays gevolgd in een versimpelde versie van de omgeving. Die versimpelde versies worden gegenereerd op basis van signed distance fields, een soort volumetrische weergave van het 3d-oppervlak.
Dat is efficiënt, omdat de rays hiermee door een simpel volume reizen totdat er daadwerkelijk een oppervlak wordt geraakt. Als dat gebeurt, dan wordt een surfacecache met informatie over dat oppervlak benaderd, om op die manier te bepalen hoe het licht moet reageren op basis van eigenschappen als de textuur en het materiaal. Zo wordt directe en indirecte verlichting berekend voor een frame. Die informatie wordt vervolgens teruggevoerd naar de surfacecache, zodat dat gebruikt kan worden in toekomstige frames. Dat maakt het mogelijk om relatief efficiënt GI en reflecties te berekenen met veel lichtweerkaatsingen en meerdere lichtbronnen.
Lumen heeft ook een versie die hardwarematige raytracing uitvoert op platforms die dat ondersteunen, zoals RTX-videokaarten van Nvidia en Radeon RX 6000-gpu's van AMD. Volgens Epic Games leidt dat tot een betere beeldkwaliteit. Standaard wordt echter de softwareversie gebruikt.
Met Unreal Engine 5 hebben jullie Lumen geïntroduceerd voor GI. In de releasenotes staat dat jullie daar een versie met softwarematige raytracing van hebben, maar ook een versie die gebruikmaakt van hardware. Daarbij wordt specifiek genoemd dat de hardwarematige Lumen-implementatie tot betere visuals leidt, maar er wordt niet gerept over het inzetten van raytracinghardware voor betere prestaties. Is dat ook een optie?
Penwarden: "Lumen is een soort framework om verschillende verlichtingsalgoritmes en -oplossingen in één plaats te integreren voor het berekenen van dynamische GI. Dan gaat het dus om bijvoorbeeld het tracen van het pad van verlichting. Er zijn een aantal manieren waarop Lumen dat kan doen."
"We hebben de vereenvoudigde signeddistancefieldmodellen, een soort softwarematige raytracing. We hebben er ook het model met hardwarematige raytracing voor. We kunnen met hardwareraytracing een hogere kwaliteit bereiken. Dat is omdat Lumen via hardwareraytracing compatibel is met een groter aantal geometrietypes. De kwaliteit is ook beter omdat hardware-Lumen de ray intersects berekent op basis van de individuele triangles in plaats van via de surfacecache. Betere prestaties zullen lastiger zijn."
"Ik weet niet zeker of het altijd langzamer is om hardwareraytracing te gebruiken. Ik denk dat ontwikkelaars dat zelf een beetje moeten proberen met hun projecten. Het mooie van het hebben van deze opties is vooral dat Lumen in staat is om speciale hardware voor raytracing te benutten, maar ook dynamische GI kan leveren op hardware zonder speciale raytracingcores. Dus het stelt ons in staat om een bredere basis van hardware te ondersteunen."
Werkt het hardwarematige Lumen-model ook op de PS5 en Xbox Series X, omdat die gebaseerd zijn op de RDNA2-architectuur van AMD en dus ray accelerators hebben?
Penwarden: Ja, Unreal Engine 5 ondersteunt hardwarematige raytracing via Lumen op de PlayStation 5 en Xbox Series X en S.
Een scène met Lumen (links) en dezelfde scène met Lumen uitgeschakeld. Bron: Epic Games
Upscaling en anti-aliasing met Temporal Super Resolution
Wat is Temporal Super Resolution?
Temporal Super Resolution, oftewel TSR, is een techniek voor temporal upscaling. TSR combineert gegevens uit de huidige en voorgaande frames om frames op een lagere resolutie te renderen, en deze vervolgens op te schalen naar een hoge resolutie, bijvoorbeeld van 1080p naar 4k.
Het eindresultaat is volgens Epic Games een beeld dat bijna dezelfde beeldkwaliteit biedt als native 4k, maar dat wordt dan bereikt met minder rekenkracht en dus hogere en stabielere framerates. TSR werkt op verschillende platforms, van pc's tot consoles, en wordt ook gebruikt voor anti-aliasing.
Tweakers schreef eerder een achtergrondverhaal waarin dieper wordt ingegaan op de technische werking van Nvidia DLSS, Intel XeSS en AMD FSR 2.0, drie andere technieken voor temporal upscaling. Hoewel dit andere implementaties zijn, komt de werking overeen.
Bestaande technieken voor temporal upscaling, zoals Nvidia DLSS, Intel XeSS en AMD FSR 2.0, lijken onder de motorkap enorm op elkaar. Ze gebruiken bijvoorbeeld allemaal vrijwel dezelfde 'inputs' van de engine: informatie uit huidige en voorgaande frames, naast motionvectors en depthbuffers om bijvoorbeeld ghosting te voorkomen. Hoe zit dat met Temporal Super Resolution?
Penwarden: "Temporal Super Resolution werkt op een zeer vergelijkbare set van inputs. Het is zowel image-based als temporal. We hebben eigenlijk een soort historybuffer waarmee we gaandeweg data uit frames verzamelen. Dan gebruiken we nog dingen als motionvectors. Dus de inputs van TSR zijn zeer vergelijkbaar met dingen als DLSS. De techniek zelf is, zoals ik al zei, image-based en temporal. Dat in tegenstelling tot iets als DLSS, dat machinelearning gebruikt om uit te zoeken hoe al die inputs gebruikt kunnen worden om een beeld op te schalen. TSR is een meer traditionele benadering van upscaling, op basis van een algoritme."
Dat klinkt vergelijkbaarder met iets als FSR van AMD?
Penwarden: "Een soort van. De originele FSR is puur image-based, of spatial. FSR 2.0 is dan weer temporal. Het algemene idee, of de high-level structuur, is daarmee inderdaad vergelijkbaar, maar natuurlijk zijn de specifieke algoritmes en technische details anders."
Jullie gebruiken dus een algoritme in plaats van machinelearning. Is dat voor de compatibiliteit?
Penwarden: "Dat is juist. TSR is ontworpen om te werken met zowel AMD- als Nvidia-gpu's en natuurlijk draait het ook op Intel-gpu's op de pc. Het mooie is dat we dezelfde functionaliteit kunnen gebruiken op consoles en pc's en dat je dezelfde consistente output krijgt zonder dat je verschillende algoritmes moet mixen en matchen."
Zien jullie TSR als een volwaardig alternatief voor technieken als FSR 2.0, DLSS en XeSS?
Penwarden: "Ja, we zien het als een integraal onderdeel van de Unreal Engine 5-renderpijplijn. Als we kijken naar alle verbeteringen die we proberen te maken, zoals dynamische globale verlichting met Lumen, bijvoorbeeld. Dat vereist een heleboel rekenkracht per pixel. En om de hoogste kwaliteit te leveren op de PS5 of Xbox Series X, waar we een beperkt gpu-budget hebben, helpt TSR ons echt."
Is TSR optioneel?
Penwarden: "Ja en nee. Je kunt TSR uitschakelen als je dat zou willen, maar TSR is standaard ingeschakeld in UE5. Eigenlijk ongeacht of je iets als Lumen gebruikt of niet; we zetten het nog steeds standaard aan, omdat het zo waardevol is. Het geeft je een uiteindelijke output die vergelijkbaar kan zijn met native 4k, maar dan met veel lagere gpu-kosten. Dus ongeacht hoe je als ontwikkelaar besluit om die gpu-tijd te besteden, of dat nu aan Lumen is of iets anders; we denken nog steeds dat het een waardevol gebruik van gpu-tijd is."
Brussee: "Het is erg waardevol. We hadden artists die keken naar beeld dat was opgeschaald met TSR en ze konden het verschil met native 4k niet zien. Het mooie is dat we een dynamische resolutie hebben. Op deze manier kunnen we de gpu altijd 100 procent belasten. Dus in drukke frames, bijvoorbeeld met veel particles, loopt je framerate niet vast. Het gaat gewoon door."
Penwarden: "Dat is inderdaad belangrijk. Sommige andere upscalingmethoden maken gebruik van een vaste inputresolutie voor iedere frame. De variabele inputresolutie is belangrijk voor het behoud van een consistente framerate. Het stelt ons in staat om de visuele kwaliteit een beetje te verlagen om veel actie in een frame op te vangen, zonder de framerate te verlagen. Het is niet alleen bedoeld voor het verhogen van de framerate. Het gaat meer over het handhaven van een stabiele 60fps, terwijl de graphics zo mooi mogelijk zijn."