Architektura Fermi - Nvidia GF100 se představuje | Kapitola 3
Seznam kapitol
Nová generace grafických karet Nvidia byla už několikrát odložena a každá novinka vzbudí rozruch. Velká většina dosavadních informací byla spíše spekulativního rázu, ale ve dnešním článku vám konečně můžeme nabídnou konkrétní fakta o architektuře a vlastnostech čipu. Získali jsme je přímo na konferenci Deep Dive v Las Vegas.
Aby bylo možné renderovat ve filmech reálně vypadající postavy a objekty, je využíváno dvou technik - Teselace a Displacement mapping. Zjednodušeně řečeno, Teselace rozděluje velké trojúhelníky na menší a Displacement mapping mění jejich relativní polohu vůči základnímu bodu. Společně obě techniky dokáží vymodelovat opravdu detailní a visuálně propracované tvary z relativně jednoduchého prvotního vektorového modelu. Tímto způsobem byl například doplněna do filmu "Piráti z Karibiku" postava Davy Jonese (na obrázku). Díky teselaci a DM je pak možné také velice dobře přizpůsobit scénu poměrně dokonale výkonu grafického hardware. Pokud prostě grafická karta nestačí, scéna se bude renderovat s menšími detaily. Stejně tak potom není problém renderovat blízké objekty v perfektní kvalitě a naopak vzdálené modely, které ani nejsou pořádně vidět, lze snadno "ošidit" a vykreslit s minimem detailů.
Grafická pipeline u GF100 byla značně přepracována. "Geometry processing" byl přemístěn z obvyklého místa na front-endu pipeline do takzvaných PolyMorph enginů. Každý z těchto enginů obsahuje Teselační jednotku a Geometry jednotku (povíme si o nich detailně později). Vygenerované tvary jsou poté převáděny na pixely v Raster enginech, jež pracují paralelně (u G200 pracují sériově). Vyšší propustnosti mezi SM bloky a Teselačními jednotkami napomáhá přítomnost L1 a L2 cache. Teselace a Geometry operace jsou v GF100 prováděny paralelně a výsledný výkon je vskutku vysoký. Nvidia uvádí až 8× nárust výkonu v geometrických operacích. Jádro GF100 je vytvořeno jako první s možností paralelního Geometry procesingu, jež přináší zlomový výkon v operacích Teselace a Displacement mappingu.
Geometrický realismus
Jak už jsem řekl v úvodu, hlavními stavebními kameny jsou Teselace a Displacement mapping. Až doteď jsme se s nimi setkávali spíše ve filmech a i když nejde o žádné nové techniky, do počítačových her se zatím společně mnoho nedostaly. Prostě dříve nebyla dostatečná podpora v obecně používaných grafických rozhraních a teprve s příchodem DirectX 11 začalo mít smysl o podobných technologiích uvažovat. Jádro GF100 bylo vytvořeno tak, aby v tomto směru udávalo krok dnes i do budoucna.
Dnešní grafici používají k tvorbě modelů klasické 3D editory jako je například Mudbox, ZBrush, 3D Studio Max, Maya nebo třeba Softimage. Ve všech aplikacích jsou nástroje pro pokrytí povrchů Displacement mappingem, jež pomohou při tvorbě postav a prostředí. Grafik zde většinou musí manuálně vytvořit model z polygonů, se všemi možnými detaily a scénáři použitými v budoucí hře. V potaz musí hlavně brát hratelná fps, takže model nelze udělat dle libosti. Vzhledem k malému geometrickému výkonu dnešních GPU nemůže být nijak závratně složitý a komplexní. Modely jsou sestaveny z limitovaného množství trojúhelníků (polygonů) a pokryty požadovanou texturou. Připravený model jde poté skrze PCI Express sběrnici do GPU, které jej zpracuje a vykreslí. Limitem pro detailnost modelů je dneska hlavně menší geometrický výkon GPU a také PCI Express rozhraní a jeho nedostatečná propustnost. V tomto směru jsou i nejhezčí hry dneška spíše kompromisem a modely jsou i tak hodně jednoduché. Obrázek ukazuje příklad ze hry Far Cry 2:
Pouzdro na zbraň a řemen jsou nereálně placaté, střecha na kůlně z vlnitého plechu je zcela placatá a dojem je vytvořen pruhovanou texturou. Stejně jako většina postav ve hře, má i tato pokrývku hlavy - skrytí nemožnosti vytvoření reálného modelu vlasů.
Teselace v praxi
Použitím Teselace může herní vývojář poslat do GPU stále datově malou informaci o geometrii objektu nebo postavy, Teselátory se již postarají o pěkný a komplexní model zobrazený na monitoru. Nároky na propustnost PCI Express rozhraní se nezvýší a model je mnohem realističtější. Jak to tedy funguje následuje dále na obrázcích:
Nalevo je běžný 3D model sestávající z polygonů, jež dávám tušit jasné obrysy postavy. Takovýto model je pro dnešní hry zcela běžný. Uprostřed je pak ten samý model, který prošel Teselátorem. Hrany jsou krásně zahlazené, mnoho detailů ale nevidíme. Důležitý je fakt, že žádná z ploch objektu není na některých místech "placatá", ale vše má reálné (oblé) tvary. Čtvrtý obrázek pak představuje kompletní model, na nějž byl aplikován Displacement mapping.
Vidíte, že není nutné žádné berličky v podobě textur a dalších triků, aby měl objekt detaily a vypadal skutečně dobře. Zde je vidět patrný rozdíl mezi GPU dnešních dnů bez Geometry processing funkcí a generací novou s Teselátorem. Zde už stačí si jen přát, aby se to rychle ujalo ve hrách a u vývojářů. Podívejte se dále na obrázky Impa ve finální podobě:
Displacement mapping v praxi
Tato metoda je mocným nástrojem pro zjednodušení 3D grafiky. Obrázek ukazuje jednoduchou texturu nalevo, kterou pokud aplikujete na rovný povrch, automaticky jej Teselátor s Displacement mapping převede do 3D modelu. Podobný model bychom běžným způsobem vytvářeli dlouho a jeho popis pro GPU by byl rozsáhlý. Definovat takový tvar běžně pomocí polygonů by bylo neuvěřitelně složité, naopak ale pro Teselátor s displacement mappingem stačí definovat výšku černých bodů, o vše se už postará jednotka sama. Nejkrásnější na tom je, že počet polygonů základního modelu je úplně minimální, jedná se v podstatě o rovnou plochu a prostorový efekt je dále definovaný v height-map textuře, kterou vidíte nalevo. Více podrobností o této technologii si můžete přečíst na wikipedii.
Na rozdíl od normálových a parallax map, které jsou definovány umístěním pixelů, displacement mapa je definována pozicí vrcholů (například barevně odlišených). Používat na objekty jen displacement mapy by bylo ale hardwarově náročné, proto se kombinuje s klasickým Bumb mappingem a normálovými mapami. Například k vytvoření děr na povrchu, což reprezentuje obrázek se dveřmi a dírami po kulkách. Obrovskou výhodou je i přes jednoduché zadání objektu, jeho reálný vzhled a chování v animacích. Stíny, hrany a všechny aspekty vždy odpovídají modelu a nejsou z žádného pohledu deformované. Ještě jednou k obrázku dveří. Běžně je možné vystřílet stopy kulek do železných dveří, ovšem bez viditelného prohnutí míst kolem vstupů kulek. Pomocí displacement mappingu je to hračka. Kolem dírek jsou "prohnutá" místa směrem do dveří a třeba i z pohledu z boku vidíte opravdu deformace a ne jenom plochý 2D "texturový efekt díry" bez dynamických stínů a dalších efektů.
Výhody Teselace a Displacement mappingu
Tento způsob má mnoho výhod. Reprezentace modelu je kompaktní, škálovatelná a nenáročná na místo a výpočetní výkon. Kompaktní reprezentace modelu znamená nízkou spotřebu paměti a nižší nároky na propustnost. Protože je zadání animace malé, je možné více na ní aplikovat náročnější operace a výpočty. Nejdůležitější vlastností je možnost pohybovat nahoru a dolů s parametrem LOD (Level of Details), probíhá totiž až v samotném GPU a nejsou k tomu nutná další data ze systému. Jak jednou zadání modelu dojde do GPU, všechny operace už probíhají on-chip. Z jednoho modelu lze různě nastaveným LOD vytvořit několik odlišně vypadajících modelů. viz. obrázek moře:
Minimální LOD vypadá opravdu ošklive
Maximální nastavení má tisícinásobně více detailů, ale nároky na hardware jsou pouze dvojnásobné
Jak vidíte základní model je stejný, jen je na něj aplikován minimální a maximální LOD. Tato operace se dá dělat dynamicky bez dalších složitých operací a v reálném čase. Nejvyšší LOD je samozřejmě náročnější na výkon, bez změny původních modelů lze u různě výkonných konfigurací nastavit jen LOD a tím přizpůsobit fps hratelným úrovním na různě výkonném hardware. Veškeré vykreslování objektů je také závislé na velikosti objektu a jeho vzdálenosti od hráče, kdy malé nebudou vykresleny s vysokým LOD a naopak blízké a velké objekty ano. O správné vybalancování této zátěže se starají jednotky v jádře GPU.