3D-spel rendering I

3D-spel Rendering 

 

Du spelar den senaste ring av Mario: Deathduty Battleyard på din perfekta gaming PC. Du tittar på en vacker 4K ultra widescreen-skärm, beundra den härliga naturen och intrikata detaljer. Någonsin undrat hur dessa grafik fick just det? Nyfiken på vad spelet gjort datorn göra för att göra dem?

Välkommen till vår 3D spel rendering värd: en nybörjares guide till hur en grundläggande ram för gaming godhet är gjord.

Varje år hundratals nya spel släpps över hela världen–vissa är utformade för mobiltelefoner, några för konsoler, några för datorer. Utbudet av format och genrer som omfattas är precis lika omfattande, men det finns en typ som möjligen utforskas genom spelutvecklare mer än någon annan typ: 3D. Först någonsin av dess likar är något öppen debatt och en snabbanalys av Guinness World Records-databasen ger olika svar. Vi kunde plocka Knight Lore av Ultimate, lanserades 1984, som en värdig förrätt men de bilder som har skapats i det spelet var strängt taget 2D – ingen del av den information som används är någonsin verkligen 3 dimensionella.

Så om vi kommer att förstå hur ett 3D-spel i dag gör dess bilder, vi behöver en annorlunda start exempel: vinnande drivs av Namco, omkring 1988. Det var kanske först i sitt slag att arbeta ut allt i 3 dimensioner från början, med hjälp av tekniker som inte är en miljon miles away från vad som händer nu. Naturligtvis något spel över 30 år gammal kommer inte att verkligen vara samma som, säg, Codemaster’s F1 2018, men det grundläggande systemet för att göra det hela är inte väldigt olika.

I den här artikeln går vi igenom processen ett 3D-spel som krävs för att producera en grundläggande bild för en bildskärm eller TV att Visa. Vi börjar med slutresultatet och fråga oss: ”vad jag tittar på”?

Därifrån kommer vi att analysera varje steg som utförs för att få den bilden vi ser. Längs vägen, kommer vi att täcka snyggt saker som hörn och pixlar, texturer och passerar, buffertar och skuggning, samt programvara och instruktioner. Vi tar också en titt på där grafikkortet passar in i allt detta och varför det behövs. Med denna 101, du titta på dina spel och PC i ett nytt ljus och uppskatta dessa grafik med lite mer beundran.

Aspekter av en frame: pixlar och färger

Låt oss skjuta upp ett 3D-spel, så vi har något att börja med och utan anledning annat än det är nog det mest meme-värdig spelet alla tid, vi använder Crytek’s 2007 release Crysis. I bilden nedan, letar vi efter en kamera skott av bildskärmen visar spelet.

Denna bild är vanligtvis kallas en ram, men vad exakt är det som vi tittar på? Tja, genom att använda en kamera med ett makroobjektiv, snarare än en i spelet skärmdump, kan vi göra en plats av CSI: TechSpot och efterfrågan någon förbättrar det!

Tyvärr skärm bländning och bakgrundsbelysning är i vägen i bilden detalj, men om vi förbättra det bara lite mer…

Vi kan se att ramen på bildskärmen består av ett rutnät av individuellt färgade element och om vi ser riktigt nära, block själva är byggd av 3 mindre bitar. Varje triplett kallas en pixel (kort för picture element) och majoriteten av bildskärmar måla dem med tre färger: röd, grön och blå (aka RGB). För varje ny bildruta som visas på skärmen, en lista över tusentals, om inte miljontals, av RGB måste värden utarbetas och lagras i en del av minnet som bildskärmen kan komma åt. Sådana block av minne kallas buffertar, så naturligt bildskärmen ges innehållet i något som kallas en rambuffert.

Det är faktiskt slutpunkten som vi börjar med, så nu måste vi gå till början och gå igenom processen att komma dit. Namn rendering används ofta för att beskriva detta, men verkligheten är att det är en lång lista av länkade men separata faser, som är helt olika varandra, när det gäller vad som händer. Tänk på det som som att vara en kock och göra en måltid värdig en Michelin restaurang: slutresultatet är en platta av god mat, men mycket behöver göras innan du kan stoppa i. Och precis som med matlagning, rendering måste vissa grundläggande ingredienser.

De byggstenar som behövs: modeller och texturer

De grundläggande byggstenarna för alla 3D-spel är de visuella tillgångar som befolkar världen ska återges. Filmer, TV program, teateruppsättningar och liknande, alla behöver aktörer, kostymer, rekvisita, backdrops, ljus – listan är ganska stor. 3D-spel är inte annorlunda och allt sett i en genererad ram kommer har utformats av konstnärer och modellbyggare. För att visualisera detta, låt oss gå gamla skolan och ta en titt på en modell från id Softwares Quake II:

Lanserades för över 20 år sedan, var Quake II en teknisk tour de force, även om det är rättvist att säga att, som alla 3D spel två decennier gamla, modellerna ser något kantiga. Men detta gör att vi lättare se vad denna tillgång är gjord av.

I den första bilden, kan vi se att den chunky fella byggs ut anslutna trianglar – hörnen av varje kallas hörn eller vertex för en av dem. Varje vertex fungerar som en punkt i rummet, så kommer att ha minst 3 siffror för att beskriva det, nämligen x, y, z-koordinater. Dock ett 3D spel behöver mer än detta, och varje brytpunkt kommer ha några ytterligare värden, till exempel färgen på vertex, riktning det står inför i (Ja, punkter inte kan faktiskt möta någonstans… bara rulla med det!), hur glänsande det är, om det är genomskinlig eller inte, och så vidare.

En specifik uppsättning värden som hörn har alltid har att göra med textur kartor. Detta är en bild av ‘kläder’ modellen har att bära, men eftersom det är en platt avbildning, kartan måste innehålla en vy för varje möjligt riktning vi kan sluta titta på modell från. I vår Quake II exempel, kan vi se att det är bara en ganska grundläggande strategi: framsidan, baksidan och sidorna (på armarna). Ett modernt 3D-spel kommer att faktiskt ha flera texturscheman för modeller, varje fullpackad av detalj, med ingen bortkastad tomt utrymme i dem; vissa av kartorna inte ser ut material eller funktionen, men i stället ge information om hur ljuset kommer att studsa ytan. Varje vertex kommer att ha en uppsättning koordinater i modellens associerade textur karta, så att det kan vara ‘sydd’ på hjässan – detta innebär att om brytpunkten flyttas någonsin, texturen flyttas med den.

Så i en 3D-renderade världen, börjar allt sett som en samling av hörn och textur kartor. De samlas i minnesbuffertar som länkar samman–en vertex-bufferten innehåller information om hörn; ett index-bufferten berättar hur formhörnen ansluter till form former; en resurs-bufferten innehåller texturer och delar av minnet som avsatts för att användas senare i renderingsprocessen; en kommandobufferten listan över instruktioner om vad man ska göra med allt.

Här alla former krävs ramen som kommer att användas för att skapa det slutliga rutnätet av färgade bildpunkter. För vissa spel, kan det vara en enorm mängd data eftersom det skulle vara mycket långsam att återskapa buffertar för varje ny bildruta. Spel lagra antingen all information som behövs för att bilda hela världen som potentiellt kunde ses, i buffertar eller store nog att täcka ett brett utbud av visningar och sedan uppdaterar du det som krävs. Exempelvis en racingspel som F1 2018 kommer att ha allt i en stor samling av buffertar, medan en öppen värld-spel, såsom Bethesda Skyrim, kommer att flytta data till och från buffertar, som kameran rör sig över världen.

Ställa ut scenen: vertex scenen

Med all visuell information till hands, kommer ett spel då påbörjas processen med att få det visuellt visas. Till att börja med börjar scenen i en standardposition, med modeller, lampor, etc, alla placerade på ett grundläggande sätt. Detta skulle vara ram ‘zero’–startpunkten av grafik och ofta visas inte bara bearbetas för att få saker och ting. För att bidra till att visa vad som händer med den första etappen av renderingsprocessen, använder vi ett online-verktyg på webbplatsen Real-Time Rendering. Låt oss öppna upp med en mycket grundläggande ‘spelet’: en kub på marken.

Denna särskilda form innehåller 8 hörn, var och en beskrivs via en lista med tal, och mellan dem de gör en modell bestående av 12 trianglar. En triangel eller ens en hela objektet är känd som en primitiv. När dessa primitiver flyttas, roteras och skalade, siffrorna körs genom en sekvens av matematiska operationer och uppdatera.

Observera att modellens punktnummer inte har ändrats, bara de värden som indikerar att där det är i världen. Som täcker matematiska inblandade är utanför ramen för denna 101, men den viktigaste delen av denna process är att det handlar om att flytta allt till där det måste vara första. Sedan är det dags för en lätt färg.

Låt oss använda en annan modell, med mer än 10 gånger mängden formhörn tidigare kub hade. Den mest grundläggande typen av färgbehandling tar färgen på varje vertex och sedan beräknar hur ytan av ytan förändras mellan dem; Detta kallas interpolation.

Att ha fler hörn i en modell hjälper inte bara för att ha en mer realistisk tillgång, men det ger också bättre resultat med färg interpolering. I detta skede av sekvensen rendering, kan effekten av lampor i scenen utforskas i detalj; exempelvis kan hur modellens material reflekterar ljuset, införas. Sådana beräkningar behöver beakta position och riktning på kameran Visa världen, samt position och riktning av lamporna.

Det finns en hel rad olika matematiska metoder som kan användas här; några enkla, vissa mycket komplicerade. I ovanstående bild, kan vi se att processen till höger ger trevligare ute och mer realistiska resultat, men inte överraskande, det tar längre tid att träna.

Det är värt att notera på denna punkt att vi tittar på objekt med ett lågt antal hörn jämfört med en banbrytande 3D-spel. Gå tillbaka lite i denna artikel och titta noga på bilden av Crysis: det finns över en miljon trianglar i att en scen ensam. Vi kan få en visuell känsla av hur många trianglar är knuffas i ett modernt spel med hjälp av Unigine’s Valley riktmärke (ladda ner).

Varje objekt i denna bild är modellerad av brytpunkter sammankopplade, så de gör primitiver som består av trianglar. Riktmärket tillåter oss att köra en wireframe-läge som gör programmet göra kanterna på varje triangel med en ljus vit linje.

Träd, växter, stenar, marken, bergen–alla av dem byggda av trianglar, och varenda en av dem har beräknats för dess position, riktning och färg – alla med hänsyn till placeringen av ljuskällan, och position och riktning av den kameran. Alla ändringar som gjorts till hörn måste matas tillbaka till spelet, så att den vet där allt är för nästa bildruta att göras; Detta görs genom att uppdatera vertex-bufferten.

Förvånansvärt ändå, detta är inte den hårda delen av renderingsprocessen och med rätt hårdvara, det är alla färdiga i bara några tusendelar av en sekund! På nästa steg.

Att förlora en dimension: rastrering

Efter samtliga formhörnen har arbetats igenom och våra 3D-scen slutförs när det gäller där allt är tänkt för att vara, renderingsprocessen flyttar till en mycket betydande scenen. Fram till nu, spelet har varit verkligt 3 dimensionell men den sista bildrutan är inte – som innebär att en sekvens av förändringar måste ske för att konvertera visade världen från en 3D-rymd som innehåller tusentals anslutna punkter i en 2D duk av separata färgade bildpunkter. För de flesta spel, denna process omfattar minst två steg: skärmen utrymme projectionand rastrering.

Med verktyget web rendering igen, kan vi tvinga den att visa hur världen volymen först förvandlas till en platt avbildning. Placeringen av kameran, som tittar på 3D-scenen, är det långt kvar; de linjer som förlängs från denna punkt skapa vad som kallas en frustum (ungefär som en pyramid på sin sida) och allt inom frustum kunde potentiellt visas i den sista bildrutan. En bit in i frustum är visningsområdet – detta är i huvudsak vad bildskärmen kommer att visa, och en hel bunt med matematik används för att projicera allt inom frustum på visningsområdet, ur kameran.

Även om grafiken på visningsområdet visas 2D, data inom fortfarande faktiskt är 3D- och denna information används sedan för att räkna ut vilken primitiver kommer vara synlig eller överlappar varandra. Detta kan vara förvånansvärt svårt att göra eftersom en primitiv skulle kasta en skugga i spelet som kan ses, även om Primitivet inte. Borttagning av primitiver kallas cullingand kan göra en betydande skillnad för hur snabbt hela ramen återges. När detta har alla gjorts – sortering de synliga och osynliga primitiver, binning trianglar som ligger utanför frustum, och så vidare–stängs den sista etappen av 3D och ramen blir fullt 2D genom rastrering.

Bilden ovan visar ett mycket enkelt exempel på en ram som innehåller en primitiv. Rutnätet som ramens pixlar gör jämförs med kanterna på formen under, och där de överlappar varandra, en pixel markeras för bearbetning. Beviljade i slutet resultatet i exemplet ser inte mycket lik den ursprungliga triangeln men det beror på att vi inte använder tillräckligt pixlar. Detta har resulterat i ett problem som kallas aliasing, även om det finns gott om sätt att hantera detta. Därför ändrar upplösning (det totala antalet pixlar används i ramen) av ett spel har en sådan stor inverkan på hur det ser ut: inte bara representerar pixlar bättre form av primitiva men det minskar effekten av de oönskade aliasing.

När denna del av sekvensen rendering är gjort, är det på att den stora en: den slutliga färgen av alla pixlar i bilden.