In deze derde sectie, waarin we dieper ingaan op het maken van 3D-games, zullen we ons concentreren op wat er met de 3D-wereld gebeurt na hoekverwerking en de scène wordt gerasterd. Configuratie is een van de belangrijkste stadia bij het renderen, hoewel alles wat er gebeurt wordt berekend en vervangen door een tweedimensionaal raster van gekleurde blokken.

De meeste visuele effecten die tegenwoordig in games worden gezien, zijn afhankelijk van het slimme gebruik van texturen - games zonder deze worden saai en levenloos. Dus laten we gaan duiken en kijken hoe deze werken!

Zoals altijd, als je niet klaar bent om een ​​diepe duik in het weefsel te nemen, raak dan niet in paniek - je kunt beginnen 3D-spel maken 101. Maar als de basis eenmaal is verstreken, lees dan verder voor onze volgende blik op de 3D-grafische wereld.

Laten we eenvoudig beginnen

Kies de best verkochte 3D-games van de afgelopen 12 maanden en ze zullen allemaal iets gemeen hebben: textuur kaarten (of gewoon texturen). Dit is een veel voorkomende term, de meeste mensen zullen hetzelfde beeld creëren wanneer ze naar texturen kijken: een eenvoudig, plat vierkant of rechthoek (gras, steen, metaal, kleding, gezicht, enz.) Die een afbeelding van een oppervlak bevat.

Bij gebruik in meerdere lagen en gecombineerd met complexe rekenkundige bewerkingen, kan het gebruik van deze basisbeelden in de 3D-scène echter verrassend realistische beelden opleveren. Om te zien hoe dit mogelijk is, laten we ze volledig overslaan en kijken hoe objecten in de 3D-wereld er zonder kunnen uitzien.




Zoals we in eerdere artikelen hebben gezien, bestaat de 3D-wereld uit hoeken - eenvoudige vormen die later kunnen worden verplaatst en gekleurd. Deze worden vervolgens gebruikt om primitieven te maken, die ook worden gecomprimeerd in het 2D-pixelraster. Aangezien we geen texturen zullen gebruiken, moeten we deze pixels kleuren.




Het heet een methode die kan worden gebruikt rechte schaduwomvat het nemen van de kleur van het eerste hoekpunt van de primitieve substantie en het vervolgens gebruiken van die kleur voor alle pixels die binnen het bereik van de vorm in het raster vallen. Het ziet er zo uit:




Het is duidelijk dat dit geen realistische theepot is, de kleur van het oppervlak is tenminste verkeerd. Kleuren springen van het ene niveau naar het andere, geen vloeiende overgang. Een oplossing voor dit probleem zou kunnen zijn om zoiets te gebruiken Gouraud-schaduw.




Dit is een proces dat de kleuren van de hoeken neemt en berekent hoe de kleur over het oppervlak van de driehoek verandert. Wiskunde gebruikt lineaire interpolatieDit betekent dat hoewel het er in werkelijkheid mooi uitziet, als de kleur van één primitieve zijde 0,2 rood is en de andere zijde 0,8 rood is, de vorm een ​​kleur heeft tussen 0,2 en 0,8 (dat wil zeggen 0,5).

Het is relatief eenvoudig te doen en het belangrijkste voordeel is snelheid. Veel vroege 3D-spellen gebruikten deze techniek omdat de hardware die de berekeningen maakte, beperkt was tot wat ze konden doen.




Maar zelfs dit heeft zijn problemen, omdat als een licht precies in het midden van een driehoek wijst, de hoeken (hoeken) het mogelijk niet goed opvangen. Dit betekent dat door licht veroorzaakte highlights volledig over het hoofd kunnen worden gezien.




Hoewel vlakke en Gouraud-schaduwen zijn opgenomen in het renderarsenaal, zijn de bovenstaande voorbeelden open kandidaten voor het gebruik van texturen om ze te helen. En om een ​​goed beeld te krijgen van wat er gebeurt als een textuur op een oppervlak wordt aangebracht, zijn we terug in de tijd ... tot 1996.

Een korte game en GPU-geschiedenis

Quake is een mijlpaalspel dat 23 jaar geleden is uitgebracht id Software. Hoewel het niet het eerste spel was dat 3D-polygonen en -texturen gebruikte om de omgeving te creëren, was het een van de eersten die ze allemaal zo effectief gebruikten.

Een ander ding dat hij deed, was laten zien wat er met OpenGL kon worden gedaan (de grafische API was nog in de eerste revisie), en het heeft ook een lange weg afgelegd om het eerste grafische kaartproduct te helpen verkopen. Verite Commentaar ve 3Dfx Vudu.

Vergeleken met de huidige normen was Voodoo uiterst eenvoudig: geen 2D-grafische ondersteuning, geen hoekverwerking en alleen de basis van pixelverwerking. Het was nog steeds een schoonheid:

Het had een hele chip (TMU) om een ​​pixel uit een textuur te halen, en vervolgens nog een chip (FBI) om het te mengen met een pixel uit het raster. Het kan een paar extra dingen doen, zoals het maken van mist of transparantie-effecten, maar dat was het bijna.

Als we een overzicht geven van de architectuur achter het ontwerp en de werking van de grafische kaart, kunnen we zien hoe deze processen werken.

De FBI-chip heeft twee kleurwaarden en combineert deze; een daarvan kan een waarde zijn uit een tissue. Het mengproces is wiskundig vrij eenvoudig, maar het verschilt enigszins tussen wat er precies door elkaar wordt gehaald en welke API wordt gebruikt om instructies uit te voeren.

Wat we kijken Direct3D biedt In termen van mengfuncties en mengbewerkingen kunnen we zien dat elke pixel eerst wordt vermenigvuldigd met een getal tussen 0,0 en 1,0. Dit bepaalt hoeveel van de kleur van de pixel het uiteindelijke uiterlijk zal beïnvloeden. De set van twee pixelkleuren wordt vervolgens opgeteld, afgetrokken of gedupliceerd; In sommige functies is bediening altijd een logische uitdrukking waarin zoiets als de helderste pixel wordt geselecteerd.

Bovenstaande afbeelding is een voorbeeld van hoe dit in de praktijk werkt; van de factor die wordt gebruikt voor de linkerpixel alpha waarde. Dit nummer, transparant pixels.

De rest van de stappen omvat het toepassen van een mistwaarde (afkomstig uit een programmatabel die door de programmeur is gemaakt en doet vervolgens dezelfde mengwiskunde); enige zichtbaarheid en transparantiecontroles en aanpassingen te maken; voordat u uiteindelijk de kleur van de pixel in het geheugen op de grafische kaart schrijft.

Waarom geschiedenisles? Ondanks de relatieve eenvoud van het ontwerp (vooral vergeleken met moderne reuzen), legt het proces de basisprincipes van texturering uit: verkrijg enkele kleurwaarden en meng ze zodat modellen en omgevingen kijken hoe het in een bepaalde situatie zou moeten zijn.

De games van vandaag doen dit nog steeds, het enige verschil is de hoeveelheid gebruikte textuur en de complexiteit van de mengberekeningen. Samen simuleren ze de visuele effecten in films of hoe licht in wisselwerking staat met verschillende materialen en oppervlakken.

Basisprincipes van textuur

Voor ons is een textuur een plat, 2D-beeld dat wordt toegepast op polygonen die 3D-structuren vormen in het weergegeven frame. Voor een computer is het niets meer dan een klein geheugenblok in de vorm van een 2D-array. Elk item in de array vertegenwoordigt een kleurwaarde voor een van de pixels in de textuurafbeelding (beter bekend) tekstvuller - textuurpixels).

Elke hoekpunt in een veelhoek heeft 2 coördinaten (meestal sen, v) vertelt welke pixel in de textuur ermee geassocieerd is. De hoek zelf heeft 3 sets coördinaten (X ve Z) en typ tekst in de hoeken. textuur mapping.

Om dit in actie te zien, gaan we naar een tool die we meerdere keren gebruiken in deze artikelserie: Real Time Creation WebGL gereedschap. Voor nu, z coördineer vanuit de hoeken en houd alles in een plat vlak.

We hebben de textuur van links naar rechts sen, v coördinaten die rechtstreeks zijn toegewezen aan hoekhoeken x, y coördinaten. Dan de bovenste hoeken y de coördinaten zijn toegenomen, maar aangezien de textuur er nog steeds rechtstreeks aan is toegewezen, wordt de textuur naar boven uitgerekt. In de afbeelding uiterst rechts, deze keer veranderende textuur: u waarden zijn gestegen, maar hierdoor wordt het weefsel verpletterd en vervolgens herhaald.

Omdat de textuur nu effectief langer is, hoger u De waarde ervan zou in primitief moeten passen - in wezen werd de textuur gedeeltelijk herhaald. Dit is een manier om iets te doen dat in veel 3D-spellen te zien is: therhaling. Bekende voorbeelden hiervan zijn te vinden in scènes met rotsachtige of met gras begroeide landschappen of bakstenen muren.

Laten we nu de scène primitiever maken en we zullen de diepte terug in het spel brengen. Wat we hieronder hebben is een klassiek landschapsbeeld, maar de krattextuur wordt gekopieerd en herhaald onder primitieven.

Nu is deze krattextuur 66 kilo in het originele gif-formaat en heeft een resolutie van 256 x 256 pixels. De oorspronkelijke resolutie van het gedeelte van het frame dat wordt bedekt door de krattexturen is 1900 x 680, dus dit gebied zou slechts 20 krattexturen kunnen weergeven in termen van pixel 'gebied'.

We nemen duidelijk meer dan 20 paden, dus veel borsttexturen op de achtergrond heel Kleiner dan 256 x 256 pixels. Ze zijn en hebben inderdaad een proces doorlopen weefselvermindering (ja, dit is een woord!). Laten we het opnieuw proberen, maar deze keer kwam het dichter bij een van de kisten.

Merk op dat de textuur slechts 256 x 256 pixels groot is, maar hier kunnen we zien dat een textuur meer dan de helft van de breedte is van een afbeelding van 1900 pixels breed. Deze textuur ging door iets genaamd weefselvergroting.

Deze twee textuurprocessen komen altijd voor in 3D-spellen, omdat alle texturen die op primitieven worden toegepast, samen met polygonen moeten worden geschaald als de camera over het podium beweegt of als modellen naderen en weggaan. Wiskundig gezien is dit geen probleem, in feite knipperen zelfs de eenvoudigste geïntegreerde grafische chips in zo'n taak. Weefselverkleining en -vergroting vormen echter nieuwe problemen die op de een of andere manier moeten worden opgelost.

Voer minitexturen in

Het eerste probleem dat moet worden opgelost, is voor verre weefsels. Als we opnieuw naar het eerste kratlandschapsbeeld kijken, zijn de juiste aan de horizon slechts een paar pixels groot. Het heeft om twee redenen geen zin om te proberen een afbeelding van 256 x 256 pixels te comprimeren tot zo'n klein gebied.

Ten eerste neemt een kleinere textuur minder geheugenruimte in beslag op de grafische kaart, wat handig is om te proberen een kleine hoeveelheid cache te plaatsen. Dit betekent dat het minder snel uit de cache wordt verwijderd en dat het herhaaldelijk gebruik van deze textuur de gegevens in het nabijgelegen geheugen ten volle zal benutten. De tweede reden dat we even komen omdat het van hetzelfde probleem afhangt voor ingezoomde texturen.

Een gemeenschappelijke oplossing voor het gebruik van grote weefsels die door kleine primitieven worden fijngemaakt, koppelen. Dit zijn geminimaliseerde versies van de oorspronkelijke textuur; de game-engine zelf kan worden gemaakt (met het bijbehorende API-commando om deze te doen) of kan van tevoren worden gedaan door game-ontwerpers. Elk mipmap-weefselniveau heeft de helft van de lineaire afmetingen van het vorige.

Voor de krattextuur gebeurt zoiets als dit: 256 x 256 → 128 x 128 → 64 x 64 → 32 x 32 → 16 x 16 → 8 x 8 → 4 x 4 → 2 x 2 → 1 x 1.

Mipmaps zijn allemaal samen verpakt, dus de textuur heeft nog steeds dezelfde bestandsnaam, maar is nu groter. Het weefsel is zo verpakt dat sen, v de coördinaten ervan bepalen niet alleen welke texel op een pixel in het frame moet worden toegepast, maar ook vanaf welke mipmap. Programmeurs coderen vervolgens de renderer om de te gebruiken mipmap te bepalen op basis van de dieptewaarde van de vierkante pixel, dus als deze te hoog is, staat de pixel op afstand, zodat een kleine mipmap kan worden gebruikt.

Lezers met scherpe ogen hebben mogelijk het nadeel van mipmaps gezien en gaan ten koste van grotere texturen. De originele krattextuur is 256 x 256 pixels groot, maar zoals je op de afbeelding hierboven kunt zien, is de mipmapped textuur nu 384 x 256. Ja, er is veel vrije ruimte, maar ongeacht hoe je het in kleinere texturen verpakt, de totale toename tot ten minste één van de afmetingen van het weefsel is 50%.

Dit geldt echter alleen voor vooraf voorbereide mipmaps; Als de game-engine is geprogrammeerd om ze goed te produceren, kan de toename nooit meer dan 33% van de oorspronkelijke textuurgrootte bedragen. U krijgt dus prestatievoordelen en visuele verbeteringen voor een relatief kleine toename van het geheugen in weefselmipmaps.

Hieronder is een gesloten / open vergelijking van weefselmipmaps:

Aan de linkerkant van de afbeelding worden de krattexturen gebruikt 'zoals ze zijn', wat resulteert in een korrelig uiterlijk en zogenaamd moiré patronen weg. Aan de rechterkant veroorzaakt het gebruik van mipmaps echter een veel zachtere overgang door het landschap, waarbij de krattextuur verandert in een consistente kleur aan de horizon.

Wil iemand echter wazige texturen die de achtergrond van hun favoriete spel verstoren?

Bilineer, drievoudige strepen, anisotroop - allemaal Grieks voor mij

Het proces van het selecteren van pixels uit een textuur om toe te passen op een pixel in een frame weefselmonstersen in een perfecte wereld, zijn grootte, positie, richting, etc. ongeacht de textuur, het zou een textuur zijn die exact overeenkomt met het principe. Met andere woorden, texture sampling is niets meer dan een 1 op 1 plat pixel naar pixel mapping proces.

Aangezien dit niet het geval is, moet bij weefselbemonstering rekening worden gehouden met een aantal factoren:

  • Is de textuur vergroot of verkleind?
  • Is de textuur origineel of een mipmap?
  • Onder welke hoek wordt de textuur weergegeven?

Laten we ze een voor een analyseren. De eerste is duidelijk genoeg: als de textuur wordt vergroot, komt er meer tekst over de primitieve pixel dan nodig is; Bij krimp is dit het tegenovergestelde, elke texel moet nu meer dan één pixel beslaan. Dit is een beetje een probleem.

Ten tweede laten mipmaps de weefsels onder een hoek staan, omdat ze worden gebruikt om het probleem van weefselbemonstering met verre primitieven te omzeilen. En ja, dit is ook een probleem. Waarom? Omdat alle texturen 'face-open' zijn gemaakt voor een weergave of allemaal wiskundig zijn: het normale oppervlak van de textuur is hetzelfde als het oppervlak dat op het weefsel wordt weergegeven.

Daarom, om te weinig of te veel texturen te hebben en texturen onder een hoek te hebben, weefsel filteren. Als u dit proces niet gebruikt, krijgt u dit:

Hier hebben we de krattextuur vervangen door een letter R-textuur om duidelijker te maken hoeveel verwarring het zal hebben zonder de textuur te filteren!

Grafische API's zoals Direct3D, OpenGL en Vulkan bieden allemaal dezelfde filtertypen, maar gebruiken hiervoor verschillende namen. In feite gaat het allemaal als volgt:

  • Bemonstering van dichtstbijzijnde punt
  • Lineaire textuurfiltering
  • Anisotrope weefselfiltering

Voor alle doeleinden, bemonstering van het dichtstbijzijnde punt als het niet filtert - dit komt omdat het de pixel is die het dichtst bij de pixel ligt die bemonstering vereist (d.w.z. kopiëren uit het geheugen) en vervolgens de pixel met zijn originele kleur vermengen.

Hier komt lineaire filtering te hulp. Verplicht sen, v texel-coördinaten worden naar de hardware gestuurd voor bemonstering, maar in plaats van de dichtstbijzijnde texel bij die coördinaten te krijgen, wordt de sampler vier texels. Deze bevinden zich direct boven, onder, links en rechts van degene die is geselecteerd met de dichtstbijzijnde puntsampling.

Deze 4 stoffen worden vervolgens gemengd volgens een gewogen formule. De formule in Vulkan bijvoorbeeld:

T "Kleur", f Vier bemonsterde stoffen voor uitgelekt en 1 tot 4. waarden alpha ve bèta Hoe ver van het punt gedefinieerd door sen, v coördinaten komen uit het midden van de kraan.

Gelukkig gebeurt iedereen die betrokken is bij 3D-spellen, of ze nu spelen of spelen, automatisch in deze grafische verwerkingschip. De TMU-chip in 3dfx Voodoo deed dit zelfs: hij proefde 4 singles en mengde ze vervolgens. Direct3D noemt dit vreemd bilineair filteren, sinds de tijd van Quake en Voodoo's TMU-chip konden grafische kaarten echter slechts met één klokcyclus filteren (als de textuur natuurlijk comfortabel in het geheugen zit).

Lineaire filtering kan naast mipmaps worden gebruikt en als je echt zin hebt in je filtering, kun je 4 teksten van de ene textuur nemen, dan nog eens 4 van het volgende mipmap-niveau en ze vervolgens combineren. En de naam van Direct3D hiervoor? trilineair filtratie. Wat tri over dit proces? Uw gok is net zo goed als de onze ...

De laatst genoemde filtermethode wordt genoemd anizotrop. Dit is in feite een aanpassing volgens het proces voor bilirear of trilineaire filtering. Aanvankelijk mate van anisotropie primitief oppervlak (en verrassend ingewikkeld) - deze waarde verandert de aspectverhouding van de primitieve vanwege zijn oriëntatie:

De afbeelding hierboven toont hetzelfde vierkante principe met randen van gelijke lengte; maar als we ons perspectief verlaten, ziet het vierkant eruit als een rechthoek en gaat de breedte boven de hoogte. De primitief aan de rechterkant heeft dus een grotere anisotropie dan aan de linkerkant (en in het geval van een vierkant is de graad precies nul).

Bij de meeste van de 3D-games van vandaag kunt u anisotrope filtering inschakelen en vervolgens het niveau aanpassen (1x tot 16x), maar wat verandert dit eigenlijk? De instelling bepaalt het maximale aantal extra texelmonsters dat per originele lineaire monsterneming wordt genomen. Stel dat het spel is ingesteld op 8x anisotrope bilineaire filtering. Dit betekent dat in plaats van slechts 4 tekstwaarden, het 32 ​​waarden zal opleveren.

Het is duidelijk dat het gebruik van anisotrope filtering kan opmerken:

Veeg gewoon een beetje omhoog en vergelijk de dichtstbijzijnde puntbemonstering voor maximaal 16x anisotrope trilineaire filtering. Zo soepel, bijna heerlijk!

Maar er moet een prijs zijn om al deze prachtige smaak van boterstructuur en zeker prestaties te betalen: al het maximale, anisotrope trilineaire filtering zal 128 monsters uit één textuur opleveren voor elke verwerkte pixel. Zelfs voor de beste van de nieuwste GPU's kan dit niet worden gedaan in een enkele klokcyclus.

Als we zoiets als AMD krijgen Radeon RX 5700 XTmarkeer dat elke weefseleenheid in de processor 32 texel-adressen in één kloklus kan sluiten en vervolgens 32 texels uit het geheugen (elk 32 bit-formaat) in een andere klokcyclus kan laden en vervolgens 4 bij elkaar kan voegen. Daarom werd het gemengd voor 128 texelmonsters waarvoor een cyclus van ten minste 16 uur nodig was.

Nu is de basissnelheid van de 5700 XT 1605 MHz, dus zestien cycli nemen slechts 10 in beslag nanosaniye. Doe dit gewoon voor elke pixel in het 4K-frame. een de weefseleenheid zou nog steeds slechts 70 milliseconden in beslag nemen. Oké, misschien doen prestaties er niet toe!

Zelfs in 1996 waren 3Dfx Voodoo behoorlijk stijlvol in het hanteren van texturen. Het maximum kan worden gegeven in 1 bilineaire gefilterde texel per uurcyclus, en terwijl de TMU-chip op 50 MHz draaide, betekende dit dat er elke seconde 50 miljoen texines konden worden gesneden. In een game met een snelheid van 800 x 600 en 30 fps is slechts 14 miljoen tekst per seconde vereist.

Dit alles veronderstelt echter dat de texturen zich in het nabije geheugen bevinden en dat slechts één texin aan elke pixel wordt toegewezen. Twintig jaar geleden was het idee om meer dan één textuur op een principe toe te passen bijna onbekend, maar nu is het gewoon. Laten we eens kijken waarom deze verandering is gebeurd.

Verlicht het pad naar spectaculaire beelden

Bekijk deze scène van Quake om te begrijpen hoe de stof zo belangrijk is geworden:

Dit donkere beeld was de aard van dit spel, maar je kunt zien dat de duisternis niet overal hetzelfde is - de plekken op de muren en de vloer zijn helderder dan andere om een ​​algemeen gevoel van verlichting in dat gebied te geven.

De primitieven die de zijkanten en de vloer vormen, hebben dezelfde textuur, maar er is nog een tweede textuur. lichte kaartwordt gemengd met texelwaarden voordat ze worden gekoppeld aan vierkante pixels. Tijdens Quake-dagen werden lichtkaarten vooraf berekend en gemaakt door de game-engine en gebruikt om statische en dynamische lichtniveaus te creëren.

Het voordeel van het gebruik ervan was dat complexe lichtberekeningen werden gemaakt op texturen in plaats van op hoeken, wat vooral het uiterlijk van een scène verbeterde en zeer lage prestatiekosten. Uiteraard niet perfect: zoals je op de grond kunt zien, is de grens tussen de verlichte gebieden en die in de schaduw heel duidelijk.

In veel opzichten is een lichte kaart gewoon een andere textuur (onthoud dat ze allemaal behalve 2D-gegevensarrays zijn), dus waar we hier naar kijken, is het vroege gebruik van wat bekend is. meerdere textuur. Zoals de naam al aangeeft, is het een proces waarbij twee of meer aanrakingen worden toegepast op een principe. Het gebruik van lichte kaarten in Quake was een oplossing om de beperkingen van Gouraud-arcering te overwinnen, maar naarmate de mogelijkheden van de grafische kaarten groeiden, groeiden ook de toepassingen met meerdere schijven.

3Dfx Voodoo was, net als andere kaarten uit zijn tijd, beperkt tot hoeveel het kon doen in een render slagen voor. Dit is in wezen een volledige weergavevolgorde: van het verwerken van hoeken tot het rasteren van het frame en het veranderen van de pixels in een uiteindelijke framebuffer. Twintig jaar geleden slaagden games bijna altijd in één keer.

De reden hiervoor was dat het qua prestaties erg duur was, omdat je de hoeken maar twee keer wilt bewerken om meer textuur aan te brengen. Een paar jaar na Voodoo moesten we wachten tot ATI Radeon en Nvidia GeForce 2 grafische kaarten beschikbaar kwamen, zodat we multi-draw konden maken in een enkele renderovergang.

Deze GPU's hadden meerdere textuureenheden per pixelverwerkingssectie (d.w.z. pijplijnHet was een makkie om een ​​gefilterde texel uit twee afzonderlijke texturen te halen. Dit maakte de light mapping nog populairder en veranderde de lichtwaarden als gevolg van veranderingen in de game-omgeving, waardoor de games volledig dynamisch werden.

Maar er is nog veel meer dat kan worden gedaan met meerdere texturen, dus laten we eens kijken.

Het is normaal om de hoogte te vermenigvuldigen

In deze reeks artikelen over 3D-rendering hebben we niet besproken hoe de rol van de GPU echt bij het hele probleem past (we zullen het nog doen, nog niet!). Maar als je terugkomt Aflevering 1en kijk naar al het gecompliceerde werk van hoekverwerking, je zou denken dat dit het moeilijkste deel van de hele array is voor de grafische processor om te renderen.

Het is al lang geleden en gameprogrammeurs hebben hun best gedaan om deze werklast te verminderen. Dit betekende het bereiken van de tas met visuele trucs en het verwijderen van zoveel mogelijk snelkoppelingen en trucs, wat hetzelfde visuele uiterlijk gaf van het overal gebruiken van meerdere hoeken, maar eigenlijk niet veel gebruikte om het te starten.

En de meeste van deze trucs, hoogtekaarten ve normale kaarten. De twee hebben betrekking op het feit dat de tweede kan worden gemaakt vanaf de eerste, maar laten we nu eens kijken naar een techniek genaamd: bump mapping.

Bij tuberkartering wordt een 2D-reeks gebruikt, de hoogtekaart genoemd, die eruitziet als een enkele versie van het oorspronkelijke weefsel. In de bovenstaande afbeelding is er bijvoorbeeld een realistische baksteentextuur toegepast op 2 vlakke oppervlakken. De structuur- en hoogtekaart ziet er als volgt uit:

De kleuren van de hoogtekaart geven de normen van het steenoppervlak weer (we hebben besproken wat normaal is) Aflevering 1 deze artikelreeks). Wanneer de weergavevolgorde het punt bereikt waarop de steentextuur op het oppervlak wordt aangebracht, wordt een reeks berekeningen gemaakt om de kleur van de steentextuur aan te passen aan normaal.

Hierdoor zien de stenen er, hoewel ze nog steeds volledig plat zijn, meer 3D uit. Vooral als je zorgvuldig naar de randen van de stenen kijkt, zie je de grenzen van de techniek: de textuur ziet er een beetje gedraaid uit. Om snel meer details aan een oppervlak toe te voegen, is het in kaart brengen van knollen erg populair.

Een normale kaart is als een hoogtekaart, maar de kleuren van die textuur zijn zelf normaal. Met andere woorden, er is geen berekening nodig om de hoogtekaart te normaliseren. Je vraagt ​​je misschien af ​​hoe kleuren kunnen worden gebruikt om een ​​pijl in de ruimte weer te geven. Het antwoord is simpel: elke texel is een specifieke R, G, B waarden (rood, groen, blauw) en deze nummers zijn direct X ve Z waarden voor de normale vector.

In het bovenstaande voorbeeld laat het linker diagram zien hoe de richting van de normaal verandert op een hobbelig oppervlak. Om dezelfde normalen in een platte textuur (middelste diagram) weer te geven, kennen we er een kleur aan toe. In ons geval, R, G, B Verhogen van de waarden (0.255.0) voor het rechte stuk en vervolgens de hoeveelheid rood voor links en blauw voor rechts.

Merk op dat deze kleur niet vermengd is met de originele pixel - het vertelt de processor in welke richting de normaal is gericht, zodat de camera de hoeken tussen de lichten en het gestructureerde oppervlak nauwkeurig kan berekenen.

Wanneer dynamische verlichting op het podium wordt gebruikt, komen de voordelen van bump en normale matching echt tot hun recht en berekent het renderingproces de effecten van lichtveranderingen per pixel, niet voor elke hoek. Moderne spellen gebruiken veel textuur om de kwaliteit van magie nu te verbeteren.

Deze realistisch ogende muur is ongelooflijk gewoon een plat oppervlak - de details over baksteen en mortel zijn niet gemaakt met miljoenen polygonen. In plaats daarvan doet het slechts 5 texturen en veel slimme wiskundige taken.

De hoogtekaart werd gebruikt om de normale kaart te maken om het pad van schaduwstenen naar zichzelf en alle kleine veranderingen op het oppervlak te simuleren. De ruwheidstextuur werd gebruikt om te veranderen hoe licht de verschillende elementen van de muur reflecteert (bijv. Een afgeplatte steen reflecteert consistenter dan de ruwe mortel).

De laatste kaart, met het label AO in de bovenstaande afbeelding, maakt deel uit van een proces dat mediacongestie wordt genoemd: dit is een techniek die we in een later artikel zullen bekijken, maar voorlopig alleen schaduwen.

Weefselmatching is erg belangrijk

Het is absoluut essentieel voor een getextureerd spelontwerp. Download de 2019-versie van Warhorse Studio Het koninkrijk komt eraan: redding Een first-person RPG opgericht in de 15e eeuw in Bohemen, een oud land in het Midden-Oosten van Europa. De ontwerpers wilden graag voor de betreffende periode een realistische wereld creëren. En de beste manier om de acteur honderden jaren geleden tot leven te brengen, is dat elk landschap, elk gebouw, elke kledingset, haar, dagelijkse producten, enz. Het moest de juiste look hebben.

Elke unieke textuur in deze enkele afbeelding in het spel is gemaakt door de artiesten en hun gebruik door de programmeurgestuurde render-engine. Sommige zijn klein, eenvoudig en hebben heel weinig nodig om andere weefsels (zoals kippenvleugels) te filteren of te verwerken.

Anderen hebben een hoge resolutie en vertonen veel fijne details; anisotroop gefilterd en vermengd met normale kaarten en andere texturen - kijk maar naar het gezicht van de man op de voorgrond. De verschillende vereisten voor het structureren van elk item op het podium worden uitgelegd door programmeurs.

Dit alles gebeurt nu in veel games omdat spelers wachten op meer detail en realisme. Texturen zullen groeien en zullen meer op een oppervlak worden gebruikt, maar het proces van het samplen van tekst en het toepassen op pixels zal in wezen hetzelfde zijn als op aardbevingsdagen. De beste technologie sterft nooit, hoe oud ook!