Hardwarová teselace je cestou k lepší 3D grafice

0

Historie: od RT- a N-patches (TruForm) až po DirectX 11

Teselace je po příchodu DirectX 11, nových Radeonů HD 5000 s čipy Cypress, Juniper a Redwood i po odhalení architektury Nvidia GF100 (Fermi) zmiňována stále častěji. Podpora ve standardu a dedikovaný hardware pokládá teselaci červený koberec. Hned na začátku musíme udělat jednu úmluvu: v článku se budeme bavit o teselaci, jakožto pojmu herní počítačové grafiky a nebudeme brát v úvahu jiné než polygony tvořené modely a ani žádné přírodní formy teselace.

Ačkoli by to tak mohlo vypadat, teselace se ve smyslu snahy o kvalitnější 3D modely bez zvýšení náročnosti na úzká hrdla architektury počítačů, neobjevila jako blesk z čistého nebe na podzim roku 2009. I pokud se omezíme na herní GPU, má už za sebou pomalu celou dekádu pokusů a vývoje.

Zatímco dnešním úzkým hrdlem může zůstávat třeba výkon procesoru (CPU), v roce 2001 se řešila především propustnost sběrnice grafické karty. Zatímco současná PCI Express 2.0 ×16 umožní přenést 8 GB/s, tehdejší AGP 4× se dotáhla na 1 GB/s a PCI měla 133 MB/s. Pro detailní modely a objekty alespoň připomínající organické tvary bylo však třeba mnohonásobně jemnější trojúhelníková sítě a množství dat pro sběrnice nepěkně rostlo.

V DirectX 8 se tak poprvé objevila podpora pro povrchy vyšších řádů (HOS, High Order Surfaces). Pod vznosným termínem si představte jakoukoli plochu (plát), který není pouhou rovinou. Určuje jej typicky tedy křivka. Na první cestu se vydala Nvidia a pro svůj pokrokový čip NV20 (GeForce 3) si vybrala parametrické povrchu, tzv. RT-patches (patch = plát). RT-patches se ale především vinou dvou svých aspektů neujaly. Tím prvním byla výpočetní náročnost, tím druhým potom nutnost udržovat dva druhy modelů (s a bez RT-patches kvůli nekompatibilnímu HW).

Vlevo je původní model konvičky, vpravo s RT-patches (64). Výsledek je bezesporu dobrý, ale výkon GeForce 3 u jediného modelu poklesl z 610 na 46 fps. Více v článku NVIDIA GeForce3 Review, v němž uvidíte i vliv na výkon s různou úrovní dělení RT-plátů. Zdroj: Andrey Vorobiev a Alexander Medvedev, iXBT labs

ATI byla v době vydání GeForce 3 v poměrně hlubokém stínu konkurenční Nvidie, vše měl ale změnit Radeon 8500 (R200). Jedním z trumfů mělo být využití druhého a snad lepšího způsobu nasazení povrchů vyšších řádů: N-patches. N-pláty (nebo možná lépe Bézierovy pláty) možná znáte pod pojmem PN-triangles, ale určitě je znáte jako TruForm. R200 měl pro TruForm a tedy teselaci vyhrazenou část čipu a N-patches ani v počtu dostatečném pro kýžené „zakulacení“ neznamenaly smrtící pokles na zlomky výkonu bez nich.

Kritika parametrických povrchů (nahoře) spočívala v nutnosti vývojářem udržovaných dvou druhů modelů (kvůli HW bez jejich podpory). Zdroj: ATI

Udělat z plochého trojúhelníku organicky působící Bézierův plat byl pro TruForm dle demonstrace jednoduchý úkol spočívající v dělení na více a více trojúhelníků a dopočítání normálových vektorů pro jejich vrcholy. Jestli vás dělení povrchů a organicky působící modely zaujaly, můžete se více dočíst v článcích na Gamasutra: Subdivision surface theory a Curved Surfaces using Bézier Patches.

Technologie TruForm byla prezentována ve známém demu ATI Dolphin vyšlým společně s Radeonem 8500 a stále dohledatelným ke stažení. Později ATI zapracovala na záplatě pro Half-Life (a Counter-Strike) a celý seznam her s údajnou podporou TruForm čítal tuším ke dvaceti kusům. Praxe ale nebyla tak růžová jako whitepaper od ATI. Jednou z her s podporou TruForm (N-patches) byl třeba na Quake III enginu (OpenGL) založený Return to Castle Wolfenstein. U něj se o technologii staral sám výrobce hry a vy jste mohli úroveň teselace specifikovat sami v konzoli (příkazy \r_ext_ATI_pn_triangles „1“ a \r_ati_truform_tess „x“, kde x je 1–7 a odpovídá úrovni teselace).

Ani tato a ani další hra s jakousi „nativní“ podporou TruForm se všan nevyhla občasných chyb v zobrazení, jež se týkaly především deformace textur, jež původně počítaly s rovným povrchem. Tou druhou hrou, se kterou jsem měl ve spojitosti s TruFormem svého času bohaté zkušenosti je Serious Sam: The Second Encounter. Funkčnost TruForm jste si mohli snadno ověřit na tvarech jako konvička či prstenec v tzv. Technology testu, který byl součástí hry. Ve hře samotné pak TruForm fungoval taky, na něčem přinášel poměrně pěkné výsledky, jinde se nevyhnul kolizi s texturami. Možná i Serious Sam se ale zasloužil o materiál pro zlé jazyky, který TruForm bral jako technologii pro nafouknuté tvary.

 

Obvyklé chybky Trueform místo TruForm si nevšímejte, raději zajděte do článku na iXBT s celou řadou dalších (i méně hezkých) příkladů nasazení N-patches ve hře Serious Sam SE. Zdroj: Alexander Medvedev, iXBT labs

Radeon 9700 Pro (R300) poté přišel s vylepšením této technologie, TruForm 2.0. N-patches už nemusely být počítány matematicky (viz výše), ale získány díky displacement mapě. Vše hezky pochopíte na příkladech z praxe od Štěpána Prokopa v poslední kapitole.

TruForm 2.0 prezentovaný s Radeonem 9700 Pro. Zdroj: ATI

Ačkoli tedy v podstatě R300 představený v létě 2002 podporoval teselaci takřka jako je tomu dnes u DirectX 11 GPU, ATI nedokázala TruForm 2.0 u vývojářů prosadit. R300 a potom všechny DX9.0c (shader model 3.0) GPU podporovaly render_to_vertex_buffer, takže teoreticky mohly být použity pro teselaci, hry si ale v mezidobí a v tom lepším případě vystačily se simulací hrbolatosti či detailnosti pomocí normálových map a parallax mappingu.

Přestože ATI snad z Catalyst po čase podporu TruForm odebrala úplně a hardwarovou jednotku pro TruForm (či teselaci) v Radeonech X1000 už nezmiňovala, tato myšlenka ji neopustila. U nešťastného R600 (Radeon HD 2900) tu byla s tentokrát už dedikovaným teselátorem zpět a opět tu bylo i demo pro teselaci (stále ke stažení z ATI/AMD)

Posledním výkřikem na téma teselace před příchodem Cypress (Radeon HD 5870, první DirectX 11 GPU) bylo demo Froblins, prezentované společně s Radeony řady HD 4800 (RV770). Froblins si také můžete ještě stáhnout a vyzkoušet.

Adaptivní GPU teselace ve Froblins znamenala až 18 milionů trojúhelníků na snímek při plynulém zobrazení na soudobém HD 4800

Teselace, displacement mapping a co umí

Co je teselace

Nejprve si zopakujme, co jste se o teselaci mohli dočíst v jedné aktualitě krátce po vydání Radeonů HD 5800.

Teselace

Zjemnění trojúhelníkové sítě není žádnou novinkou, vylepšit tehdejší low-polygonové (hranaté) modely se pokoušela už v době GeForce 3 Nvidia s RT-patches a později trochu výrazněji ATI s TruFormem (N-patches). TruForm (fixní zjemnění na základě zhruba třetin stran trojúhelníka) podporovaný na Radeonech 8500 a 9000 se dočkal implementace v podobě záplaty do Half-Life a poté ustrnul. Radeon 9700 podporoval myslím už nějakou formu adaptivní teselace a Radeon HD 2900 XT (R600) měl dokonce dedikovanou HW jednotku pro teselaci (teselátor), ale praxe pořád daleko.

Jenže nyní přichází doba DirectX 11 a teselace je v tomto standardu pevně ukotvena. Jak rychle ji začnou vývojáři používat (a zda ji potřebují), to už záleží na nich, ATI (tedy AMD) jim pro tento účel dává hardware s dedikovanou jednotkou pro teselaci. Obrázky s a bez zjemnění trojúhelníkové sítě modelů pomocí teselace si můžete porovnat pod tímto odstavcem:

Jak bylo řečeno, teselace znamená zjemnění (zaoblení) geometrického modelu. Tento proces tedy nedokáže do modelu přidat detaily, které tam nejsou. To, co je nám často servírováno jako příklad teselace (například konstrukce z bílých prken v citované pasáži), je ve skutečnosti displacement mapping. Jak si vysvětlíme později, displacement mapping je jednou z forem teselace; protože však slouží k trochu jinému účelu, budeme tyto dva pojmy rozlišovat, jak je tomu i v materiálech AMD k teselaci na Radeonech HD 2000.

Teselace jakožto zjemňování geometrie

Teselace rozdělí každý trojúhelník na několik menších a celý model zaoblí. Vhodná je tudíž na postavy, zvířata, terén a některé jiné přírodní objekty.

Teselátor v grafických čipech ATI (na desktopu od generace HD 2000, stejný teselátor obsahuje i Xenos v Xboxu 360) podporuje několik způsobů dělení. Nejpokročilejším z nich je adaptivní teselace, která při zjemňování modelu bere v úvahu jeho hrany. Laicky řečeno pracuje tam, kde je to nejvíce potřeba. Podrobnost vygenerovaného geometrického modelu lze nastavit až do úrovně 64, jak udávají specifikace Direct3D 11. Tesselator starších Radeonů HD, k němuž lze přistupovat přes API Direct3D 9, umí maximálně 15 úrovní.

Jak se metody teselace na Radeonech HD liší od ATI TruForm na Radeonech 8500 vám vysvětlí Jirka Souček:

Jedna z možností teselace je využití, jehož koncept je podobný s DX8.1 N-Patches, ale i tak jde o zcela jinou úroveň (jak po stránce výsledné kvality, tak z hlediska nároků na výkon). N-Patches byla teselace statická využívající jeden algoritmus. Současná teselace umožňuje použít LOD, což znamená, že pro blízké objekty je použita vyšší úroveň, než pro vzdálené, což umožňuje soustředit výkon na zkvalitnění blízkých viditelných objektů, nikoli jím plýtvat na objekty, kterých si uživatel nevšimne. Tuhle funkci je schopen grafický čip ovládat zcela sám bez potřeby zásahu programátora, nejde tedy o žádné papírové vylepšení, které nakonec nikdo kvůli komplikacím nepoužije, naopak. Její přínos je možné vidět v současných hrách i DX11 demech. Pro DX11 teselaci též může být použita řada algoritmů, takže nehrozí vznik patvarů, kteří si možná někteří uživatelé pamatují z her při použití nevhodně aplikovaných N-Patches.

DX11 teselace si ale z N-Patches bere to dobré. Není třeba, aby hra byla od začátku vyvíjená s ohledem na teselaci – lze ji v jakékoli fázi vývoje doplnit, jak je to vidět na uvedených hrách. Právě možnost doplnění této technologie do již rozpracovaných her dělá z DX11 teselace snadno implementovatelnou technologii. Díky tomu nemusí uživatel čekat rok, nebo víc, než se dočká hry s podporou této novinky.

Geometrický model je tedy zjemněn, nyní je čas přidat detaily. O to se stará…

Displacement mapping a jeho předchůdci

Jak vykouzlit na jinak rovné zdi iluzi plastičnosti, aniž by to stálo příliš výkonu? Tuto otázku si kladli i naši dávní předkové a proto v DirectX 6 standardizovali bump mapping. Speciální textura (bump mapa) udává úpravu normály v každém pixelu. Vzhledem k tomu, že normála se používá při výpočtu osvětlení, může být výsledným efektem hrbolatý povrch, v češtině se pro bump maps ujal také pojem hrbolaté textury.

Bump mapping. Zdroj: Encyclopedia

Jednoduchý koncept funguje překvapivě dobře, ovšem pouze v případech, kdy vytvářené detaily vystupují z povrchu objektu pouze nepatrně. Není-li tato podmínka splněna, stane se toto:

Bump mapping. Zdroj: Damien Triolet, BeHardware

Zatímco bump mapping udává změny normál, normal mapping (normálové mapování) udává přímo absolutní hodnoty normál pro každý pixel, což má opět uloženo ve speciálné textuře (normálové mapě). Ta vzniká typicky pomocí rozdílu složitého a jednoduchého modelu, v 3D hře je pak použit jednoduchý model a normálová mapa.

Notoricky známý slajd pěkně ukazující princip tvorby a užití normálové mapy. Zdroj: ATI

O poznání pokročilejší technikou je parallax mapping. Iluze nerovného povrchu vytvořená na základě mapy s údaji o výšce je téměř dokonalá. Funguje i při pohledu pod úhlem a jediným slabým místem jsou okraje, které jsou stále rovné, neboť i geometrický model zůstává stále rovný. V důsledku toho je obtížné na povrchu, na němž se vyřádil parallax mapping, korektně zobrazit vržený stín. Některé typy stínů tedy s parallax mappingem nelze kombinovat, problémy dělají také některé implementace ambient occlusion.

Parallax mapping. Zdroj: Damien Triolet, BeHardware

Na větším obrázku, který najdete na serveru BeHardware / Hardware.fr, si také můžete všimnout, že kameny vymodelované parallax mappingem mají zubaté okraje. A protože multi-sampling, nejčastěji používaná forma anti-aliasingu, funguje jenom na hranách nalezených podle geometrického modelu, je na tyto zuby neúčinný. Aby toho nebylo málo, parallax mapping je kvůli složitým algoritmům, které používá, dost náročný na výkon.

Displacement mapping je kromě řešení výše zmíněných problémů také rychlejší – na příkladu s perfektně placatým základním modelem a s využitím adaptivní teselace podává dokonce dvojnásobné framerate. Na složitějších modelech, které musí teselace ještě předem zaoblit, budou nároky vyšší.

Displacement mapping. Zdroj: Damien Triolet, BeHardware

Displacement mapping už není pouhý trik. Podle výškové mapy se nové detaily přidají přímo do geometrického modelu. Aby jej bylo možné takto tvarovat, je nejdříve potřeba zvětšit počet polygonů a zde se využívá služeb teselátoru. Je tedy pochopitelné, že displacement mapping podporovaly Radeony HD 2000 (jejichž návrh počítal s obsáhlejší verzí Direct3D 10, než jaká byla nakonec pod tímto označením vydána), ale také GeForce 7. Důvod, proč se displacement mapping už dávno nepoužívá, je prostý – doposud chyběla standardizace v Direct3D. To se s jedenáctou verzí mění a displacement mappingu se tak otevírá cesta k většímu rozšíření.

Důvody využití, nároky na výkon, vyhlídky do budoucna

Proč používat teselaci

Když jsme si vysvětlili, co teselace umí, je nasnadě si ujasnit, v čem tkví její hlavní přínos. Není to totiž pouze lepší kvalita obrazu, jak byste se mohli domnívat – té by se dalo docílit jednoduše zvýšením složitosti geometrického modelu. Z jednoho důvodu se to ale nedělá. Pozice vrcholů totiž počítá a grafickému akcelerátoru předává procesor. Složitější geometrie by zvýšila nároky nejen na výkon procesoru, ale také na prostor v operační paměti, její propustnost a propustnost sběrnice PCI Express.

Proto je výhodné, aby procesor pracoval s co možná nejjednodušší geometrií a další vrcholy se dopočítaly přímo v grafickém čipu, jehož teselátor jakožto specializovaná jednotka zvládne tuto činnost rychle a efektivně. Je-li třeba, aby hra běhala svižněji, může k tomu použití teselace a displacement mappingu napomoci, případně lze získanou výkonovou rezervu použít na zvýšení kvality obrazu.

Nároky

Teselace několika polymorph engine Fermi je prezentována jako násobně výkonnější oproti současné konkurenci. Zdroj: Nvidia

Že je teselátor specializovaná jednotka, ještě zdaleka neznamená, že by jeho použití bylo zadarmo. Dopad na výkon pak zdaleka nezávisí jenom na rychlosti této jednotky, jak by se mohlo zdát z grafu nadepsaného „Tesselation Performance“. Procesor a hlavní paměť byly sice složité geometrie ušetřeny, grafickému čipu však stále bude ležet na bedrech složitější scéna.

Použití teselace jako prostředku ke zlepšení kvality obrazu znamená skokové navýšení počtu trojúhelníků scény a vytváří vysokou zátěž na triangle setup. Jak její název napovídá, tato jednotka na začátku renderování snímku připravuje trojúhelníky, se kterými grafický čip dále pracuje. Triangle setup zpravidla pracuje tempem jednoho trojúhelníku za takt, řádově tedy stovky milionů za sekundu. Dosud byla jeho rychlost s velkou rezervou dostačující i pro high-endové čipy. Použití teselace na mnoho objektů by ale mohlo vést k situaci, kdy triangle setup nebude stíhat zbytek GPU krmit trojúhelníky a přidávání dalších shaderů a texturovacích jednotek nepovede ke zvýšení framerate.

Jako první na tento problém musela zákonitě narazit Nvidia. Fermi má být výkonnější než Cypress, ale základní frekvence jádra je nižší, což by znamenalo úměrně tomu pomalejší triangle setup. (Jak se Nvidia s tímto možným omezením poprala, si řekneme v následující pasáži.)

Složitější geometrie ale nezvyšuje nároky pouze na triangle rate. Výpočetně náročnější jsou stíny a ambient occlusion (SSAO, HDAO), multi-sampling anti-aliasing musí vyhlazovat více hran. Použití teselace tedy v důsledku zatěžuje unifikované shadery, texturovací jednotky i ROP/RBE jednotky.

Implementace ATI a Nvidie

Nikdo nepochyboval o tom, že co se týče implementace teselátoru, má ATI nezanedbatelný náskok. Vždyť teselátor v nových Radeonech je evolucí toho, který obsahuje i Xenos, grafický čip konzole Xbox 360, a dále pak všechny Radeony HD. Před inženýry Nvidie tak stála pořádná výzva. Jak dobře se s ní vyrovnali, to budeme moci posoudit až na základě testů. Už nyní ale víme, že Nvidia pojala teselaci diametrálně odlišně.


Polymorph děsil posádku Červeného trpaslíka. Že by úmyslné popíchnutí? Zdroj: Wikipedia

Zatímco u ATI je teselátor jeden a jedná se o úzce specializovanou jednotku, Nvidia ke každému SM (streaming multiprocessor) bloku, kterých má Fermi šestnáct, přiřadila víceúčelový PolyMorph Engine.

Původně se spekulovalo, že Fermi teselátor neobsahuje a jeho funkci emuluje přes unifikované shadery. Přítomnost PolyMorph Engine tuto teorii zřejmě vyvrací, nicméně nelze vyloučit, že CUDA cores jsou k některým operacím využívány (umístění u SM bloků by tomu nasvědčovalo). A vlastně proč ne? Fermi slibuje nižší propady výkonu s akcelerací grafiky i fyziky zároveň na jednom GPU (toho je dosaženo rychlejším přepínáním vláken, způsobeným zřejmě mj. i použitím pamětí cache přímo v čipu), takže případné výpočty teselace příliš výkonu pro shading neukrojí.

Díky tomu, že Fermi obsahuje šestnáct jednotek PolyMorph, se Nvidia může chlubit několikanásobným výkonem teselace oproti ATI v bezejmenných syntetických testech. Ale jak se kalifornská společnost poprala s limitujícím triangle rate? Grafický čip je rozdělen na velké bloky, graphics processing clusters (GPC), z nichž každý má vlastní triangle setup a rasterizér. Fermi obsahuje čtyři GPC, takže teoreticky v ideálních podmínkách dokáže zpracovat čtyři trojúhelníky za takt. Ideální podmínky jsou takové, kdy jsou trojúhelníky malé – tedy přesně situace, která nastává s využitím teselace. Prakticky se Nvidii při interních testech podařilo dosáhnout rychlosti 3,2 trojúhelníků za takt.

ATI problém s triangle rate neřešila. Cypress má jeden triangle setup se zdvojeným rasterizérem. V high-endu, tedy u Radeonu HD 5970, který podle mého názoru bude hlavním soupeřem Fermi, se však problém elegantně vyřešil sám: multi-GPU zapojení totiž rychlost zpracování trojúhelníků účinně násobí.

Vyhlídky do budoucna: hardwarová vybavenost a konspirační teorie

Čistě z hlediska hardwaru má DirectX 11 našlápnuto velmi dobře. Podepsaly se na tom zejména dva důvody. Za prvé to bylo vydání Radeonů HD 5700, které za DirectX 11 a prvním high-endem zaostalo jen o pár týdnů. Za druhé to byla nedostupnost jakýchkoliv výkonnějších karet minulé generace (GeForce GTX a Radeonů HD 4800). Ve vyšších cenových segmentech tak nebylo jiné volby, než Radeonu z řady HD 5800, ve střední třídě pak i přes nepříliš dobrý poměr cena/výkon mnoho zákazníků dalo přednost Radeonu HD 5700 před zastaralou GeForce GTS 250.

A pak je tu Fermi s výraznou převahou hrubého geometrického výkonu, ze které bude Nvidia chtít vyždímat maximum. Je tedy možné, že bude vývojáře tlačit k využívání teselace až do té míry, kdy zvyšování počtu trojúhelníků nebude přinášet viditelné zlepšení kvality obrazu, ale kartám ATI bude v tomto „ultra high“ nastavení docházet dech, zatímco Fermi si díky duplikovanému triangle setupu zachová hratelné framerate.

Již při vydání Radeonů HD 2000 se hovořilo o možnosti využít teselaci u her portovaných z Xboxu 360. Nestandardní řešení se ale neuchytilo. Možnost portování her s teselací z Xboxu do Direct3D 11 zatím vypadá taktéž bledě. Co se nově vyvíjených titulů týče, jak naznačil Jirka Souček v minulé kapitole, teselaci lze do hry doplnit i v pozdější fázi jejího vývoje. Rozhodnutí ale vždy leží na vývojářích hry a grafického engine a ti mnohdy upřednostní dřívější vydání před byť malým zdržením. Není tedy divu, že na hry, které využijí plný potenciál teselace a celého Direct3D 11, si budeme muset ještě nějakou dobu počkat.

Teselace z prezentace 3D části GPU GF100 (Fermi). Zdroj: Nvidia

Pohled z druhé strany

Teselace a displacement mapping očima grafika 

Zajímalo nás také, jak jsou teselace a displacement mapping vnímány na straně vývojářů a grafiků. Oslovili jsme tedy českého grafika Štěpána Prokopa, kterého si možná pamatujete jako autora aprílové GeForce GTX 395 a který v diskuzích a na fóru ExtraHardware vystupuje pod přezdívkou SamanCZ. Následuje text, který nám Štěpán laskavě dodal za velmi krátkou dobu, za což mu děkujeme.


Ač se teselace a displacemenet zdají jako hodně náročné technologie, jejich tvorba pro samotného grafika až tak náročná není. Pokusím se stručně vysvětlit metody při použití těchto „dvou“ technologií na jednoduchých modelech, na obrázcích z mé tvorby a na obrázcích a videu od ruského grafika Alexeje Garbuzenka. Ten s teselací a displacementem pro herní využití experimentoval softwarovou metodou již dlouho predtím, než se objevila řada grafik od ATI, která to umožnuje hardwarově v DirectX 11.

Jak je napsáno výše v článku, samotná teselace umí pouze zjemnit mesh modelu, tedy jen jednotlivé trojúhelníky (triangle/tris) rozseká na menší trojúhelníky (jednotlivé metody/algoritmy jsou ukázány v obrázku od AMD). Takže pokud se teselace použije kupříkladu na jeden polygon, hráč to neuvidí, z rovné plochy se stane jen rovná plocha rozsekaná na větší počet trojúhelníků. Proto je potřeba teselaci kombinovat buď s modelem, který je vymodelovaný již s nějakými výstupky, které teselace následně jen zjemní, nebo s displacementem.


Teselovat rovný objekt nemá smysl

Na jednoduchém polygonu tvořeném dvěma tris ukáži, jak teselace funguje v praxi. Při použití dvou kroků teselace se z 2 tris stala plocha s 32 tris. Na dalších obrázcích  je pak výstupek, který bylo potřeba vymodelovat a teselace ho jen zahustila/rozsekala na více tris.

Na prvním obrázku je použita jedna vyhlazovací skupina (smoothing group), na druhém pak tři vyhlazovací skupiny. Tím si grafik určuje, kde na modelu vznikne hrana a kde naopak má model působit jednolitě. Chceme-li například vymodelovat nůž, musíme každou stranu čepele označit jinou vyhlazovací skupinou, aby mezi nimi vznikla hrana. Pokud by celý nůž byl zahrnut do jediné smooth group, teselace by zakulatila jeho ostří, což nechceme.

Tato metoda, kdy je pro teselaci použit vlastní promodelovanějsí LOD, se uplatní hlavně na složitých tvarech, takže kupříkladu na soše draka v Unigine Heaven benchmarku. Tento benchmark používá obě metody a zrovna na soše draka je kombinuje dohromady, tedy jak promodelovanější LOD, tak displacement. I s ukázkou ve videu s oním drakem to vysvětlím níže.

LOD neboli Level of Detail jsou modely, které hráč vidí v různých vzdálenostech. Pokud je blízko u objektu, tak vidí detailní model a pokud se od objektu začne vzdalovat, tak se následně jednotlivé LODy prolnou/prohodí a tím se ulehčí hardware (CPU a GPU) počítání. LOD modely se používají nejen na modely, které hráč vidí, ale i na shadow a kolizní modely, na obrázku je ukázán postup LOD pro kola kolejového vozidla. Postupně se snižuje počet tris z cca 400 na 8. Na velkou vzdálenost hráč vidí ten nejjednodušší LOD. Písmenem S jsou označené LODy pro shadow a kolizní model které hráč nevidí, a slouží jen pro vržení stínu a kolize o které se třeba hráč zastaví, nebo jsou použity pro výpočet fyziky. Vzdálenosti, ve kterých se jednotlivé LODy přepínají, určuje engine dané hry. Respektive buď programátor, nebo grafik v editoru daného engine (u geometrie vytvářené teselátorem ale LOD řídí GPU automaticky). Takovéto LODy má vetšina modelů ve hře.

Druhou metodou pro vytažení částí modelu do výšky je displacement, tedy zjednodušeně černobílá textura, kde černá barva určuje například nulu a bílá například deset (to určí programátor). Ve finále pak na scéně nastavené v centimetrech uživatel uvidí objekt, kde na textuře bíle nakreslené body budou vytažené o 10 centimetrů nad základní povrch – pokud by se na kouli použila černá textura s bílými tečkami, tak díky displacement mappingu by z koule vycházely bodce přesně v místech bílých teček. Většina grafiků zná displacement mapping, který je na dalsích obrázcích.


Wireframe


Diffuse


Displacement


Diffuse + displacement


Výsledek

Na prvním obrázku je wireframe použitého modelu, na druhém obrázku pak model s diffuse mapou (diffuse určuje barevnost, je to vlastně základní textura), na třetím obrázku je displacement mapa + normal mapa a je vidět, že model se vytáhl a zakulatil podle displacement mapy. Ona displacement mapa pro kolo je na obrázku spolu s normal mapou pod tímto odstavcem. Čtvrtý obrázek je diffuse mapa + displacement mapa + normal mapa, a pátý pak jen finální kompozice do fotografie společně s autem. Povrch skály jsem si vymodeloval a vyrenderoval jen kvůli stínu, ve finálním obrázku je z ní tedy použit jen stín.

Proč tam mám napsáno „height“? To proto že displacement mapa je vlastně výšková mapa. Jak je vidět, je při použití displacement mappingu model zakulacený, to proto, že jsem použil výškovou mapu stejně kvalitní, jako byla diffuse mapa a také proto, že mně nevadilo na render čekat několik desítek minut. Daný model se v podstatě podle té displacement mapy vytáhne a rozdělí na mnoho milionů trojúhelníků (zde prováděno softwarově, jinak by to byla úloha pro teselátor). Přímo tato metoda se pro hry zatím nepoužívá kvůli nedostatku výkonu, renderovaná scéna by měla příliš mnoho trojúhelníků. Malé detaily se řeší kupříkladu bump mappingem nebo normal bumpem (používá normal mapu). Tu tam také mám, kvůli detailům, které nebyly součástí displacement/height mapy.

Ve hrách se zatím uplatní jednodušší displacement, který má omezení právě na počet trojúhelníků na určitou plochu, takže třeba na ploše 10 × 10 centimetrů se model rozdělí třeba jen na 32 polygonů. Proto také bývají výškové mapy menší než ostatní textury – tedy pokud použité textury mají rozlišení např. 1024 × 1024 px, výšková mapa má pouze 128 × 128 nebo 64 × 64 px (aby vytáhla jen ty nejdůležitější části). O drobné detaily, pro které není potřeba tvořit další trojúhelníky, se pak postará třeba právě bump nebo normálová mapa.

Na následujících obrázcích a videu je vidět, co s daným modelem udělá výšková mapa v herním engine.

  
Základní model ze dvou trojúhelníků a jeho wireframe. Zdroj: blog Alexeje Garbuzenka


Neoptimalizovaný objekt, který vytáhla výšková mapa. Zdroj: blog Alexeje Garbuzenka

  
Optimalizovaný objekt, který vytáhla výšková mapa. Optimalizační algoritmy snížily počet trojúhelníků v místech, kde není potřeba nic vytahovat. Zdroj: blog Alexeje Garbuzenka

  
Ukázka optimalizací. Na prvním obrázku má model 812 trojúhelníků, na druhém už jen 699. Zdroj: blog Alexeje Garbuzenka

Na tomto videu (odkazu můžete využít pro větší okno videa se zobrazením „720p“) je krásně vidět, o jaké vytažení se stará právě height mapa. Alexej tam šoupátkem určuje, jak moc má height mapa objekt vytáhnout, teselace se pak postará jen o ještě větší zjemnění daného objektu, pokud se k němu hráč přiblíží. Ideální je to tedy na objekty, které se dají opakovat (textura sama na sebe navazuje a dá se tedy používat donekonečna, takže zdi, cesty, tašky na streše a tak podobně).

Tvorba výškové mapy je vcelku jednoduchá. Používají se na to zpravidla stejné programy, jako na tvorbu normálových map, tedy například Zbrush nebo MODO. Anebo generátory normálových map, jako třeba CrazyBump a další. Poslední možností je, že si ji grafik nakreslí ručně. Výškové mapy jako ta, co je na ukázce s normálovou mapou o kousek výše, si dělám ručně a následně si z nich i generuji normálové mapy – buď ve Photoshopu s pluginem nvTools od Nvidie (NVIDIA Normal Map Filter), nebo CrazyBumpem.

Teselace je v modelovacích programech také obsažena, nicméně se s ní moc dobře nepracuje. Ke stažení je také N-Patch Plugin od AMD, a to již někdy od dob DirectX 8. Grafici budou spíše asi využívat možnosti editorů, které jim připraví jejich programátoři v daných herních týmech přímo na jejich herním engine.

A zpátky ke třetí možnosti teselace a displacementu. Nejlepší variantou je kombinace všech tří možností: vedle teselace a displacement mappingu tedy kvalitního LOD modelu, kde ty nejvýraznější výstupky jsou vymodelované (kupříkladu rohy na hlavě draka). Na tento model je dále použita výšková mapa, která model zjemní a vytáhne menší výstupky (nebo naopak udělá ďolíčky, to v případě, že nula je nastavená někde mezi černou a bílou, tmavší odstín pak znamená záporné číslo). A teselace pak model dále zjemňuje podle toho, jak daleko se nachází od kamery, skrze kterou hráč vidí scénu.

To je dobře vidět na tomto videu (odkazu opět můžete využít pro větší okno videa se zobrazením „720p“) z Unigine Heaven benchmarku.

Teselace zjemní povrch podle toho, jak daleko se od něj hráč nachází. Proto dnes nelze použít ve hrách právě jen samotný displacement, jak ho já a jiní grafici používáme běžně při renderování raytracingem. Ten zkrátka zjemňuje příliš a celý model. Takže ve hrách, ve chvíli kdy dojde řada na ten správný LOD, se nejprve zobrazí jednoduchý displacement jako v ukázkách s dveřmi od Alexeje, a ten následně teselace zjemní, pokud se k němu ještě více přiblížíme.

Někdy jsou ale použité i nevhodné LOD, kupříkladu na schodech v Unigine Heaven mohli tvůrci místo placatých schodů klidně použít schody vymodelované. V dnešních hrách se s plochými schodišti nesetkáme, vývojáři si naštěstí tu práci dají a schody modelují (neznám žádnou hru, kde by jeden z LOD pro schody byla placka). Pro různé verze DirectX, třeba DX9 a DX10, je lepší používat LOD, které vídáme ve hrách dnes, a pro DX11 a teselaci pak další LOD upravené přímo pro teselaci s displacementem. Základní LOD pro teselaci a displacement totiž bez těchto efektů může vypadat a často i vypadá právě jako placka. Při zobrazení v nižších verzích DirectX a tedy bez teselace a displacementu by hra vypadala „hnusně“ jako již zmíněné schody v benchmarku Unigine Heaven.

Poslední obrázek, který jsem připravil, je kolo použité ve hře Motor M4X All Terrain Driving/Offroad Extreme od českých/slovenských tvůrců The Easy Company. Hra je teď tuším k dostání za necelou stokorunu na novinových stáncích.

Vlevo je vidět model s promodelovaným vzorkem a jeho počet trojúhelníků, vpravo pak model bez promodelovaného vzorku a jeho počet trojúhelníků. V té době ještě DirectX 11 nebyl k dispozici, a tak se vzorek musel vymodelovat – to ale znamená, že CPU musí počítat na každém kole 2680 trojúhelníků (a jejich vertexy) navíc (vertex je bod, každý trojúhelník má tři vertexy na každém svém vrcholu). V této hře to problém nebyl, protože bugina, kde je to kolo použité, je ve hře jen jedna, tedy jen čtyři taková kola ve scéně. Pokud by ale byla takto detailní všechna kola u všech aut ve hře, tak by počet trojúhelníků v celé scéně velice stoupl a CPU by musel počítat o mnoho víc. Dnes by se to vyřešilo právě výškovou mapou, která by vzorek vytáhla a CPU by tak měl méně práce, protože by počítalo jen s modelem o 848 trojúhelnících. Veškerou práci navíc tak provádí GPU.

— Štěpán „SamanCZ“ Prokop


Použitá literatura:

Hardwarová teselace je cestou k lepší 3D grafice

Ohodnoťte tento článek!