V první části, kde se podrobněji podíváme na tvorbu 3D her, se zaměříme výhradně na nejvyšší fázi procesu. To znamená přetahovat naše učebnice matematiky, opracovávat lineární algebru, matice a trigonometrii - ach jo!

Budeme moci, jak se transformují 3D modely a jak se počítají světelné zdroje. Rozdíly mezi shadery vrcholů a geometrie budou důkladně prozkoumány a uvidíte, kam se mozaikování hodí. Abychom pomohli s vysvětlením, použijeme diagramy a příklady kódu, abychom ukázali, jak se ve hře zachází s matematikou a čísly. Pokud na to všechno nejste připraveni, nebojte se - můžete začít. Tvorba 3D her 101. Jakmile je však nastaven, přečtěte si náš první pohled na svět 3D grafiky.

Jaký je účel?

Ve světě matematiky je bod jednoduše místem v geometrickém prostoru. Není nic menšího než bod, protože nemá žádnou dimenzi, takže je lze použít k jasnému definování, kde objekty jako čáry, roviny a objemy začínají a končí.

U 3D grafiky jsou tyto informace velmi důležité pro určení toho, jak bude všechno vypadat, protože všechno zobrazené je jako přímka, rovina atd. Je to sbírka. Na obrázku níže je snímek obrazovky z vydání Bethesdy z roku 2015 Fallout 4:



Může být trochu těžké vidět, jak je to jen jedna velká hromada teček a čar, takže vám ukážeme, jak vypadá stejná scéna v režimu „drátového modelu“. Modul 3D vykreslování přeskakuje textury a efekty vytvořené ve fázi pixelu a nekreslí nic jiného než barevné čáry spojující tečky.



Všechno teď vypadá velmi odlišně, ale můžeme vidět různé objekty, nastavení a všechny řádky, které se spojují a tvoří pozadí. Některé jsou jen hrstkou čar, jako jsou kameny v popředí, zatímco jiné mají tolik čar, které vypadají pevně.

Každá tečka na začátku a na konci každého řádku byla zpracována hodně matematiky. Některé z těchto výpočtů jsou velmi rychlé a snadné; jiné jsou mnohem obtížnější. Při společné práci na skupinách bodů, zejména v trojúhelníku, dochází k významnému zvýšení výkonu, pojďme se na ně tedy blíže podívat.

Co je potřeba pro trojúhelník?

název trojúhelník říká nám, že tvar má 3 vnitřní úhly; K tomu potřebujeme 3 vrcholy a 3 čáry spojující vrcholy. Správný název rohu kopec (rohy jsou množné) a každý je definován tečkou. Protože jsme založeni na 3D geometrickém světě, Kartézský souřadnicový systém pro body. Obvykle se to píše jako 3 hodnoty společně, například (1, 8, -3) nebo obecněji (X ve Z).

Odtud můžeme přidat další dva vrcholy a získat trojúhelník:

Všimněte si, že zobrazené čáry nejsou opravdu nutné - mohou mít pouze body a říci systému, že tyto 3 vrcholy tvoří trojúhelník. Všechna data vrcholů jsou uložena v souvislém paměťovém bloku zvaném a rohový nárazník; Informace o tvaru, který udělají, jsou kódovány přímo do vykreslovacího programu nebo uloženy v jiném paměťovém bloku. vyrovnávací paměť adresáře.

V případě prvního se nazývají různé tvary, které lze vytvořit z vrcholů primitivní Direct3D představuje seznam, proužky a vějíře jako tečky, čáry a trojúhelníky. Při správném použití pomáhají trojúhelníkové pruhy zlepšit výkon pomocí rohů pro více trojúhelníků. V níže uvedeném příkladu vidíme, že k připojení 2 trojúhelníků jsou potřeba pouze 4 vrcholy - pokud by byly samostatné, potřebovali bychom 6 vrcholů.

Pokud chcete zpracovat větší sbírku vrcholů, např. herní model NPC, pak a - toto je další blok paměti, ale skládá se z několika vyrovnávacích pamětí (vertice, index atd.) a zdrojů textur pro model. Společnost Microsoft poskytuje rychlý úvod do těchto použití vyrovnávací paměti. online dokumenty zdroj.

Prozatím se zaměřme na to, co se s těmito rohy ve 3D hře děje, pokaždé, když se vytvoří nový snímek (pokud si nejste jisti, co to znamená, proveďte znovu rychlé skenování) vykreslit 101). Jednoduše řečeno, jedna nebo dvě věci se jim dělají:

  • Přesuňte vrchol na nové místo
  • Změňte barvu rohu

Jste připraveni na matematiku? Dobrý! Protože tak se to dělá.

Zadejte vektor

Představte si, že na obrazovce je trojúhelník a stisknutím klávesy jej posunete doleva. Přirozeně (X ve Z) počty jednotlivých špiček se odpovídajícím způsobem mění, a to jsou; ale, Jak To se může zdát trochu neobvyklé. Drtivá většina systémů pro vykreslování 3D grafiky používá k provedení dané úlohy spíše konkrétní matematický nástroj než změnu souřadnic: vektory.

Vektor lze považovat za šipku, která ukazuje na konkrétní místo v prostoru a může mít libovolnou požadovanou délku. Takto jsou vrcholy ve skutečnosti popsány pomocí vektorů založených na kartézských souřadnicích:

Všimněte si, jak modrá šipka začíná v určitém místě (v tomto případě původ) a sahá až k vrcholu. použili jsme to, čemu se říká czápis smrti popsat tento vektor veslování funguje také displej. Také si všimnete, že existuje ještě jedna hodnota navíc - 4. číslo je obvykle w složka a slouží k označení, zda je vektor použit k popisu polohy vrcholu ( vektorová poloha) nebo obecný aspekt (a noc vektor). V případě druhé bude vypadat takto:

Tento vektor ukazuje ve stejném směru a má stejnou délku jako předchozí poziční vektor, takže (X ve Z) hodnoty budou stejné; Ale w-vektory komponent jsou nulové místo 1. Použití směrových vektorů bude objasněno dále v tomto článku, ale prozatím vezmeme v úvahu skutečnost, že všechny vrcholy ve 3D scéně budou definovány tímto způsobem. Proč? Protože v tomto formátu je mnohem snazší je začít přesouvat.

Matematika, matematika a další matematika

Všimněte si, že máme základní trojúhelník a chceme ho přesunout doleva. Každý vrchol je definován vektorem polohy, takže to, co musíme udělat, je „pohyblivá matematika“ ( konverze) musí na těchto vektorech pracovat. Zadejte další nástroj: série (nebo matka pro jednoho z nich). Toto je řada hodnot napsaných v řádcích a sloupcích, něco jako tabulka Excel.

Pro každý typ transformace, kterou chceme udělat, je k tomu přidružená matice a je to jen případ násobení transformační matice a pozičního vektoru dohromady. Nebudeme se zabývat konkrétními podrobnostmi o tom, jak a proč se to stane, ale můžeme vidět, jak to vypadá.

Přesunout vrchol ve 3D prostoru překlad a požadovaný výpočet je:

x0atd. hodnoty představují původní souřadnice vrcholu; delta-x hodnoty označují, o kolik by měl být vrchol posunut. Výsledkem výpočtu matice-vektor je jednoduché přidání dvou dohromady ( w komponenta zůstává nedotčena, takže konečnou odpovědí je stále vektor polohy).

Kromě pohybu věcí můžeme chtít trojúhelník otočit nebo jej zvětšit nebo zmenšit - pro oba existují transformace.

WebGL podporovaný grafický nástroj Webové stránky Rendering v reálném čase vizualizovat tyto výpočty na celém obrázku. Začněme s kvádrem ve výchozím umístění:

V tomto online nástroji je bodem modelu vektor polohy, zemská matice je transformační matice a bod zemského prostoru je vektorem polohy pro transformovaný vrchol.

Nyní použijeme různé transformace na kvádr:

Na obrázku výše obrázek překlad 5 jednotek v každém směru. Tyto hodnoty můžeme vidět ve střední velké matici v posledním sloupci. Původní poziční vektor (4, 5, 3, 1) zůstává tak, jak má být, ale transformovaný vrchol je nyní přeložen jako (9, 10, 8, 1).

V této transformaci je vše zmenšeno faktorem 2: kvádr má nyní strany, které jsou dvakrát tak dlouhé. Posledním příkladem, na který se podíváme, je bod otáčení:

Kvádr se otáčí pod úhlem 45 °, ale matice jejich ve kosinus otevři to. Rychlá kontrola jakékoli vědecké kalkulačky nám dává bez (45 °) = 0,7071 ... zaokrouhleno na 0,71. Dostaneme stejnou odpověď kosinus hodnota.

Matice a vektory nemusí být použity; Běžnou alternativou, zejména pro zpracování složitých rotací, je složitá čísla a čtveřice. Tato matematika je velkým krokem od vektorů, takže projdeme transformacemi.

Síla vrcholového shaderu

V této fázi musíme vzít v úvahu, že toto vše musí vyřešit lidé programující vykreslovací kód. Pokud vývojář her používá engine třetí strany (jako Unity nebo Unreal), bude to pro ně již provedeno, ale každý, kdo provádí své vlastní výpočty od nuly, bude muset zjistit, jaké výpočty je třeba provést ve kterých rozích.

Jak to tedy vypadá z hlediska kódu?

K tomu použijeme příklady z vynikajících webových stránek Braynzar Soft. Je to skvělé místo, kde se můžete naučit základy a pokročilejší věci, pokud chcete začít 3D programování sami ...

Tento příklad je konverze „vše v jednom“. Generuje odpovídající transformační matice na základě vstupu z klávesnice a poté je aplikuje na původní poziční vektor v jediné operaci. Všimněte si, že se to vždy děje v určitém pořadí (měřítko - otočení - převrácení), protože jakýkoli jiný způsob úplně zkreslí výsledek.

Takové bloky kódu se nazývají shadery vrcholů a mohou se značně lišit v tom, co dělají, jejich velikosti a složitosti. Výše uvedený příklad je stejně jednoduchý a pravděpodobně právě tak, jak přicházejí. prostě shader, protože nevyužívá plně programovatelnou povahu shaderů. Složitější pole shaderů jej může transformovat ve 3D prostoru, vypočítat, jak bude scéna vypadat na fotoaparátu, a poté tato data předat do další fáze procesu vykreslování. Podíváme se na další příklady, jak procházíme rohovou sekvencí zpracování.

Samozřejmě je lze použít mnohem více a nezapomeňte, že pokaždé, když hrajete hru hranou ve 3D, všechny pohyby, které vidíte, provádí grafický procesor podle pokynů ve vrcholových shaderech.

Přesto tomu tak nebylo vždy. Pokud se vrátíme v čase do poloviny až do konce 90. let, grafické karty té doby neměly schopnost zvládnout samotné vrcholy a primitiva, což vše se dělo zcela na CPU.

Jeden z prvních procesorů poskytujících vyhrazenou hardwarovou akceleraci pro tento typ provozu Původní GeForce společnosti Nvidia byla vydána v roce 2000 a tato vlastnost je označena Transformace hardwaru a osvětlení (nebo zkráceně Hardware TnL). Operace, které tento hardware zvládl, byly velmi rigidní a pevné z hlediska instrukcí, ale to se rychle změnilo, když byly představeny nové grafické čipy. Dnes neexistuje žádný samostatný hardware pro vykreslování vrcholů a stejné jednotky vykreslují vše: body, primitiva, pixely, textury atd.

mluvit o osvětlení, stojí za zmínku, že vše, co vidíme, je samozřejmě způsobeno světlem, takže se podívejme, jak to lze zvládnout ve špičkové fázi. K tomu použijeme něco, o čem jsme mluvili dříve v tomto článku.

Osvětluje motor kamery!

Představte si tuto scénu: herec stojí v temné místnosti osvětlené jediným zdrojem světla vpravo. Uprostřed místnosti je obrovská, plovoucí a robustní konvice. Dobře, pravděpodobně budeme potřebovat pomoc s vizualizací, takže Webové stránky Rendering v reálném čase, vidět něco takového v akci:

Nyní si pamatujte, že tento objekt je sbírka přímých trojúhelníků sešitých dohromady; to znamená, že rovina každého trojúhelníku bude směřovat do určitého směru. Některé směřují k fotoaparátu a jiné vypadají opačně, jiné jsou zakřivené. Světlo ze zdroje zasáhne každou rovinu a odrazí se pod určitým úhlem.

V závislosti na tom, kam světlo směřuje, se změní barva a jas roviny a toto vše je třeba vypočítat a vypočítat, aby barva objektu vypadala správně.

Nejprve musíme vědět, kterým směrem je letadlo otočeno, a k tomu normální vektor letoun. Je to další šipka, ale na rozdíl od pozičního vektoru nezáleží na jeho velikosti (ve skutečnosti jsou po výpočtu vždy zmenšeny, takže jsou přesně 1 jednotka dlouhá) a vždy dik (pravoúhlá) rovina.

Normála k rovině každého trojúhelníku je vektorovým součinem dvou směrových vektorů (p ve q (zobrazeno výše) tvoří strany trojúhelníku. Ve skutečnosti je lepší pracovat pro každý vrchol a ne pro každý trojúhelník, ale je rychlejší to udělat pouze pro trojúhelníky, vzhledem k tomu, že ve srovnání s druhým bude vždy více než druhý.

Jakmile dosáhnete normálu povrchu, můžete začít počítat se zdrojem světla a kamerou. Světla mohou být ve 3D vykreslování různých typů, ale pouze pro účely tohoto článku směrový světla, např. reflektor. Jako rovina trojúhelníku, bodové světlo a kamera budou mířit určitým směrem, možná něco jako toto:

Vektor světla a normální vektor lze použít k nalezení úhlu, pod kterým světlo dopadá na povrch (pomocí vztahu mezi součinem bodů a rozměry vektorů). Vrcholy trojúhelníku budou nést další informace o jejich barvách a materiálech - v případě druhého popisuje, co se stane se světlem, když dopadne na povrch.

Hladký kovový povrch bude odrážet téměř veškeré dopadající světlo v úhlu, ve kterém přichází, a stěží změní barvu. Naproti tomu hrubý, matný materiál rozptyluje světlo méně předvídatelně a jemně mění barvu. Z tohoto důvodu musí mít vrcholy další hodnoty:

  • původní barevná základna
  • Ambient material property - hodnota, která určuje, kolik světla „pozadí“ může vrchol absorbovat a odrážet
  • Vlastnost rozptýleného materiálu - další hodnota, ale tentokrát ukazuje, jak hrubý je vrchol, který ovlivňuje, kolik rozptýleného světla je absorbováno a odraženo
  • Spekulativní vlastnosti materiálu - dvě hodnoty udávající míru „jasnosti“ vrcholu

Různé modely osvětlení používají různé matematické vzorce k jejich seskupení dohromady a výpočet vytváří vektor pro odcházející světlo. To je kombinováno s vektorem kamery, lze určit obecný vzhled trojúhelníku.

Zde jsme prošli podrobnějšími detaily, a to z lepšího důvodu: Vezměte si jakoukoli učebnici o 3D vykreslování a uvidíte všechny kapitoly věnované tomuto jedinému procesu. Moderní hry však často provádějí většinu výpočtů osvětlení a materiálových efektů během fáze výpočtu pixelů, takže se tomuto tématu budeme věnovat znovu v jiném článku.

Všechno, co jsme doposud pokryli, bylo provedeno pomocí shaderů vrcholů a může se zdát, že téměř nic nemohou udělat; bohužel existuje. Shadery vrcholů nemohou vytvářet nové vrcholy a každý shader musí pracovat na každém vrcholu. Bylo by užitečné, kdyby existoval způsob, jak použít trochu kódu k vytvoření více trojúhelníků, mezi tím, co již máme (ke zlepšení vizuální kvality) a mít shader, který funguje na všech primitivech (aby se věci urychlily). dokud). S moderními grafickými procesory být schopen Udělej tohle!

Prosím, pane, chci další (trojúhelníky)

Nejnovější grafické čipy jsou extrémně výkonné a schopné miliónů maticových vektorových výpočtů každou sekundu; mohou snadno přejet velkou hromadu rohů v žádném okamžiku. Na druhou stranu je vytváření vysoce podrobných modelů velmi časově náročné a všechny tyto další podrobnosti budou zbytečné, pokud má být model trochu daleko od scény.

To, co potřebujeme, je způsob, jak říct procesoru, aby rozdělil větší primitivum, jako je jediný přímý trojúhelník, na který se díváme, do kolekce menších trojúhelníků, všechny spojené uvnitř původního velkého. Tento proces se nazývá: mozaikování a grafické čipy to dělají už dlouhou dobu; To, co se v průběhu let zlepšilo, je míra kontroly programátorů nad operací.

Abychom to viděli v akci, použijeme testovací nástroj Unigine's Paradise, protože nám umožňuje aplikovat různé množství mozaikování na konkrétní modely použité při testování.

Nejprve si vezmeme místo v benchmarku a prozkoumejme ho bez použití mozaiky. Všimněte si, že dlažební kostky na podlaze vypadají velmi falešně - použitá struktura je účinná, ale nevypadá dobře. Aplikujme na scénu mozaiku; Unigine aplikuje motor pouze na určité části, ale rozdíl je dramatický.

Podlaha, okraje budovy a dveře nyní vypadají mnohem realističtěji. Pokud proces znovu spustíme, můžeme vidět, jak toho lze dosáhnout, ale tentokrát se zvýrazněnými okraji primitiv (režim drátového modelu):

Jasně vidíme, proč podlaha vypadá tak divně - úplně plochá! Dveře jsou také v jedné rovině se stěnami a hrany budovy nejsou nic jiného než jednoduché kostky.

V Direct3D lze primitiva rozdělit na menší sadu částí ( pododdělení) spuštěním 3stupňové sekvence. Nejprve programátoři shader těla - v zásadě je tento kód oprava geometrie. Představte si to jako mapu, která sděluje procesoru, kde se uvnitř počátečního primitivu objeví nové řádky a řádky.

Dále tesselatorová jednotka uvnitř GPU použije opravu na zásadu. Konečně, shader pole je spuštěn, který vypočítá pozice všech nových vrcholů. Tato data lze podle potřeby přenést zpět do vrcholového bufferu, aby bylo možné výpočty osvětlení provést znovu, ale tentokrát s lepšími výsledky.

Jak to tedy vypadá? Zapálíme drátovou verzi scény s mozaikou:

Pravdou je, že jsme nastavili úroveň mozaikování na velmi extrémní úroveň, abychom pomohli vysvětlit proces. Jakkoli jsou moderní grafické čipy dobré, není to něco, co byste chtěli dělat v každé hře - vezměte si například lampu u dveří.

Na bezrámových obrázcích vás láká poznat rozdíl na tuto vzdálenost a můžete vidět tuto úroveň mozaikování naskládanou do tolika trojúhelníků, z nichž některé je těžké rozeznat. Používá se však přiměřeně a tato funkce vykreslování rohů může mít za následek některé skvělé vizuální efekty, zvláště když se pokoušíte simulovat kolize hladkého těla.

Na bezrámových obrázcích vás láká poznat rozdíl na tuto vzdálenost a můžete vidět tuto úroveň mozaikování naskládanou do tolika trojúhelníků, z nichž některé je těžké rozeznat. Pojďme se podívat na to, jak by to mohlo vypadat z hlediska kódu Direct3D; k tomu použijeme příklad z jiného skvělého webu RasterTek.

Zde je jeden zelený trojúhelník vykládán do mnoha dalších dětských trojúhelníků ...

Špičkové zpracování se provádí pomocí 3 samostatných shaderů (viz obr. příklad kódu): shader vrcholu k nastavení trojúhelníku připraveného k triangulaci, shader těla k vytvoření opravy a shader domény k vykreslení nových vrcholů. Výsledek je velmi jednoduchý, ale příklad Unigine zdůrazňuje potenciální výhody a nebezpečí používání mozaiky všude. Používá se však přiměřeně a tato funkce vykreslování rohů může mít za následek některé skvělé vizuální efekty, zvláště když se pokoušíte simulovat kolize hladkého těla.

Zvládne to, kapitáne!

Pamatujete si, že shadery vrcholů jsou stále spuštěny v každém rohu scény? Není těžké pochopit, jak teselace může z toho udělat skutečný problém. A existuje mnoho vizuálních efektů, se kterými chcete pracovat s více verzemi stejného primitivu, ale nechcete je vytvářet ve velkém počtu; vlasy, srst, tráva a explodující částice jsou toho dobrým příkladem.

Naštěstí existuje další shader právě pro tento druh věcí - shader geometrie. Jedná se o přísnější verzi shaderu vrcholů, ale lze ji použít na celou zásadu a v kombinaci s mozaikováním poskytuje programátorům větší kontrolu nad velkými skupinami vrcholů.

Direct3D, stejně jako všechna moderní grafická rozhraní API, umožňuje širokou škálu výpočtů na vrcholech. Finalizovaná data lze odeslat do další fáze procesu vykreslování (pixelace) nebo přivedeny zpět do fondu paměti, takže jej může procesor znovu zpracovat nebo přečíst pro jiné účely. To lze provést jako datový proud, jak zdůrazňuje Microsoft Dokumentace Direct3D:

výstup proudu Scéna je obzvláště užitečná pro efekty, protože dokáže přivádět všechny principy (nikoli jednotlivé vrcholy) zpět do vykreslovací smyčky, ale se spoustou částic všude. Stejný cheat lze změnit nebo dynamický vrcholová vyrovnávací paměť, ale je lepší udržovat vstupní vyrovnávací paměti pevné, protože je to výkonnostní zásah, pokud je třeba je „otevřít“ a nahradit.

Rohové vykreslení je kritickou součástí vykreslování, protože určuje, jak je scéna rozvržena z pohledu kamery. Moderní hry mohou k vytváření svých světů využívat miliony trojúhelníků a každý z těchto vrcholů bude nějak transformován a spálen.

Nakládání s touto matematikou a daty se může zdát jako logistická noční můra, ale grafické procesory (GPU) a API jsou navrženy s ohledem na toto všechno - malování továrny, která běží hladce, vypalování položky v řadě výrobních fází a dělá to dobře pochopíš.

Zkušený Tvorba 3D her programátoři mají rozsáhlé základy pokročilé matematiky a fyziky; Využívají každý trik a nástroj v obchodě k optimalizaci transakcí a snížení fáze transakční špičky na pouhých několik milisekund. A to je teprve začátek vytváření 3D rámečku - pak je tu fáze rasterizace a pak nějaké docela složité vykreslování pixelů a textur, než se dostane kamkoli poblíž vašeho monitoru.

Nyní, když jste dosáhli konce tohoto článku, doufáme, že jste získali hlubší vhled do cesty vrcholu při vykreslení pro 3D snímek. Nezahrnuli jsme všechno (to je muazzam článek!) a jsme si jisti, že budete mít spoustu otázek ohledně vektorů, matic, světel a primitiv. Nechte je na cestě v sekci komentářů a uděláme vše pro to, abychom na všechny odpověděli.

Přečtěte si také