I denne andre delen, der vi tar en mer grundig titt på 3D-spilloppretting, vil vi fokusere på hva som skjer med 3D-verdenen når hele hjørneprosessen er fullført. Vi må støve av mattebøkene våre igjen, håndtere geometrien til frustrasjon og tenke på perspektivpuslespillet. Vi tar også et raskt dykk i strålesporing, belysning og materialets fysikk - perfekt!

Hovedtemaet i denne artikkelen er et viktig trinn i gjengivelse, der den tredimensjonale verden av prikker, linjer og trekanter blir et todimensjonalt rutenett av fargede blokker. Dette er noe som bare 'skjer' fordi prosessene i 3D-2D-endring er usynlige, vår forrige artikkel her kunne vi umiddelbart se effekten av hjørnskygger og mosaikker. Hvis du ikke er klar for alt dette, ikke bekymre deg - du kan komme i gang. 3D-spillrendering 101. Les videre for vår neste titt på 3D-grafikkverdenen når den er satt.

Forbereder seg på to dimensjoner

De fleste av dere vil se dette nettstedet på en helt flat skjerm eller smarttelefonskjerm; Selv om du er kul og rolig med barna, og du har en fancy buet skjerm, består bildene den viser av et flatt rutenett med fargede piksler. Likevel ser bildene ut til å være 3D når du spiller Call of Mario: Deathduty Battleyard. Objekter beveger seg inn og ut av miljøet når de kommer inn og ut av kameraet.

Bruker Bethesda Nedfall 4 Som et eksempel fra 2014 kan vi enkelt se hvordan hjørner håndteres for å skape en følelse av dybde og avstand, spesielt hvis du kjører i trådrammemodus (ovenfor).




Hvis du velger et 3D-spill i dag eller de siste tjue årene, vil nesten hver og en av dem utføre den samme rekkefølgen av hendelser for å forvandle 3D-verdenen av hjørner til et 2D-pikselarray. Navnet på prosessen som gjorde endringen kalles vanligvis pixelasjon men dette er bare ett av mange trinn i det hele.




Vi må bryte ned noen av de forskjellige trinnene og studere teknikkene og matematikken som brukes, og vi vil bruke sekvensen som brukes av Direct3D for å undersøke hva som skjer for referanse. Bildet nedenfor viser hva som er gjort med hver topp i verden:







Hva ble gjort på verdensrommet? Del 1 artikkel: Her blir hjørnene transformert og farget ved hjelp av flere matriseberegninger. Vi hopper over neste avsnitt fordi det eneste som skjer for kameraområdet er at de konverterte hjørnene justeres etter flytting for å gjøre kameraets referansepunkt.

De neste trinnene er avgjørende for å hoppe over fordi de er helt kritiske for overgangen fra 3D til 2D - gjort riktig, og hjernen vår vil se på en flatskjerm, men 'se' en scene med dybde og skala - gjort feil og ting vil se veldig rart ut!




Alt er et spørsmål om perspektiv

Det første trinnet i denne sekvensen innebærer å definere synsfeltet sett av kameraet. Dette gjøres først ved å justere vinklene for det horisontale og vertikale synsfeltet - førstnevnte kan ofte endres i spill fordi folk har bedre side-til-side perifert syn enn opp og ned.

Vi kan forstå dette fra dette bildet som viser feltet for menneskelig syn:




To synsvinkler (fov for kort), frustum - en 3D-firkantbasert pyramide som kommer ut av kameraet. Første vinkel vertikal fov, den andre horisontal en; vi vil bruke symboler α ve β for å vise dem. Nå ser vi ikke verden nøyaktig slik, men det er mye lettere å jobbe med et frustum enn å prøve å skape et realistisk bildevolum.

To andre innstillinger må også defineres - nær (eller foran) og langt (bak) posisjon utklippsfly. Den første kutter toppen av pyramiden, men bestemmer hovedsakelig hvor nær kameraet er posisjonen der noe ble tegnet; det andre gjør det samme, men definerer hvor langt primitiver skal fjernes fra kameraet.

Størrelsen og posisjonen til det nærmeste klippeplanet er viktig fordi dette er Utsikt,. Dette er faktisk det du ser på skjermen, dvs. gjengitt ramme, og i de fleste grafiske APIer blir visningen 'tegnet' fra øverste venstre hjørne. På bildet nedenfor vil punktet (a1, b2) være kilden til planet, og bredden og høyden på planet måles herfra.

størrelsesforholdet Akkurat som perspektivet er veldig viktig for hvordan den skapte verden vil se ut, må den også matche skjermformatet. I mange år er dette alltid 4: 3 (eller 1,3333 ... i desimal). I dag har de fleste av oss widescreen- og ultra widescreen-spill som 16: 9 eller 21: 9.

Koordinatene til hvert toppunkt i kameraområdet må transformeres slik at de alle passer inn i det nærmeste klippeplanet som vist nedenfor:

Transformasjonen skjer ved hjelp av en annen matrise - til denne perspektiv projeksjonsmatrise. I vårt eksempel nedenfor bruker vi avlingsområdet og posisjonene til klippeplanene til å transformere; vi kan bruke dimensjonene til visningsområdet i stedet.

Toppunktposisjonsvektoren multipliseres med denne matrisen og gir et nytt transformert koordinatsett.

Et voila! Vi har nå skrevet alle hjørnene våre slik at den opprinnelige verden nå fremstår som et tvunget 3D-perspektiv, slik at primitiver nær pre-clipping-planet ser større ut enn de i nærheten av det fjerne planet.

Selv om visningsstørrelsen og synsfeltets vinkler er avhengige av hverandre, kan de behandles individuelt - med andre ord, du kan ha frustum for å gi et annet klippeplass basert på størrelsen og sideforholdet til visningen. For at dette skal skje, kreves det et ekstra trinn i kjeden, der hjørnene i det nærmeste klippeplanet må resirkuleres for å gjøre rede for forskjellen.

Dette kan imidlertid føre til forvrengning i perspektivet som vises. bruk Bethesdas 2011-spill Skyrim, kan vi se hvordan den horisontale synsvinkelen justeres βhar en betydelig innvirkning på scenen og samtidig opprettholde samme bildeforhold:

I dette første bildet, β = 75 ° og scenen ser helt normal ut. La oss prøve nå β = 120°:

De to forskjellene er umiddelbart åpenbare - først og fremst kan vi se mye mer til sidene av vår "visjon" nå, og for det andre, gjenstander vises nå mye lenger borte (spesielt trær). Imidlertid er den visuelle effekten av vannoverflaten foreløpig ikke synlig, og dette er fordi prosessen ikke var designet for dette synsfeltet.

Anta nå at karakteren vår har fremmede og øye-lignende øyne. β = 180°!

Dette synsfeltet gir oss en nesten panoramautsikt, men på bekostning av alvorlig forvrengning av objekter som er opprettet ved utsikten. Igjen, dette er fordi spilldesignerne ikke planla og lage spillets eiendeler og visuelle effekter for dette synspunktet (standardverdien er rundt 70 °).

Kameraet ser ut til å ha flyttet seg inn i bildene ovenfor, men det skjedde ikke - alt som skjedde er at formen på frustumet mitt ble endret, noe som omformet dimensjonene til det nærmeste klippeplanet. I hvert bilde forble visningsforholdet det samme, så det ble brukt en skaleringsmatrise på hjørnene for å montere alt.

Så, er du inne eller ute?

Etter at alt er transformert riktig i projeksjonsfasen, går vi videre til det som kalles klippområdet. Selv om dette er gjort Deretter projeksjon er lettere å visualisere hva som skjer hvis vi gjør det før:

I diagrammet vårt ovenfor kan vi se at gummiand, en av flaggermusene og noen trær er trekanter i frustum; Imidlertid er den andre flaggermusen, det lengste treet og pandaen utenfor frustumet. Selv om hjørnene som utgjør disse gjenstandene allerede er maskinert, vises de ikke i visningsområdet. Dette betyr forkortet.

In frustum beskjæringAlle prinsipper unntatt frustum fjernes fullstendig, og primitivene som finnes i noen av grensene blir omformet til nye primitiver. Beskjær, inntil dette punktet, alle usynlige hjørneskygger osv. Det er egentlig ikke et ytelsesløft, siden det er utført via. Selve utklippsfasen kan også hoppes over om nødvendig, men dette støttes ikke av alle API-er (for eksempel tillater ikke standard OpenGL deg å hoppe over dette, men det er mulig å gjøre det ved hjelp av en API-utvidelse).

Det skal bemerkes at plasseringen til det eksterne klippeplanet ikke nødvendigvis er den samme. tegningsavstand I spill styres sistnevnte av selve spillmotoren. Alt annet motoren vil gjøre frustum slakt - her blir koden utført for å bestemme om et objekt vil være i frustum og / eller for å påvirke noe som vil være synlig; Hvis svaret er noDette objektet sendes ikke for opprettelse. Dette er ikke det samme som skuffelse, fordi selv om de primitive elementene av frustrasjon har falt av, går de gjennom topp behandlingsfasen. Med subtraksjon blir de ikke behandlet i det hele tatt, noe som sparer ganske mye ytelse.

Nå som vi har gjort all vår transformasjon og trimning, ser hjørnene endelig klare for neste trinn i hele gjengivelsessekvensen. De er ikke ute av det. Dette er fordi all matematikk som utføres i toppunktmanipulering og verdens-til-klipp-romoperasjoner, må gjøres med et homogent koordinatsystem (dvs. hvert toppunkt har 4 komponenter i stedet for 3). Visningen er imidlertid fullstendig 2D, så informasjonen om API-toppunktet er bare x, y (dybdeverdi z er bevart skjønt).

For å bli kvitt den fjerde komponenten, perspektivseksjon hver komponent w verdi. Denne innstillingen låser verdiområdet x ve y [-1,1] kan ta og z [0,1] rekkevidde - disse kalles normaliserte enhetskoordinater (NDCs for kort).

Hvis du vil vite mer om hva vi nettopp dekket, og gjerne gleder deg over mye mer matematikk, er Song Ho Ahns utmerket opplæring Om emnet. La oss konvertere disse hjørnene til piksler!

Raster mester

Som med transformasjoner, vil vi se på hvordan Direct3D setter reglene og handlingene for å gjøre visningsområdet til et pikselrutenett. Dette rutenettet er som et regneark med rader og kolonner der hver celle inneholder flere dataverdier (farge, dybdeverdier, teksturkoordinater, etc.). Vanligvis dette rutenettet raster og prosessen med å produsere den pixelasjon. Vår 3D-gjengivelse 101 artikler, fikk vi en veldig forenklet oversikt over prosedyren:

Bildet over gir inntrykk av at primitivene bare ble kuttet i små blokker, men det er mye mer til det. Det første trinnet er å forstå om en primitiv faktisk ser på kameraet - i et tidligere bilde av denne artikkelen er primitivene som utgjorde baksiden av den grå kaninen, og viser for eksempel skuffelse. Så det er ikke nødvendig å lage dem, selv om de ligger i synsfeltet.

Med diagrammet nedenfor kan vi grovt forstå hvordan dette ser ut. Kuben gikk gjennom flere transformasjoner for å sette 3D-modellen i 2D-visningsrom, og i kameraets syn er noen av kubens ansikter ikke synlige. Forutsatt at ingen av overflatene er gjennomsiktige, kan noen av disse primitivene ignoreres.

Direct3D'de bu, sisteme behandlingsstatus vil være og denne instruksjonen vil fortelle fjerningen (aka kast) for hver primitive frontvendte eller bakovervendte side (eller ikke være blind i det hele tatt - for eksempel, trådramme modus). Så hvordan vet han hva fronten eller baksiden er? Når vi ser matematikk i hjørnebearbeidingVi har sett at trekanter (eller har flere hjørner) har normale vektorer som forteller systemet hvilken retning den vender. Med denne informasjonen kan en enkel sjekk gjøres, og hvis den primitive sjekken mislykkes, vil den bli fjernet fra generasjonskjeden.

Deretter er det på tide å begynne å implementere pikselrutenettet. Igjen er dette overraskende komplisert fordi hvis en piksel passer helt inn i en primitiv - helt, delvis eller i det hele tatt - må systemet fungere. Å gjøre dette, omfangstest ferdig. Bildet nedenfor viser hvordan trekanter rastreres i Direct3D 11:

Regelen er ganske enkel: Hvis pikselsenteret overstiger det Microsoft sier, anses pikslet å være i en trekant. 'øverst til venstre' -regel. Den 'øverste' delen er en horisontal linjekontroll; piksel sentrum on denne linjen. Den "venstre" delen er for ikke-horisontale linjer, og midten av pikselet må falle til venstre for en slik linje. Det er flere regler for ikke-primitiver, dvs. enkle linjer og punkter, og hvis regler får ekstra betingelser multisampling'i er ansatt.

Hvis vi ser nøye på bildet i Microsofts dokumentasjon, kan vi se at figurene som er opprettet av piksler ikke er veldig like de opprinnelige primitivene. Dette er fordi pikslene er for store til å danne en realistisk trekant - rasteren inneholder utilstrekkelig data om de originale objektene og overlapping.

La oss bruke UL Benchmarks 3DMark03 Slik ser du aliaset i behandlingen:

I det første bildet er skannestørrelsen satt til en veldig lav verdi på 720 x 480 piksler. Overlapping er tydelig synlig på rekkverket, og skyggen kaster våpenet som holdes av toppsoldaten. Sammenlign dette med det du får med en skanning med 24 ganger flere piksler:

Her kan vi se at kallenavnet på rekkverket og skyggen er helt borte. Det kan virke som en større skanningsbane hver gang, men dimensjonene til rutenettet må støttes av skjermen som rammen skal vises på, og disse pikslene må behandles etter rasterisering. å være en åpenbar ytelsesstraff.

Dette er hvor flersampling kan hjelpe, og det fungerer slik i Direct3D:

I stedet for å sjekke om et pikselsenter oppfyller rasteriseringsreglene, flere steder (subpikseleksempler eller delprøver) blir testet i hver piksel, og hvis noen av dem er passende, utgjør den pikslen en del av formen. Dette kan ikke hjelpe og til og med gjøre aliaset verre, men når flersampling brukes, er hvilke delprøver dekket av primitivet og resultatene av pikselbehandling lagres i en buffer i minnet.

Denne bufferen brukes deretter til å blande delprøven og pikseldata slik at de primitive kantene blir mindre blokkerte. Vi tar en titt på hele den fastlåste situasjonen igjen i en senere artikkel, men foreløpig er dette hva multi-sampling kan gjøre når det brukes i noen få piksler:

Vi kan se at mengden anti-aliasing på kantene til de forskjellige formene er sterkt redusert. En større raster er definitivt bedre, men ytelsestreffet kan støtte bruken av multi-sampling i stedet.

Alt annet som kan gjøres i rasteriseringsprosessen okklusjonstest. Dette må gjøres fordi synsfeltet vil være fullt av primitiver som vil overlappe (blokkert) - for eksempel, i bildet over, overlapper trekantene på forsiden som utgjør solideri i forgrunnen med de samme trekanter på den andre soldaten. I tillegg til å sjekke om en primitiv dekker en piksel, kan de relative dybdene også sammenlignes, og hvis den ene er bak den andre, kan den utelates fra resten av gjengivelsesprosessen.

Imidlertid, hvis den nærmeste primitive er gjennomsiktig, vil den andre fremdeles være synlig, selv om den ikke klarer okklusjonskontrollen. Derfor gjør nesten alle 3D-motorer okklusjonskontroller i forkant av Sende noe til GPU og i stedet Z-tampong som en del av skapelsesprosessen. Dette er hvor rammen normalt blir gjengitt, men GPU lagrer bare dybdeverdier i stedet for å lagre de endelige pikselfargene i minnet. Dette kan deretter brukes i skyggeleggere for å kontrollere synligheten med større kontroll og presisjon over aspekter som involverer objektoverlapping.

I bildet over, jo mørkere fargen på pikselet er, desto nærmere objektet er kameraet. For å lage z-bufferen opprettes rammen en gang, og deretter gjenoppbygges, men denne gangen når pikslene behandles, kjøres en skyggeliste for å sjekke dem mot verdiene i z-bufferen. Hvis den ikke er synlig, plasseres ikke denne pikselfargen i den endelige rammebufferen.

For nå, det virkelige siste trinnet toppunktattributt interpolasjon - i vårt første forenklede diagram var primitivet en komplett trekant, men husk at utsikten er fylt med hjørnene i figurene, ikke selve formen. Så systemet må finne ut hvordan primitivens farge, dybde og tekstur er mellom hjørnene, og det heter det. interpolasyon. Som du kan forestille deg, er dette ikke en enkel beregning, men en annen beregning.

Selv om den rasteriserte skjermen er 2D, representerer strukturene inni et tvunget 3D-perspektiv. Hvis linjene virkelig var todimensjonale, en enkel lineær forskjellige farger og så videre når du går fra en topp til en annen. Men på grunn av 3D-aspektet av scenen, må interpolering ta perspektiv i betraktning - Simon Yeung'un muhteşem blogg for å få mer informasjon om prosessen.

Her går vi - 3D-verdenen av hjørner blir et 2D-rutenett av fargede blokker. Likevel er vi ikke ferdig mye.

Alt fra front til bak (bortsett fra når det ikke er der)

Før vi ser på rasterisering, må vi si noe om rekkefølgen på gjengivelsen. For eksempel snakker vi ikke om hvor tessellasjonen kom fra etter tur; i stedet snakker vi om rekkefølgen til primitivene. Objekter behandles ofte i den rekkefølgen de vises i katalogbufferen (minneblokken som forteller systemet hvordan hjørnene er gruppert), og dette kan ha en betydelig innvirkning på hvordan gjennomsiktige objekter og effekter håndteres.

Dette skyldes at primitivene blir behandlet en etter en, og hvis du gjør de første først, er ingen bak dem synlige (dette er hvor okklusjonssortering virkelig spiller inn). og kan tas ut av drift (hjelper ytelse) - dette er vanligvisfra fremsiden til baksiden krever at opprettelse og katalogbuffering bestilles på denne måten.

Imidlertid, hvis noen av disse primitivene rett foran kameraet er gjennomsiktige, vil gjengivelse fra bak til bak resultere i tapte gjenstander bak den gjennomsiktige. En løsning er å gjøre alt fra forsiden til baksiden, med gjennomsiktige primitiver og effekter som gjøres sist.

Så alle moderne spill gjengis rygg mot rygg, ikke sant? Hvis det ikke er nyttig - husk at hver primitive gjengivelse vil ha en mye høyere ytelseskostnad enn det bare kan sees. Det er andre måter å adressere gjennomsiktige objekter på, men generelt er det ingen løsning som passer alle sammen, og hver situasjon må håndteres på en unik måte.

Dette oppsummerer i utgangspunktet fordeler og ulemper med rasterisering - i moderne maskinvare er det veldig raskt og effektivt, men det er fortsatt en tilnærming til det vi ser. I den virkelige verden absorberer, reflekterer og reflekterer hvert objekt lys, og alt dette har en effekt på scenen som blir sett på. Vi får et raskt, men grovt resultat ved å dele verden i primitive og bare lage noen av dem.

Hvis det bare var en annen måte ...

Der is En annen måte: strålesporing

For omtrent to tiår siden utviklet en datavitenskapsmann ved navn Arthur Appel et system for å lage bilder på en datamaskin slik at en enkelt stråle med rett lys ble kastet fra kameraet til den traff en gjenstand. Derfra endrer egenskapene til materialet (farge, reflektivitet osv.) Deretter intensiteten til lysstrålen. Hver piksel i det gjengitte bildet vil ha en strålekast og en algoritme vil bli utført for å dekode pikselens farge ved å gå gjennom en matematisk sekvens. Appels prosess Skinnestøping.

Omtrent 10 år senere, en annen forsker John Whitted Han utviklet en matematisk algoritme som var den samme som Appels tilnærming, men når strålen treffer et objekt, ville det generere flere bjelker som ville bli avfyrt i forskjellige retninger, avhengig av objektets materiale. Siden dette systemet ville generere nye stråler for hver objektinteraksjon, var algoritmen rekursiv og derfor mye mer beregningsmessig vanskelig; det hadde imidlertid en betydelig fordel i forhold til Appels metode, da den riktig kunne forklare refleksjon, refraksjon og skyggelegging. Navnet på denne prosedyren er: Strålesporing (for å være ærlig, bakover strålesporing, som vi følger strålen fra kameraet, ikke objektet) og den hellige gral for datagrafikk og filmer siden den tiden.

Navnet på denne prosedyren var strålesporing (bakoverstråling, strengt tatt fordi vi sporer stråler fra kameraet i stedet for fra gjenstander) og har vært den hellige gralen for datagrafikk og filmer siden den gang.

På bildet over kan vi få en ide om Whitteds arbeid med algoritmen. En stråle sendes ut fra kameraet for hver piksel i rammen og beveger seg til den når overflaten. Denne spesielle overflaten er gjennomsiktig, så lyset reflekteres og brytes gjennom den. I begge tilfeller genereres sekundære stråler og går ut til de samhandler med en overflate. Det er også et ekstra sekundært som tar hensyn til fargen på lyskildene og skyggene de lager.

Den rekursive delen av prosessen er at sekundære bjelker kan genereres hver gang en ny støpejern krysser en overflate. Dette kan lett komme ut av kontroll, så antall genererte sekundære bjelker er alltid begrenset. Når en bjelkebane er fullført, beregnes fargen ved hvert terminalpunkt i henhold til materialegenskapene til overflaten. Denne verdien overfører deretter strålen til den forrige, og justerer fargen på denne overflaten og så videre til den når det effektive utgangspunktet (piksel i rammen) til primærstrålen.

Dette kan være ekstremt komplisert, og til og med enkle scenarier kan skape en beregningsterskel å gå gjennom. Heldigvis kan noen ting gjøres for å hjelpe - en ville være å bruke spesialdesignet maskinvare for å øke hastigheten på de spesielle matteoperasjonene, akkurat som for å gjøre matrismatematikk i hjørnebehandling (mer på et øyeblikk)). En annen kritisk ting er å øke hastigheten på prosessen med å jobbe på hvilket objekt en stråle treffer og nøyaktig hvor den er på overflaten av objektet der den krysser - noe som kan være overraskende hvis objektet er laget av et stort antall trekanter. vanskelig å gjøre:

I stedet for å teste hver trekant, blir det opprettet en liste over grensevolum (BV) i hvert objekt før strålesporing - dette er ikke annet enn kuboider som omgir objektet i spørsmålet, og disse er suksessivt mindre for de forskjellige strukturene i den. gjenstand.

For eksempel vil den første BV være for hele kaninen. Det neste paret er hodet, bena, torso, halen osv. hver av disse så små strukturer i hodet, etc. Det vil være en ny samling volumer for hvert, og det endelige volumnivået inneholder et lite antall trekanter som skal testes. Alle disse volumene ordnes deretter i en ordnet liste ( BV hierarki eller BVH for kort), slik at systemet sjekker et relativt lite antall BV hver gang:

Selv om bruken av en BVH ikke teknisk fremskynder faktisk strålesporing, er opprettelsen av hierarkiet og den påfølgende søkealgoritmen generelt mye raskere enn å måtte sjekke om en stråle krysser en av de millioner av trekanter. I en 3D-verden.

Programmer som i dag mikser ve POV-Ray Bruk strålesporing med tilleggssporing (som fotonesporing og radio) for å lage svært realistiske bilder:

Det åpenbare spørsmålet å stille er om strålesporing er så bra, hvorfor bruker vi det ikke overalt? Svarene er på to områder: først og fremst produserer selv enkel strålesporing millioner av stråler som må beregnes om og om igjen. Systemet starter med bare en stråle per skjermpiksel, så med en oppløsning på bare 800 x 600 produseres det 480 000 primærstråler, som hver produserer flere sekundære stråler. Dette er seriøs virksomhet, selv for dagens stasjonære datamaskiner. Det andre problemet er at grunnleggende strålesporing faktisk ikke er veldig realistisk, og et antall ekstra, veldig komplekse ligninger må inkluderes for å være riktig.

Selv med moderne PC-maskinvare, er arbeidsmengden som kreves for å gjøre dette i sanntid for et nåværende 3D-spill utenfor omfanget. Vår 3D gjengi 101 I artikkelen hans så vi at det tok titalls sekunder å produsere et enkelt lavoppløsningsbilde på en referanseverdi for strålesporing.

Så hvordan gjorde den opprinnelige Wolfenstein 3D-bjelkelegging, kom tilbake i 1992, og hvorfor er det likt? Battlefield V ve Metro Migration, begge lansert i 2019, tilbyr strålesporingsfunksjoner? Raster eller stråler de? Svar: litt av begge deler.

En hybrid tilnærming for i dag og fremtiden

I mars 2018 kunngjorde Microsoft en ny API-utvidelse for Direct3D 12 kalt DXR (DirectX Raytracing). Dette var en ny kartlinje som kompletterte standard rasteriserings- og beregningsrørledninger. Tilleggsfunksjonalitet, skyggelegging, datastrukturer osv. Den ble levert ved introduksjonen, men krevde ingen spesiell maskinvarestøtte enn det som allerede kreves for Direct3D 12.

På samme konferanse for spillutviklere, Snakket om Microsoft DXRElectronic Arts snakket om dem Pica Pica Projesi - 3D-motoreksperiment ved bruk av DXR. De viste at strålesporing kan brukes, men de kan ikke brukes til hele gjengivelsesrammen. I stedet vil tradisjonelle rasteriseringsteknikker og beregningsteknikker brukes for det meste av arbeidet, DXR brukes til visse områder - noe som betyr at antallet genererte bjelker er mye mindre enn for hele scenen.

Denne hybridtilnærmingen har blitt brukt tidligere i mindre grad. For eksempel Wolfenstein 3D skinne avstøpning brukt for å løse hvordan den gjengitte rammen ser ut, men laget med en stråle per pikselkolonne, ikke per piksel. Dette kan fremdeles se veldig imponerende ut til jeg innså at spillet i utgangspunktet kjørte i en oppløsning på 640 x 480, så ikke mer enn 640 bjelker fungerte samtidig.

Det tidlige 2018-grafikkortet - som AMDs Radeon RX 580 eller Nvidias GeForce 1080 Ti - oppfylte absolutt maskinvarekravene for DXR, men selv med databehandlingsmuligheter var det noen misforståelser om at de ville være kraftige nok til å bruke DXR. meningsfullt.

Det endret seg litt i august 2018, da Nvidia lanserte sin nyeste GPU-arkitektur, kodenavnet Turing. Den kritiske funksjonen til denne brikken var noe som ble kalt RT-kjerner: spesielle logiske enheter for å øke hastigheten på stråle-til-trekantavskjæring og begrense volumhierarki (BVH) kryssberegninger. Disse to prosessene er tidkrevende arbeidsrutiner der et lys samhandler med trekanter som utgjør forskjellige gjenstander i en scene. Gitt at RT Cores er spesifikke for Turing-prosessoren, kan tilgang til dem bare gjøres via Nvidias proprietære API.

Det første spillet som støtter denne funksjonen er EAs Battlefield V og Da vi testet bruken av DXR, var vi imponert over forbedringene i vann-, glass- og metallrefleksjoner i spillet, men mindre imponert over de påfølgende ytelsestreffene:

For å være rettferdig forbedret senere oppdateringer seg noe, men det var (og er fortsatt) et stort fall i hastigheten som rammer gjengis med. Fram til 2019 har det dukket opp noen andre spill som støtter denne API-en og utfører strålesporing for bestemte deler i en ramme. Vi testet Metro Migration ve Tomb Raider Shadowog fant en lignende historie - DXR ville spesielt påvirke bildefrekvensen når den brukes mye.

Omtrent samtidig, UL Benchmarks han forklarte En DXR-funksjonstest for 3DMark:

Imidlertid viste vår gjennomgang av DXR-aktiverte spill og 3DMark-funksjonstesten at en ting er sikkert om strålesporing: i 2019 er det fortsatt seriøst arbeid for selv $ 1000 + -modellene for grafikkprosessoren. Betyr det at vi ikke har et reelt alternativ til rasterisering?

De nyeste funksjonene i 3D-grafikkteknologi for forbrukere er ofte veldig dyre, og den første støtten til nye API-funksjoner kan være ganske uberegnelig eller treg (som vi finner) Da vi testet Max Payne 3 I en serie Direct3D-utgivelser rundt 2012) - sistnevnte skyldes vanligvis spillutviklere som prøver å inkludere så mange avanserte funksjoner som mulig, noen ganger med begrenset erfaring.

Imidlertid, når topp- og pikselskyggelister, tessellation, HDR-gjengivelse og skjermplassens omgivelses okklusjon en gang var ganske krevende, bare egnet for avanserte GPUer, er deres bruk nå vanlig i spill og støttes av et bredt utvalg av grafikkort. Det samme gjelder for strålesporing og gitt tid, det blir bare en annen detaljinnstilling som er aktivert som standard for de fleste brukere.

Noen avsluttende tanker

Og så har vi kommet til slutten av vårt andre dypdykk, hvor vi ser nærmere på 3D-grafikkverdenen. Vi så på hvordan hjørnene på modeller og verdener ble flyttet fra 3D og forvandlet til et flatt, 2D-bilde. Vi har sett hvordan innstillinger for synsfelt skal vurderes og hvilken effekt de gir. Prosessen med å pikselere disse hjørnene er utforsket, og vi har avsluttet med en kort titt på en alternativ prosess til rasterisering.

Som før kunne vi ikke dekke alt, og vi kunne ikke se på noen få detaljer her og der - det er tross alt ikke en lærebok! Vi håper imidlertid at du lærte litt mer underveis og en ny fascinasjon for programmerere og ingeniører som virkelig mestrer matte og naturfag som trengs for å oppnå alt dette i dine favoritt 3D-titler.

Vi svarer gjerne på spørsmålene dine, så legg gjerne inn i kommentarfeltet. Til neste gang.

Masthead-kreditt: Monokrom rasterabstrakt av Aleksei Deep