Pipeline 3D: Så här gör alla GPU: er grafik

Hur GPU: er genererar grafik i realtid verkar som magi för oss, men de följer alla samma procedur och samma steg. Det är därför vi har beslutat att organisera en resa genom 3D-rörledningen, vilket är vanligt för alla API: er och alla 3D-arkitekturer.

I datorer är en pipeline en serie steg som beställs och upprepas ad nauseam för att utföra en uppgift. När det gäller 3D-rörledningen har det varit detsamma i årtionden och förändringarna har gjorts i små optimeringar.

Det är därför vi ska ta en tur genom 3D-rörledningen på ett helt generiskt sätt och utan att fokusera på någon typ av GPU arkitektur eller specifikt grafikkort.

Shader-program i den grafiska pipelinen

Rörledning 3D

En Shader är inget annat än ett litet program skrivet på ett högnivåspråk som används för att modifiera en grafisk primitiv, vare sig det är ett toppunkt eller en pixel. Dessa program körs flera gånger under den grafiska pipelinen av en serie enheter som faktiskt själva är processorer, som vi kallar skuggningsenheter.

Under olika steg i rörledningen kommer data in från skuggningsenheterna till andra enheter av samma typ och de med fast funktion. Hittills finns det ingen specialiserad skuggningstyp för varje typ av skuggning, utan en generisk processor används. I slutet av dagen, även om vi kan skilja ett toppunkt från en pixel för en processor, är de inget annat än binär data att bearbeta.

Det första steget i 3D-rörledningen sker på CPU: n

CPU-rendering

En GPU är inte en CPU, det är uppenbart, men det måste klargöras genom att de inte fungerar på samma sätt. Anledningen till detta är att en GPU inte kör ett operativsystem och varken ett program, utan snarare är dess uppgift att läsa en skärmlista som CPU: n skriver och det är inget annat än en lista med instruktioner om hur man ritar nästa ram .

Denna lista är skriven av CPU: n i en del av main RAM, GPU via en DMA-enhet får åtkomst till RAM-minnet och kopierar det. Denna lista finns alltid i samma del av RAM-minnet och grafikkortet konsulterar det kontinuerligt för att skapa var och en av ramarna på skärmen.

Informationen i listan gör det möjligt för GPU att komponera en 3D-scen, förutom att integrera instruktioner för att manipulera de olika elementen. Den här listan kommer att bearbetas av GPU-kommandoprocessorn, som organiserar resten av komponenterna i grafikchipet under de olika stadierna.

World Space Pipeline

Elefant trådram

World Space Pipeline är den första halvan av rörledningen för att skapa 3D-scener i realtid som händer på GPU: n, det är så kallat eftersom det är här världens delar beställs och ritas innan de projiceras. I den här delen arbetar vi med vektorer i tredimensionellt utrymme, medan vi i andra hälften av 3D-rörledningen arbetar med pixlar.

Det är idag den lättaste delen när det gäller beräkning, vilket är nyfiken på grund av det faktum att i början av 3D-grafik var det beräkningen av scenens geometri som mest tog ingenjörer på huvudet. för att skapa hårdvara som kan visa 3D-grafik i realtid.

Andra till femte steget i 3D-rörledningen: Transformationsmatriser

World Space Pipeline

Matriserna som används under den geometriska rörledningen är en serie av successiva aritmetiska operationer, som utförs på ett sammanhängande sätt och motsvarar olika steg i den geometriska rörledningen. Vi kommer inte att gå in på den matematiska delen av dem på grund av det faktum att vi vill göra saker så enkla som möjligt.

Alla utförs i följande ordning och för vart och ett av objekten i en 3D-scen och exekveras för varje objekt i scenen.

  • Modellmatris: Den första matrisen omvandlar koordinaterna för vart och ett av objekten till gemensamma koordinater.
  • Visa matris: Det andra steget är att rotera och flytta varje objekt för att placera varje objekt enligt kamerans synvinkel.
  • Projektionsmatris : Vad den här matrisen gör är att förvandla objekten efter avståndet från kameran, vilket gör att de närmaste blir större och de längre blir mindre.

GPU: er utför alla beräkningar för transformationsmatriser i skuggningsenheter idag eftersom de är tillräckligt kraftfulla för att göra det. Tidigare hade fasta funktionsenheter och till och med kombinationer mellan fast funktion och programmerbar del använts, men idag är detta inte längre fallet och hela World Space Pipeline går på skuggor.

Shader-typer i World Space Pipeline

WirefFrame Shader

Den första av dem är Vertex Shader, som är den vanligaste och mest använda. Detta gör det möjligt för oss att genom ett program modifiera värdena för varje toppunkt såsom färg, position, längd och till och med den struktur som de är associerade med. Den andra och tredje typen av Shader kallas Hull och Domain Shader, som endast används tessellering av geometri. Vilket består av att skapa nya hörn för ett tredimensionellt objekt utan att förlora sin yttre form.

Den fjärde typen är Geometry Shader, den var typisk för DirectX 10 och löper precis i slutet av den geometriska rörledningen, i Geometry Shader tas en grupp hörn som bildar en enda primitiv och genom ett skuggprogram omvandlas dessa hörn till skapa en ny primitiv från att ändra den ursprungliga formen.

Från och med DirectX 12 Ultimate har dessa fyra skuggor grupperats i två olika skuggningar som heter Amplification Shader och Mesh Shader. Den första använder inga primitiva, men bestämmer hur många skuggor som ska köras och är helt valfritt. Mesh Shaders ersätter istället alla Shaders i World Space Pipeline i en enda typ av shader.

Rörledning för skärmutrymme

Pantalla Juego

Screen Space Pipeline är den andra halvan av 3D-pipelinen, där objekt omvandlas till tvådimensionellt utrymme på skärmen och manipuleras. I detta skede ger GPU färg och struktur till de olika elementen som utgör scenen för att senare skicka det slutliga resultatet till bildbufferten.

Sjätte steget i 3D-pipelinen: Scan Conversion eller rasterized

Rasterización Función Fija

I slutet av World Space Pipeline har vi alla objekt placerade korrekt enligt deras avstånd och position i förhållande till kameran, så det är dags att konvertera scenen till en 2D-bild. Där i första hand vad som görs är att kasta djupvärdet för varje objekt i förhållande till kameran, som kommer att lagras i en bildbuffert som kallas Z-buffert där avståndet för varje pixel i förhållande till kameran är i varje position i bildbufferten.

Denna process utförs i specialiserade enheter inom GPU: erna, som sedan de första 3D-acceleratorerna är en integrerad del av alla grafikchips som är avsedda att rendera denna typ av grafik. Eftersom det är själva hårdvaran som utför detta arbete

När rasteriseringsprocessen är klar kommer textureringsprocessen där fragmenten skickas tillbaka till Shader-enheterna för texturering och tillämpning av Pixel Shaders.

Sjunde etappen av 3D-rörledningen: strukturering

textur kartlagd

Nästa steg är att ge textur till de olika fragmenten, att visualisera konceptet du måste föreställa dig att å ena sidan har vi en serie ytor som är fragmenten och å andra sidan har vi en serie lim som vi måste lura varje fragment.

Från början av rörledningen tilldelas var och en av ytorna en serie parametrar, inklusive minnesadressen där texturerna är placerade, så att texturerna kan appliceras korrekt på ytan, så att varje pixel förblir i sin rätta position.

Placeringen av texturerna utförs av specialiserade enheter som är inne i GPU: n, idag är de enheterna som ansvarar för att utföra skuggprogrammen och är anslutna till den första nivåens datacache.

Data- / texturcache och texturfiltrering

I alla grafikprocessorer har du observerat att texturfiltreringsenheten ligger mycket nära beräkningsenheterna som kör skuggorna, liksom en datacache som också kallas texturcache.

ALU: erna för skuggningsenheterna kör alltid de data som finns i deras register, men det finns tillfällen när det är nödvändigt att komma åt data långt ifrån dessa och av den anledningen kommer de med ett cachesystem, inklusive, naturligtvis, själva strukturerna eller fragment av texturerna.

Dessa strukturer kommer ofiltrerade, vilket orsakar en pixeleffekt, som korrigeras genom interpoleringseffekter. Det mest grundläggande är bilinear interpolation, som består av interpolering av värdena på 4 intilliggande pixlar. Därför är alla texturenheter grupperade i skuggningsenheter 4 med 4 i alla grafikprocessorer.

Pixel Shaders

Doom Evig

Det finns bara en typ av skuggning som används i Screen Space Pipeline, det här är Pixel Shader och det består av att kunna manipulera värdena på pixlarna genom en serie program, som är en av de två viktiga skuggtyperna tillsammans med Vertex Shader.

Pixel Shader är exakt den mest beräkningsbelastade delen av hela den grafiska rörledningen, orsaken till detta är att en triangel kan bestå av tre hörn, men ett stort antal pixlar. Dessutom, eftersom GPU: er arbetar med 2 × 2 pixelfragment internt i varje Shader-enhet, är dess funktion annorlunda än resten av skuggorna och det är den enda typen som fungerar med data utanför registren.

Sista steget i 3D-pipelinen: Render Output

VRAM

Den sista delen är Render Output, en serie enheter som kopierar slutresultatet för varje pixel till den slutliga bildbufferten, som vanligtvis finns i VRAM, men modernare system skriver till GPU: s egen L2-cache. för att påskynda efterbehandlingen.

Enheterna som ansvarar för detta steg kallas Render OutPut, förkortat ROP och plural ROPS. De härstammar från Blitter-enheterna i Commodore Amiga och Atari ST. Som utför en överföring av ett datablock från ett minne till ett annat med en instruktion i mitten.

Efter detta steg finns bilden redan i bildbufferten och den slutliga bilden är helt klar för att reproduceras på användarens skärm. Det är också möjligt att efterbearbetningseffekter utförs, men detta ligger redan utanför 3D-rörledningen och de utförs som om en 2D-bild manipulerades.