In dit tweede deel, waar we dieper ingaan op het maken van 3D-games, zullen we ons concentreren op wat er met de 3D-wereld gebeurt als het hele hoekproces eenmaal is voltooid. We zullen onze wiskundeboeken weer moeten afstoffen, de geometrie van frustratie moeten aanpakken en nadenken over de perspectiefpuzzel. We zullen ook een korte duik nemen in ray tracing, verlichting en de fysica van materialen - perfect!

Het hoofdonderwerp van dit artikel is een belangrijke fase in het renderen, waarbij de driedimensionale wereld van punten, lijnen en driehoeken een tweedimensionaal raster van gekleurde blokken wordt. Dit is iets dat gewoon 'gebeurt' omdat de processen in 3D-2D-verandering onzichtbaar zijn, onze vorig artikel hier konden we onmiddellijk de effecten zien van hoekshaders en mozaïeken. Als u hier nog niet klaar voor bent, hoeft u zich geen zorgen te maken - u kunt aan de slag. 3D-spelweergave 101. Lees echter verder voor onze volgende blik op de 3D-grafische wereld als deze eenmaal is ingesteld.

Voorbereiden op 2 dimensies

De meesten van jullie zullen deze website op een volledig vlakke monitor of smartphonescherm bekijken; Zelfs als je cool en kalm bent met de kinderen en je hebt een mooie gebogen monitor, de afbeeldingen die worden weergegeven, bestaan ​​uit een plat raster van gekleurde pixels. Toch lijken de beelden 3D te zijn bij het spelen van Call of Mario: Deathduty Battleyard. Objecten bewegen in en uit de omgeving terwijl ze de camera binnenkomen en verlaten.

Bethesda gebruiken Fallout 4 Als voorbeeld uit 2014 kunnen we gemakkelijk zien hoe hoeken worden afgehandeld om een ​​gevoel van diepte en afstand te creëren, vooral als u in de wireframe-modus loopt (hierboven).




Als je een 3D-game van vandaag of van de afgelopen twintig jaar kiest, zullen ze bijna allemaal dezelfde reeks gebeurtenissen uitvoeren om de 3D-wereld van hoekpunten om te zetten in een 2D-pixelarray. De naam van het proces dat de wijziging heeft aangebracht, wordt meestal genoemd pixelatie maar dit is slechts een van de vele stappen in de hele zaak.




We zullen enkele van de verschillende fasen moeten opsplitsen en de gebruikte technieken en wiskunde moeten bestuderen, en we zullen de volgorde gebruiken die door Direct3D wordt gebruikt om te onderzoeken wat er aan de hand is ter referentie. De onderstaande afbeelding laat zien wat er met elke piek in de wereld is gedaan:







Wat werd er gedaan in het wereldruimtestadium Deel 1 artikel: Hier worden hoekpunten getransformeerd en gekleurd met behulp van meerdere matrixberekeningen. We slaan de volgende sectie over, omdat het enige voor het cameragebied is dat de geconverteerde hoeken worden aangepast nadat ze zijn verplaatst om het camera-referentiepunt te maken.

De volgende stappen zijn cruciaal bij het overslaan, omdat ze absoluut cruciaal zijn voor de overgang van 3D naar 2D - goed gedaan, en onze hersenen zullen naar een plat scherm kijken maar een scène met diepte en schaal 'zien' - verkeerd gedaan en de dingen zullen er heel vreemd uitzien!




Het is allemaal een kwestie van perspectief

De eerste stap in deze reeks omvat het definiëren van het gezichtsveld zoals gezien door de camera. Dit wordt eerst gedaan door de hoeken voor het horizontale en verticale gezichtsveld aan te passen - de eerste kan vaak worden gewijzigd in games omdat mensen een beter zij-aan-zij perifeer zicht hebben dan omhoog en omlaag.

We kunnen dit begrijpen aan de hand van deze afbeelding die het gezichtsveld van de mens toont:




Twee kijkhoeken (kortweg fov), afgeknot - een 3D-vierkante piramide die uit de camera komt. Eerste hoek verticaal fov, de tweede horizontaal een; we zullen symbolen gebruiken α ve β om ze te laten zien. Nu zien we de wereld niet precies zo, maar het is veel gemakkelijker om met een afgeknotte kegel te werken dan te proberen een realistisch beeldvolume te creëren.

Er moeten ook twee andere instellingen worden gedefinieerd - dichtbij (of voor) en ver (achter) positie knipvlakken. De eerste snijdt de top van de piramide, maar bepaalt vooral hoe dicht de camera is bij de positie waar iets is getekend; de tweede doet hetzelfde, maar geeft aan hoever primitieven van de camera verwijderd zullen worden.

De grootte en positie van het near-clipping-vlak is belangrijk omdat dit zo is Visie,. Dit is eigenlijk wat u op de monitor ziet, d.w.z. gerenderd frame en in de meeste grafische API's wordt de weergave 'getekend' vanuit de linkerbovenhoek. In de onderstaande afbeelding zal het punt (a1, b2) de bron van het vlak zijn en vanaf hier worden de breedte en hoogte van het vlak gemeten.

aspectverhouding Net zoals het perspectief erg belangrijk is voor hoe de gecreëerde wereld eruit zal zien, moet het ook overeenkomen met de beeldverhouding van de monitor. Jarenlang is dit altijd 4: 3 (of 1.3333 ... in decimaal). Tegenwoordig hebben de meesten van ons breedbeeld- en ultrabreedbeeldspellen zoals 16: 9 of 21: 9.

De coördinaten van elk hoekpunt in het cameragebied moeten worden getransformeerd zodat ze allemaal in het nabije uitknipvlak passen, zoals hieronder wordt weergegeven:

De transformatie wordt gedaan met behulp van een andere matrix - naar deze specifieke perspectief projectie matrix. In ons voorbeeld hieronder gebruiken we het bijsnijdgebied en de posities van de uitknipvlakken om te transformeren; we kunnen in plaats daarvan de afmetingen van de viewport gebruiken.

De hoekpuntpositievector wordt vermenigvuldigd met deze matrix en geeft een nieuwe getransformeerde set coördinaten.

En voila! We hebben nu al onze hoeken geschreven zodat de oorspronkelijke aarde nu verschijnt als een geforceerd 3D-perspectief, zodat primitieven nabij het pre-clipping-vlak groter lijken dan die nabij het verre vlak.

Hoewel de grootte van het zicht en de kijkhoek van elkaar afhankelijk zijn, kunnen ze afzonderlijk worden verwerkt - met andere woorden, je kunt afgeknot hebben om een ​​ander uitknipvlak te geven op basis van de grootte en de aspectverhouding van het zicht. Om dit te laten gebeuren, is een extra stap in de ketting vereist, waarbij de hoeken in het nabije snijvlak moeten worden gerecycled om het verschil te compenseren.

Dit kan echter vervorming in het weergegeven perspectief veroorzaken. gebruik Bethesda's spel Skyrim uit 2011kunnen we zien hoe de horizontale kijkhoek wordt aangepast βHet heeft een aanzienlijke impact op de scène met behoud van dezelfde beeldverhouding:

In deze eerste afbeelding, β = 75 ° en de scène ziet er volkomen normaal uit. Laten we het nu proberen β = 120°:

De twee verschillen zijn meteen duidelijk: ten eerste kunnen we nu veel meer zien aan de zijkanten van onze 'visie', en ten tweede verschijnen objecten nu veel verder weg (vooral bomen). De visuele impact van het wateroppervlak is momenteel echter niet zichtbaar en dit komt doordat het proces niet ontworpen is voor dit gezichtsveld.

Stel nu dat ons karakter buitenaardse en oogachtige ogen heeft. β = 180°!

Dit gezichtsveld geeft ons een bijna panoramisch zicht, maar dit gaat ten koste van ernstige vervorming van objecten aan de randen van het zicht. Nogmaals, dit komt doordat de game-ontwerpers de middelen en visuele effecten van de game niet hebben gepland en gemaakt voor dit gezichtspunt (de standaardwaarde is ongeveer 70 °).

De camera lijkt misschien te zijn bewogen in de bovenstaande afbeeldingen, maar het is niet gebeurd - het enige dat is gebeurd, is dat de vorm van mijn afgeknotte kegel is veranderd, waardoor de afmetingen van het nabije uitknipvlak zijn veranderd. In elke afbeelding bleef de aspectverhouding van de viewport hetzelfde, dus werd een schaalmatrix op de hoeken aangebracht om alles opnieuw te plaatsen.

Dus, ben je binnen of buiten?

Nadat alles correct is getransformeerd in de projectiefase, gaan we verder met wat wordt genoemd clip gebied. Hoewel dit is gebeurd Vervolgens projectie is gemakkelijker te visualiseren wat er gebeurt als we het eerder doen:

In ons diagram hierboven kunnen we zien dat de rubberen eend, een van de vleermuizen en sommige bomen driehoeken zijn in afgeknotte kegel; De andere vleermuis, de verste boom, en de panda bevinden zich echter buiten de afgeknotte kegel. Hoewel de hoeken waaruit deze objecten bestaan ​​al zijn bewerkt, verschijnen ze niet in de viewport. Dit betekent verkort.

In afgeknot bijsnijdenAlle principes behalve afgeknot kommetje worden volledig verwijderd en de primitieven die in een van de grenzen worden gevonden, worden omgevormd tot nieuwe primitieven. Snijd tot nu toe alle onzichtbare hoeken, hoekshaders enz. Het is niet echt een prestatieverbetering, omdat het wordt uitgevoerd via. De clipping-fase zelf kan indien nodig ook worden overgeslagen, maar dit wordt niet door alle API's ondersteund (de standaard OpenGL staat je bijvoorbeeld niet toe om dit over te slaan, maar het is wel mogelijk om dit te doen met een API-extensie).

Opgemerkt moet worden dat de locatie van het op afstand gelegen uitknipvlak niet noodzakelijk dezelfde is. afstand tekenen In games wordt dit laatste bestuurd door de game-engine zelf. Al het andere zal de motor doen afgeknot ruimen - hier wordt de code uitgevoerd om te bepalen of een object afgeknot zal zijn en / of iets dat zichtbaar zal zijn, te beïnvloeden; Als het antwoord is noDit object is niet verzonden om te worden gemaakt. Dit is niet hetzelfde als het bijsnijden van teleurstellingen, want hoewel primitieve items uit frustratie eraf zijn gevallen, gaan ze door de piekverwerkingsfase. Met aftrekken worden ze helemaal niet verwerkt, wat behoorlijk wat prestaties bespaart.

Nu we al onze transformatie en trim hebben gedaan, lijken de hoeken eindelijk klaar voor de volgende fase in de hele weergavevolgorde. Ze zijn er niet uit. Dit komt omdat alle wiskunde die wordt uitgevoerd bij vertexmanipulatie en bewerkingen van wereld-naar-clipruimte moet worden uitgevoerd met een homogeen coördinatensysteem (d.w.z. elk hoekpunt heeft 4 componenten in plaats van 3). De weergave is echter volledig 2D, dus de API-vertexinformatie is alleen x, y (dieptewaarde z wordt echter bewaard).

Om van de 4e component af te komen, perspectief sectie elk onderdeel w waarde. Deze instelling vergrendelt het waardenbereik x ve y [-1,1] kan en aan z [0,1] bereik - deze worden genoemd genormaliseerde apparaatcoördinaten (Afgekort NDC's).

Als je meer wilt weten over wat we zojuist hebben behandeld en je graag in nog veel meer wiskunde wilt duiken, Song Ho Ahn's uitstekende tutorial Over het onderwerp. Laten we deze hoeken naar pixels converteren!

Raster meester

Net als bij transformaties, zullen we bekijken hoe Direct3D de regels en acties instelt om de viewport in een pixelraster te veranderen. Dit raster is als een spreadsheet met rijen en kolommen waarin elke cel meerdere gegevenswaarden bevat (kleur, dieptewaarden, textuurcoördinaten, enz.). Meestal is dit raster raster en het proces om het te produceren pixelatie. Onze 3D-rendering 101 artikelen, we kregen een zeer vereenvoudigde weergave van de procedure:

Bovenstaande afbeelding wekt de indruk dat de primitieven slechts in kleine blokjes werden gesneden, maar er komt veel meer bij kijken. De eerste stap is om te begrijpen of een primitief daadwerkelijk naar de camera kijkt - in een eerdere afbeelding van dit artikel zijn de primitieven die de rug van het grijze konijn vormden en die bijvoorbeeld teleurstelling toonden, zichtbaar. Het is dus niet nodig om ze te maken, hoewel ze zich in het gezichtsveld bevinden.

Met het onderstaande diagram kunnen we grofweg begrijpen hoe dit eruitziet. De kubus heeft verschillende transformaties ondergaan om het 3D-model in 2D-weergaveruimte te plaatsen, en in het zicht van de camera zijn sommige gezichten van de kubus niet zichtbaar. Ervan uitgaande dat geen van de oppervlakken transparant is, kunnen sommige van deze primitieven worden genegeerd.

Direct3D'de bu, sisteme verwerkingsstatus zal zijn en deze instructie zal de verwijdering ervan aangeven (aka weggooien) voor elke primitieve zijde naar voren of naar achteren gericht (of helemaal niet blind zijn - bijvoorbeeld draadframe modus). Dus hoe weet hij wat de voorkant of achterkant is? Als we kijken wiskunde bij het bewerken van hoekenWe hebben gezien dat driehoeken (of meer hoekpunten) normale vectoren hebben die het systeem vertellen in welke richting het is gericht. Met deze informatie kan een eenvoudige controle worden uitgevoerd en als de primitieve controle mislukt, wordt deze uit de generatieketen verwijderd.

Dan is het tijd om het pixelraster te implementeren. Nogmaals, dit is verrassend complex, want als een pixel volledig in een primitief past - volledig, gedeeltelijk of helemaal - moet het systeem werken. Om dit te doen, scope test gedaan. De onderstaande afbeelding laat zien hoe de driehoeken worden gerasterd in Direct3D 11:

De regel is vrij eenvoudig: als het pixelcentrum groter is dan wat Microsoft het noemt, wordt de pixel als een driehoek beschouwd. regel 'linksboven'. Het 'bovenste' deel is een horizontale lijnbesturing; pixel midden on deze lijn. Het 'linker' gedeelte is voor niet-horizontale lijnen en het midden van de pixel moet links van zo'n lijn vallen. Er zijn aanvullende regels voor niet-primitieven, d.w.z. eenvoudige lijnen en punten, en als regels extra voorwaarden krijgen multisampling'i in dienst zijn.

Als we goed kijken naar de afbeelding in de documentatie van Microsoft, kunnen we zien dat de vormen die door pixels worden gecreëerd niet erg lijken op de originele primitieven. Dit komt doordat de pixels te groot zijn om een ​​realistische driehoek te vormen - het raster bevat onvoldoende gegevens over de originele objecten en overlappen.

Laten we gebruiken UL Benchmark's 3DMark03 Om de alias in verwerking te zien:

In de eerste afbeelding is het scanformaat ingesteld op een zeer lage waarde van 720 x 480 pixels. Overlap is duidelijk zichtbaar op de leuning en de schaduw werpt het wapen van de topsoldaat. Vergelijk dit met wat u krijgt met een scan met 24 keer meer pixels:

Hier kunnen we zien dat de bijnaam op de reling en schaduw helemaal verdwenen is. Het lijkt misschien elke keer een groter scanpad, maar de afmetingen van het raster moeten worden ondersteund door de monitor waarop het frame wordt weergegeven, en deze pixels moeten na rastering worden verwerkt. een duidelijke prestatieverbinding zijn.

Dit is waar multi-sampling kan helpen, en het werkt in Direct3D als volgt:

In plaats van te controleren of een pixelcentrum voldoet aan de regels voor rastering, kunnen meerdere locaties (subpixelsamples of deelmonsters) worden binnen elke pixel getest en als een van deze geschikt is, maakt die pixel deel uit van de vorm. Dit helpt misschien niet en maakt de alias zelfs erger, maar wanneer multi-sampling wordt gebruikt, welke submonsters worden gedekt door de primitieve en worden de resultaten van pixelverwerking opgeslagen in een buffer in het geheugen.

Deze buffer wordt vervolgens gebruikt om de submonster- en pixeldata te mengen, zodat de primitieve randen minder geblokkeerd worden. We zullen de hele vastzittende situatie in een later artikel opnieuw bekijken, maar voorlopig is dit wat multi-sampling kan doen bij gebruik in een scan met zeer lage pixels:

We kunnen zien dat de hoeveelheid anti-aliasing aan de randen van de verschillende vormen sterk wordt verminderd. Een groter raster is beslist beter, maar de prestatiehit kan in plaats daarvan het gebruik van multi-sampling ondersteunen.

Al het andere dat kan worden gedaan tijdens het rasteren occlusietest. Dit moet worden gedaan omdat het gezichtsveld vol zal zijn met primitieven die elkaar zullen overlappen (geblokkeerd) - bijvoorbeeld, in de bovenstaande afbeelding, overlappen de driehoeken aan de voorkant die de solideri op de voorgrond vormen, met dezelfde driehoeken op de andere soldaat. Naast het controleren of een primitief een pixel bedekt, kunnen de relatieve diepten ook worden vergeleken en kunnen de rest van het renderingproces worden overgeslagen als de ene zich achter de andere bevindt.

Als de bijna-primitieve echter transparant is, zal de andere nog steeds zichtbaar zijn, hoewel deze de occlusiecontrole niet doorstaat. Daarom voeren bijna alle 3D-motoren occlusiecontroles uit vóór Iets naar de GPU sturen en in plaats daarvan Z-tampon als onderdeel van het creatieproces. Dit is waar het frame normaal wordt weergegeven, maar de GPU slaat alleen dieptewaarden op in plaats van de uiteindelijke pixelkleuren in het geheugen op te slaan. Dit kan vervolgens worden gebruikt in shaders om de zichtbaarheid met meer controle en precisie te regelen over aspecten waarbij objecten overlappen.

In de bovenstaande afbeelding geldt: hoe donkerder de kleur van de pixel, hoe dichter het object zich bij de camera bevindt. Om de z-buffer te maken, wordt het frame één keer gemaakt en vervolgens opnieuw opgebouwd, maar deze keer wanneer de pixels worden verwerkt, wordt een arcering uitgevoerd om ze te vergelijken met de waarden in de z-buffer. Als deze niet zichtbaar is, wordt deze pixelkleur niet in de laatste framebuffer geplaatst.

Voor nu, de echte laatste stap vertex attribuut interpolatie - in ons eerste vereenvoudigde diagram was de primitieve een complete driehoek, maar onthoud dat de weergave gevuld is met hoekpunten van de vormen, niet de vorm zelf. Het systeem moet dus uitzoeken hoe de kleur, diepte en textuur van de primitief tussen de hoeken zijn, en zo heet het. interpolasyon. Zoals u zich kunt voorstellen, is dit geen eenvoudige berekening, maar een andere berekening.

Hoewel het gerasterde scherm 2D is, vertegenwoordigen de structuren binnenin een geforceerd 3D-perspectief. Als de lijnen echt 2-dimensionaal waren, een simpele lineair verschillende kleuren enzovoort terwijl u van de ene piek naar de andere gaat. Maar vanwege het 3D-aspect van de scène, moet bij interpolatie rekening worden gehouden met het perspectief - Simon Yeung'un muhteşem blogu voor meer informatie over het proces.

Hier gaan we - de 3D-wereld van hoeken wordt een 2D-raster van gekleurde blokken. Toch zijn we niet veel gedaan.

Alles van voor naar achter (behalve wanneer het er niet is)

Voordat we onze kijk op rastering beëindigen, moeten we iets zeggen over de volgorde van weergave. We hebben het bijvoorbeeld niet over waar de mozaïekpatroon op zijn beurt vandaan kwam; in plaats daarvan hebben we het over de volgorde van primitieven. Objecten worden vaak verwerkt in de volgorde waarin ze verschijnen in de directorybuffer (het geheugenblok dat het systeem vertelt hoe de hoekpunten zijn gegroepeerd), en dit kan een aanzienlijke invloed hebben op de manier waarop met transparante objecten en effecten wordt omgegaan.

Dit komt doordat de primitieven een voor een worden behandeld, en als je eerst de voorste doet, is niemand erachter zichtbaar (dit is waar occlusie-sortering echt een rol speelt). en kan buiten werking worden gesteld (bevordert de prestaties) - dit is meestal 'van voren naar achteren vereist creatie en directory-buffering om op deze manier te worden gerangschikt.

Als sommige van deze primitieven vlak voor de camera echter transparant zijn, zal front-to-back rendering resulteren in gemiste objecten achter de transparante. Een oplossing is om alles van voor naar achter te doen, waarbij transparante primitieven en effecten als laatste worden gedaan.

Dus alle moderne games worden rug aan rug weergegeven, toch? Als het niet nuttig is, houd er dan rekening mee dat elke primitieve weergave veel hogere prestatiekosten heeft dan alleen zichtbaar is. Er zijn andere manieren om transparante objecten aan te pakken, maar over het algemeen is er geen eenduidige oplossing en moet elke situatie op een unieke manier worden aangepakt.

Dit vat in feite de voor- en nadelen van rasteren samen - in moderne hardware is het echt snel en effectief, maar het is nog steeds een benadering van wat we zien. In de echte wereld absorbeert, reflecteert en misschien breekt elk object licht, en dit alles heeft effect op de scène die wordt bekeken. We krijgen een snel maar ruw resultaat door de wereld in primitieven te verdelen en er slechts enkele te creëren.

Was er maar een andere manier ...

Daar is Een andere manier: ray tracing

Ongeveer twintig jaar geleden ontwikkelde een computerwetenschapper genaamd Arthur Appel een systeem voor het maken van afbeeldingen op een computer, zodat een enkele straal recht licht uit de camera werd geworpen totdat deze een object raakt. Van daaruit veranderen de eigenschappen van het materiaal (kleur, reflectiviteit, enz.) Vervolgens de intensiteit van de lichtstraal. Elke pixel in het gerenderde beeld zou een straalzweem hebben en een algoritme zou worden uitgevoerd om de kleur van de pixel te decoderen door een wiskundige reeks te doorlopen. Appel's proces Gieten van rails.

Ongeveer 10 jaar later, een andere wetenschapper John Whitted Hij ontwikkelde een wiskundig algoritme dat hetzelfde was als de benadering van Appel, maar wanneer de straal een object raakt, genereert het extra stralen die in verschillende richtingen worden afgevuurd, afhankelijk van het materiaal van het object. Aangezien dit systeem nieuwe stralen zou genereren voor elke objectinteractie, was het algoritme recursief en daarom veel rekenkundig moeilijker; Het had echter een aanzienlijk voordeel ten opzichte van de methode van Appel, omdat het reflectie, breking en schaduw goed kon verklaren. De naam van deze procedure is: Opsporen van stralen (om eerlijk te zijn, achteruit ray tracing, zoals we de straal van de camera volgen, niet het object) en de heilige graal voor computergraphics en films sinds die tijd.

De naam van deze procedure was ray tracing (achterwaartse ray tracing, strikt genomen, omdat we stralen van de camera volgen in plaats van van objecten) en is sindsdien de heilige graal voor computergraphics en films.

In de bovenstaande afbeelding kunnen we een idee krijgen van Whitted's werk aan het algoritme. Een straal wordt uitgezonden door de camera voor elke pixel in het frame en reist totdat deze een oppervlak bereikt. Dit specifieke oppervlak is doorschijnend, dus licht zal erdoorheen reflecteren en breken. In beide gevallen worden secundaire stralen gegenereerd en gaan ze uit totdat ze een interactie aangaan met een oppervlak. Er is ook een aanvullende secundaire die rekening houdt met de kleur van de lichtbronnen en de schaduwen die ze maken.

Het recursieve deel van het proces is dat secundaire liggers kunnen worden gegenereerd telkens wanneer een nieuwe gietstraal een oppervlak kruist. Dit kan gemakkelijk uit de hand lopen, dus het aantal gegenereerde secundaire liggers is altijd beperkt. Wanneer een straalpad is voltooid, wordt de kleur op elk eindpunt berekend op basis van de materiaaleigenschappen van dat oppervlak. Deze waarde geeft de straal vervolgens door aan de vorige, waarbij de kleur van dit oppervlak wordt aangepast, enzovoort totdat het effectieve oorsprongpunt (pixel in het frame) van de primaire straal bereikt.

Dit kan buitengewoon complex zijn, en zelfs eenvoudige scenario's kunnen een computationele drempel creëren om doorheen te gaan. Gelukkig kunnen er enkele dingen worden gedaan om te helpen - een daarvan zou zijn om speciaal ontworpen hardware te gebruiken om die specifieke wiskundige bewerkingen te versnellen, net zoals bij het uitvoeren van matrixberekeningen bij het bewerken van hoeken (meer in een oogwenk). Een ander belangrijk punt is het versnellen van het proces van werken aan welk object een straal raakt en precies waar het zich bevindt op het oppervlak van het object waar het snijdt - wat verrassend kan zijn als het object uit een groot aantal driehoeken bestaat. moeilijk te doen:

In plaats van elke driehoek te testen, wordt in elk object een lijst met bounding volumes (BV) gemaakt voordat ray tracing plaatsvindt - dit zijn niets meer dan kubussen die het object in kwestie omringen, en dit zijn achtereenvolgens kleinere voor de verschillende structuren erin. voorwerp.

De eerste BV zou bijvoorbeeld voor het hele konijn zijn. Het volgende paar is hun hoofd, benen, romp, staart, enz. elk van deze dan kleine structuren in het hoofd, enz. Er zal voor elk een andere verzameling volumes zijn en het uiteindelijke volumeniveau zal een klein aantal te testen driehoeken bevatten. Al deze volumes worden vervolgens gerangschikt in een geordende lijst ( BV-hiërarchie of BVH in het kort), zodat het systeem telkens een relatief klein aantal BV's aanstuurt:

Hoewel het gebruik van een BVH technisch gezien de daadwerkelijke raytracing niet versnelt, is het creëren van de hiërarchie en het daaropvolgende zoekalgoritme vaak veel sneller dan het moeten controleren of een straal een van de miljoenen driehoeken snijdt. In een 3D-wereld.

Programma's zoals vandaag mixer ve POV-straal Gebruik ray tracing met extra tracking (zoals foton-tracking en radio) om zeer realistische afbeeldingen te maken:

De voor de hand liggende vraag is of ray tracing zo goed is, waarom gebruiken we het niet overal? De antwoorden liggen op twee gebieden: allereerst produceert zelfs eenvoudige raytracing miljoenen stralen die steeds opnieuw moeten worden berekend. Het systeem begint met slechts één bundel per schermpixel, dus met een resolutie van slechts 800 x 600 produceert het 480.000 primaire bundels, die elk meerdere secundaire bundels produceren. Dit is een serieuze zaak, zelfs voor de huidige desktopcomputers. Het tweede probleem is dat basis ray tracing eigenlijk niet erg realistisch is en dat er een aantal extra, zeer complexe vergelijkingen moeten worden opgenomen om correct te zijn.

Zelfs met moderne pc-hardware is de hoeveelheid werk die nodig is om dit in realtime te doen voor een huidige 3D-game buiten het bereik. Onze 3D render 101 In zijn artikel zagen we dat het tientallen seconden duurde om een ​​enkele afbeelding met een lage resolutie op een ray tracing-benchmark te produceren.

Dus hoe deed de originele Wolfenstein 3D-straalgieten, terug in 1992 en waarom is het leuk? Battlefield V ve Metro-migratie, beide gelanceerd in 2019, bieden ray tracing-functies? Maken ze rasters of straalsoorten? Antwoord: een beetje van beide.

Een hybride aanpak voor vandaag en de toekomst

In maart 2018 kondigde Microsoft een nieuwe API-extensie aan voor Direct3D 12 genaamd DXR (DirectX Raytracing). Dit was een nieuwe kaartlijn die de standaard rasterisatie- en rekenpijplijnen aanvulde. Extra functionaliteit, shaders, datastructuren, etc. Het werd geleverd bij de introductie, maar had geen speciale hardware-ondersteuning nodig, behalve wat al vereist is voor Direct3D 12.

Op dezelfde Game Developers Conference, Sprak over Microsoft DXRElectronic Arts sprak erover Pica Pica Projesi - 3D-engine-experiment met DXR. Ze toonden aan dat ray tracing kan worden gebruikt, maar niet voor het volledige weergaveframe. In plaats daarvan zullen traditionele rasterisatie- en computationele arceringstechnieken worden gebruikt voor het meeste werk, DXR wordt gebruikt voor bepaalde gebieden - wat betekent dat het aantal gegenereerde stralen veel minder is dan voor de hele scène.

Deze hybride benadering is in het verleden in mindere mate toegepast. Bijvoorbeeld Wolfenstein 3D gebruikt railafgietsel om op te lossen hoe het gerenderde frame eruitziet, maar gemaakt met één balk per pixelkolom, niet per pixel. Dit ziet er misschien nog steeds erg indrukwekkend uit totdat ik me realiseerde dat de game aanvankelijk op een resolutie van 640 x 480 draaide, dus er werkten niet meer dan 640 bundels tegelijkertijd.

De grafische kaart van begin 2018 - zoals AMD's Radeon RX 580 of Nvidia's GeForce 1080 Ti - voldeed zeker aan de hardwarevereisten voor DXR, maar zelfs met rekenmogelijkheden waren er enkele misvattingen dat ze krachtig genoeg zouden zijn om DXR te gebruiken. zinvol.

Dat veranderde enigszins in augustus 2018, toen Nvidia zijn nieuwste GPU-architectuur lanceerde, codenaam Turing. Het cruciale kenmerk van deze chip was zoiets als RT-Cores: speciale logische eenheden om het onderscheppen van straal naar driehoek te versnellen en kruisberekeningen met beperkende volumehiërarchie (BVH) te versnellen. Deze twee processen zijn tijdrovende routines om te werken waarbij een licht in wisselwerking staat met driehoeken die verschillende objecten binnen een scène vormen. Aangezien RT Cores specifiek zijn voor de Turing-processor, is toegang hiertoe alleen mogelijk via de eigen API van Nvidia.

De eerste game die deze functie ondersteunt, is EA's Battlefield V en Toen we het gebruik van DXR testtenwaren we onder de indruk van de verbetering in water-, glas- en metaalreflecties in het spel, maar minder onder de indruk van de daaropvolgende prestatiehits:

Om eerlijk te zijn, latere patches verbeterden enigszins, maar er was (en is nog steeds) een enorme daling in de snelheid waarmee frames worden weergegeven. Tot 2019 zijn er enkele andere games verschenen die deze API ondersteunen en ray tracing uitvoeren voor bepaalde onderdelen in een frame. We hebben getest Metro-migratie ve Tomb Raider Shadowen vond een soortgelijk verhaal: DXR zou met name de framesnelheid beïnvloeden bij intensief gebruik.

Rond dezelfde tijd, UL Benchmarks hij legde uit Een DXR-functietest voor 3DMark:

Onze beoordeling van DXR-compatibele games en de 3DMark-functietest hebben echter bewezen dat één ding zeker is over ray tracing: in 2019 is het nog steeds serieus werk voor zelfs de $ 1000 + -modellen voor de grafische processor. Betekent dit dat we geen echt alternatief hebben voor rasteren?

De nieuwste functies in 3D grafische technologie voor consumenten zijn vaak erg duur, en de eerste ondersteuning van nieuwe API-functies kan nogal grillig of traag zijn (zoals we vinden) Toen we Max Payne 3 testten In een reeks Direct3D-releases rond 2012) - dit laatste is meestal te wijten aan game-ontwikkelaars die proberen zoveel mogelijk geavanceerde functies op te nemen, soms met beperkte ervaring.

Toen vertex- en pixel-shaders, mozaïekpatroon, HDR-rendering en omgevingsocclusie op het scherm ooit behoorlijk veeleisend waren, alleen geschikt voor high-end GPU's, is het gebruik ervan nu gebruikelijk in games en wordt het ondersteund door een breed scala aan grafische kaarten. Hetzelfde geldt voor ray tracing en na verloop van tijd wordt het gewoon een andere detailinstelling die standaard is ingeschakeld voor de meeste gebruikers.

Enkele slotgedachten

En zo zijn we aan het einde gekomen van onze tweede diepe duik, waar we de 3D-grafische wereld van naderbij bekijken. We hebben gekeken hoe de hoeken van modellen en werelden worden verschoven van 3D en transformeren naar een plat 2D-beeld. We hebben gezien hoe er rekening moet worden gehouden met gezichtsveldinstellingen en welk effect ze hebben. Het proces van het pixeleren van deze hoeken is onderzocht en we zijn klaar met een korte blik op een alternatief proces voor rasteren.

Zoals voorheen konden we niet alles behandelen, en we konden hier en daar geen enkele details bekijken - het is tenslotte geen leerboek! We hopen echter dat je gaandeweg iets meer hebt geleerd en een nieuwe fascinatie voor programmeurs en ingenieurs die de wiskunde en wetenschap echt beheersen die nodig zijn om dit allemaal te bereiken in je favoriete 3D-titels.

We beantwoorden uw vragen graag, dus aarzel niet om onze weg te posten in het opmerkingengedeelte. Tot de volgende.

Masthead-tegoed: Monochroom print raster abstract van Aleksei Deep