Sedan uppkomsten av DirectX 8 har antalet nya typer av shader ökat över tiden, de nästa som ingår i listan heter Traversal Shaders, som har att göra med framstegen mot adoption med paus, men utan ray tracing inbromsning spel. Låt oss se vad det består av och vilka förbättringar det kommer att tillföra spelen när det gäller prestanda.
Traversal Shaders är en av de två filosofierna för att ställa problemet med vägen till den rumsliga datastrukturen i Ray Tracing, som består av användningen av shader-program för att korsa den rumsliga datastrukturen som representerar scenen istället för att använda specialiserade eller dedikerade hårdvara.
Först och främst, låt oss komma ihåg vad en Shader är
I mjukvara känner vi i vardagsspråk som en shader ett program som körs på kärnorna i GPU, som har olika namn beroende på tillverkare. Så AMD kallar dessa bitar av hårdvara för Computer Units i sin Radeon, NVIDIA kallar dem Stream Multiprocessors eller SM i sin GeForce och Intel ger dem i sina ARC-namn dessa enheter Xe Core.
Så själva shadern är programvaran som körs på en av dessa enheter, som fungerar mycket nära en CPU, skillnaden är att en shader är ett program som körs på en grafisk primitiv i de olika stadierna render pipeline: hörn, primitiver, trianglar, skärvor eller pixlar. Även om dessa kategorier inte är något annat än abstraktioner som vi gör, för shader-enheten är allt data och det betyder att de kan köra alla typer av program.
Så varför inte använda en CPU? Jo, på grund av det faktum att det finns problem med att GPU:er, som är designade för att fungera parallellt, fungerar mycket bättre när man löser vissa sammanhang än vad en CPU gör, och på samma sätt händer det i fallet med GPU:er.
Microsoft, DirectX Ray Tracing och dess shaders
När Redmond först talade om att implementera ray tracing på Games Developer Conference 2018, var det några månader kvar till lanseringen av NVIDIA RTX 20 och vid den tiden var det helt okänt, åtminstone offentligt, av Det finns enheter att accelerera Ray Tracing som NVIDIAs RT Cores och AMDs Ray Acceleration Units.
Vad var Microsofts förslag att utöka sitt multimedia-API? Tja, lägg till en serie ytterligare steg, som definieras i följande diagram:
Det är lätt att förstå diagrammet:
- Blocken i blått är skuggningsprogram som körs på GPU-nivå.
- Blocken i grönt exekveras i CPU:n, drivrutinen, tillsammans med GPU:n.
- Diamanter i grått är förhållanden som kan uppstå när blixten passerar genom scenen.
Nu, i det här diagrammet finns ett element som inte ingår och det är för närvarande ett av de största problemen som finns med avseende på Ray Tracing: accelerationsstrukturens väg. Och vad är det? Vi har pratat om det i våra självstudier för strålspårning, men det skadar aldrig att komma ihåg.
Datastrukturer för att påskynda strålspårning
För att accelerera, och därför köra snabbare, strålspårningsalgoritmerna, är det som görs att kartlägga objektens position i scenen i en datastruktur, som är formad som ett binärt träd än GPU:n. skulle behöva gå.
För att du ska förstå processen att gå igenom datastrukturen är det som görs att börja från roten som representerar hela scenen och specificeras av nivåer tills du når den sista nivån. På varje nivå är det som görs att göra en begäran till RT Core eller motsvarande enhet för att beräkna om det finns en korsning, om det finns en så går den ner till nästa nivå, om det inte finns så stannar den vägen helt. Detta görs tills man når slutet av trädet, vilket är där ray-box-korsningen inte längre görs och ray-polygon-korsningen utförs.
Om du har varit insiktsfull, kommer du att ha sett att i diagrammet i föregående avsnitt bland typerna av shader har vi de för korsning, men inte de som ansvarar för att korsa BVH-trädet, det vill säga att korsa dem, även om det är förstått att denna uppgift utförs av enhetens shaders även om det inte finns någon specifik typ av shader för det.
Traversal Shaders, vad är de och vad är deras ursprung?
I DirectX Ray Tracing-dokumentationen kan vi bland de framtida hitta de så kallade Traversal Shaders, som kommer att läggas till i framtiden inom pipelinen för Ray Tracing i en senare version av Microsoft API, men det bästa är att sätta oss själva i situationen.
Övningen med att korsa datastrukturen hittills trots att det är ett shader-program, detta är generiskt och styrs av grafikdrivrutinen, så programmerarna behöver inte göra någonting då det är väl förstått att traversal shader Det ger applikationskodkontrollen för att gå igenom processen att korsa datastrukturen nod för nod.
Och vilka fördelar ger detta för prestanda? Det viktigaste är att vi kan definiera scenarier där en eller flera strålar kasseras innan korsningen görs, vilket inte är möjligt just nu. Ett mycket tydligt exempel skulle vara att möta objekt väldigt långt från kameran där belysningsdetaljen inte kan uppskattas lika mycket som på nära håll. Det måste beaktas att vi i den nuvarande versionen av Redmond API kan definiera med avseende på indirekt belysning om ett objekt sänder ut strålar eller inte genom Ray Generation Shader, men vi kan inte skapa scenarier där vi kan utesluta strålarna genom flygning , speciellt med avstånd.
Traversal Shaders för att bygga den rumsliga datastrukturen
Intels grafiska FoU-avdelning presenterade 2020 ett dokument med titeln Lat konstruktion av accelerationsstrukturer med tvärgående shaders och de av er som har lite behärskar det Shakespeareska språket kommer att ha dragit slutsatsen att det består av konstruktionen av samma rumsliga datastrukturer genom att använda Traversal Shaders. Så dessa kan inte bara användas för att styra banan, utan också för att bygga den.
Det första som sticker ut är Lazy Build, som vi skulle kunna översätta att vara utbildad som en byggnad med liten ansträngning. Och vad består den av? Tja, vad den här tekniken eftersträvar är att konstruktionstiden för datastrukturen reduceras. För detta är den baserad på tidigare information från tidigare ramar som lagts till en synlighetsalgoritm och om detta verkar förvirrande, låt oss definiera vad synlighet betyder när vi pratar om 3D-rendering.
Vi måste utgå från principen att när en GPU renderar vad den gör är att beräkna synligheten mellan en punkt i rymden och den första synliga ytan i en given riktning eller för att förenkla: synligheten mellan två element. Innan vi fortsätter måste vi ta hänsyn till en sak, när du läser detta har du säkert föreställt dig att du tittar på två föremål. Tja, saken är inte så, vi pratar om hur ett objekt skulle se ett annat om det kunde se, men från den enklaste definitionen hänvisar det till kameran, vilket är vyn från vilken vi återger.
I hybridrendering som kombinerar rasterisering med ray tracing, som nu används av alla spel, beräknas inte kamerans synlighet utifrån nämnda algoritm, utan snarare med rasteralgoritmen. Tanken i framtiden är att synligheten med avseende på kameran görs från Ray Tracing, så att med denna information slutar GPU:n med att bygga en datastruktur av hela scenen genom Traversal Shaders.