TruForm - od teorie k praxi |
autor: Jahoda Miroslav , publikováno 7.4.2003 |
Jak víme, trojrozměrné modely všech dnešních her jsou tvořeny polygony, přesněji trojúhelníky. V reálném světě nejsou jen hranaté tvary, které se dají snadno vytvořit složením několika trojúhelníků, ale také oválné či kulaté, se kterými je to již těžší. První řešení, které nás asi napadne je, že trojúhelníková síť tvořící takový zaoblený model (například hlavu člověka) by měla být co nejjemnější, tedy obsahovat co nejvíce trojúhelníků. Jenže to je řešení hrubou silou a taková řešení mají zpravidla svá úskalí.
![]() |
Řekněme, že již dnešní hry obsahují modely složené klidně třeba z 5.000 polygonů a těchto modelů může aktuální scéna obsahovat samozřejmě více současně. Například dnes již postarší klasika Quake III Arena se pyšnil hrubým průměrem okolo 10.000 trojúhelníků na scénu. A určitě jste si všimli, že modely v Quakovi jsou pořád ještě dost hranaté. Takže kdybychom to chtěli řešit zjemněním modelů pomocí zvýšení počtu trojúhelníků, řekněme pětinásobně, dostáváme již průměr nějakých 50.000 polygonů na scénu a to je jen průměr, ve složitějších scénách se může jednat klidně o více než 100.000 polygonů. Pro těch 50.000 bychom odhadem potřebovali paměťovou propustnost okolo 3000 MB/s. Ti z vás, co rádi benchmarkují svoji sestavu a pamatují si čísla si uvědomí, že už taková průměrná scéna pak může narazit na úzká místa při zpracování počítačem. Jedná se především o propustnost sběrnic používaných při komunikaci s grafickou kartou - sběrnice AGP (v dávných časech PCI) a sběrnice systémové RAM. Na následující tabulce uvádím pro lepší představu propustnost těchto částí:
Propustnost (MB/s) | |
PC133 RAM | 1064 |
PC266 DDR RAM | 2128 |
PC400 DDR RAM | 3200 |
PCI | 132 |
AGP 4x | 1056 |
AGP 8x | 2112 |
První řešení, které je nasnadě je zavést nějaký fungující systém LOD - Level Of Detail (úroveň detailů). Jinými slovy, pro objekty, které jsou blíže použít více detailů (více trojúhelníků) a pro ty na scéně umístěné vzadu zase méně a až s přibližováním k nim pak detaily přidávat. Takovéto systémy se však ukázaly jako příliš komplikované a do her se vlastně nikdy nedostaly.
Přišlo se tedy s jiným řešením, které je již definované v DirectX 8 - High Order Surfaces (HOS), tedy povrchy vyšších řádů.Myšlenka je založena na posílaní stále stejných objemů dat (počtu trojúhelníků) grafické kartě a nechat ji samotnou využít velké výpočetní síly GPU a propustnosti její paměťové sběrnice a tedy složité počty a množství polygonů či povrchů nechat plně na ní. Co pojem povrch vyššího řádu vůbec znamená? Trojúhelník nebo obecně polygon je povrch prvního řádů. Složitější tvary získáváme skládáním těchto polygonů. Ty hladké z nich (představte si například záclony) jsou však vždy určitým způsobem vždy jen aproximovány - složeny ze sítě trojúhelníků a tedy zubaté. Proto se snažíme pracovat s povrchy třetího řádu (tzv. bicubic surfaces), které jsou definovány pomocí polynomů třetího stupně. Výsledkem takovéto definice je pak jasně zapsaný a hlavně nezubatý povrch (B-spline, Bézierův plát). Soubor pixelů a parametrů v této definici se pak nazývá plát (patch).
V DirectX je tedy od verze 8 zahrnuta podpora pro dva typy povrchů vyšších řádů:
- parametrické povrchy (RT-Patches)
- N-Patches (známé také jako ATi TruForm)
Nejprve se tedy podívejme na RT-Patches, které se spíše pojí s konkurentem ATi - firmou nVIDIA. Je jasné, že práce přímo práce s povrchy vyšších řádů by vyžadovala daleko větší množství kalkulací než práce s trojúhelníky, hlavně při operacích jako nanesení textury nebo výpočet osvětlení. Také nalezení průsečíků na scéně s bodem a zpracovávaném povrchu by byl velký problém, protože taková rovnice může mít více řešení (na jeden pixel na scéně tři odpovídající body na plátu).
Technologie RT-Patches (RT - rectangular) je tedy založena na tom, že se části povrchů rozdělují na pravidelnou mřížku a povrch pak vykresluje jako množina trojúhelníků používajících body této mřížky. Tento proces se nazývá teselace (tesselation). Obecně je to tedy rozdělení povrchu vyššího řádu na několik povrchů řádu nižšího (v tomto případě trojúhelníky). Dříve tento proces počítali sami aplikace (CPU), dnes již definován v API a podporován v hardware - prvním akcelerátorem s podporou RT-patches byla karta nVIDIA GeForce3. Z pozdějších potom ještě Matrox Parhelia-512. RT-patches se však dodnes nijak výrazně neuchytily, mají totiž jednu zásadní nevýhodu, kterou ilustruje následující obrázek přejatý z prezentace TruFormu od ATi:
![]() |
Jak vidíte, čip podporující RT-patches sice vykreslí krásně hladký a nezubatý povrch, ale klasický akcelerátor, jenž tuto podporu neobsahuje a tedy očekává na vstupu tradiční trojúhelníky nevykreslí vůbec nic. To asi zabránilo dalšímu prosazení této technologie. Shrňme si tedy výhody a nevýhody RT-patches.
Výhody:
- v případě teselace pomocí čipu grafické karty je menší zátěž na AGP a paměťovou sběrnici
- snadné kreslení modelů
- využití stále silnějších T&L jednotek grafik, nelimitováno tolik CPU
- díky trojúhelníkům snadné výpočty světel a stínů
- snadná změna LOD, adaptivní pro jednotlivé segmenty, nejen pro celý patch
Nevýhody:
- současná nutnost dvou verzí modelů (druhá pro akcelerátory nepodporující RT-Patches)
- přepracování nynějšího software založeného na trojúhelnících
- nevýhody zatím převažují (komerční hledisko - nikdo z výrobců software si nemůže dovolit kvůli v té době jediné kartě - GeForce3 - psát 2 verze kódu nebo dokonce jedinou zatím pouze pro tento akcelerátor)
Zdá se, že N-Patches dosáhnou a vlastně již dosáhli úspěchu mnohem většího. Tento úspěch je také trochu spjat s prosazením se Radeonu 8500. ATi v době při vývoji této karty potřebovala nVIDII trumfnout ve všech směrech, tedy nejen ve výkonu, ale i v podporovaných technologiích, tudíž do R200 zabudovala implementaci hlavně pro vývojáře zajímavější technologie než byly RT-Patches.
Algoritmus už nerozděluje obdélníkový povrch, ale trojúhelník na určitý počet menších trojúhelníků s normálovým vektorem v každém z vrcholů. Hlavní rozdíl, proč se N-Patches na rozdíl od parametrických povrchů již prosazují vidíme na následujícím obrázku:
![]() |
Můžete si všimnout, že akcelerátor dostává klasický vstup - tedy polygony. Čip, jenž nemá podporu N-Patches, pak vykreslí trojúhelník normálně. Naopak čip s touto podporou vykreslí zaoblený Bézierův plát. Původní trojúhelník je tedy rozdělen na několik menších (pro zájemce: přesněji se o tomto algoritmu dočtet v prezentacích na ati.com v sekci Developer) a pro nově vzniklé vrcholy jsou spočteny nové normály:
![]() |
Výsledný model je tím hladčí, čím více každý polygon rozdělíme (tesselation level nebo tesselation factor). Osvětlovací model je pak stále blíže Phongovu (počítá se pro každý pixel), protože při Gouradově stínovaní se počítá pouze s normálami ve vrcholech a těch stále přibývá, proto získáváme nejen zaoblenější, ale i lesklejší povrch. Na následujícím obrázku vidíte, jak se takové jednoduché těleso (oktahedron - 8 trojúhelníků) může změnit v poměrně realisticky vypadající tvar s přibývající úrovní teselace (tesselation level):
![]() |
Už jsem se zmínil, že je mimo výpočtu nových kontrolních bodů, z nichž se pak stanou vrcholů menších trojúhelníků je také třeba dopočítat nové normálové vektory v těchto vrcholech. K tomu se používá buď lineární nebo kvadratická interpolace (v herních konzolích lze mezi těmito druhy často přepínat) s různým výsledným efektem:
![]() |
ATi Dolphin demo
Úroveň teselace a její vliv je velmi pěkně vidět na velice známem demu od ATi - Doplhin, kde lze pomocí kurzorových kláves plynule měnit tuto úroveň od vypnutí TruFormu, přes 4,9,25,36 až po 64 (tedy rozdělení původního trojúhelníku na 4,9, menších). Už při rozdělení na 9 menších dostáváme značně realističtější vzhled modelu delfína známého už z DX8 SDK (na prvním obrázku zapnut mód drátového modelu, a je dobře vidět, jak jsou zpracovány jednotlivé trojúhelníky):
![]() |
![]() |
Demo je volně ke stažení z www.ati.com, v sekci Developer, Demos, Radeon 8000 Series Demos.
{mospagebreak title=Které karty a hry už umí N-Patches?}
Podpora pro TruForm je tedy definována již v DirectX 8, v DirectX 9 pak dochází k rozšíření například o adaptivní teselaci nebo o zadání úrovně teselace nejen pevnou ale i desetinnou hodnotou (TruForm2, který je k dispozici v Radeonech vycházejících z jádra R300). V DX9 jsou N-Patches také využity ve spojení s Displacement Mappingem. Hardwarovou podporu pro N-Patches najdeme v Radeonu 8500, 9100, 9500, 9700 a novějších. Softwarovou implementaci v ovladačích pak už u Radeonu 7500 a později u 9000. Také Matrox Parhelia má HW podporu pro N-Patches, ale pouze pod DirectX, v OpenGL je totiž překážkou patent ATi (extenze GL_ATI_pn_triangles). Úplně jiná situace je u plně programovatelného VPU 3Dlabs P10, kde lze podporu povrchů vyššího řádu naprogramovat.
Zajímavější je asi však, které hry již obsahují podporu pro TruForm, aby nezůstalo u jediného dema od ATi. Ta na svých stránkách proklamuje, že tyto tituly již podporu TruForm mají implementovánu:
- Command&Conquer: Renegade
- Deadly Toonz
- Earth and Beyond
- Half-Life
- Half-Life: Counter-Strike
- Madden 2003
- Myth 3
- Neverwinter Nights
- New World Order
- Rainbow Six: Raven Shield
- Return to Castle Wolfenstein
- Serious Sam
- Serious Sam: The Second Encounter
- Soul Reaver 2
- Star Wars Galaxies Online
- Star Wars Jedi Knight II: Jedi Outcast
- Stokerider
- Team Fortress Classic
- Unreal Tournament 2003
Podívejme se tedy na dvě hry u nichž je podpora TruForm nejvíc známa - Serious Sam a Return to Castle Wolfenstein.
Return To Castle Wolfenstein
TruForm můžete zapínat buď pomocí konzole nebo v souboru wolfconfig.cfg. V konzoli použijte příkazy:
\r_ext_ATI_pn_triangles "1" (tedy nastavte hodnotu misto na 0 - vypnuto na 1)
\r_ati_truform_tess "1" (nastavte úroveň teselace na 1 - 7)
V případě potřeby restartujte grafický režim příkazem \vid_restart.
Nyní se podívejme, jak zapnutí jednotlivých úrovní TruFormu ovlivní modely ve hře:
![]() |
Pro lepší porovnání rozdílů na modelu vojáka si stáhněte následující screenshoty:
- Teselace vypnuta
- Teselace úroveň 1
- Teselace úroveň 2
- Teselace úroveň 3
- Teselace úroveň 4
- Teselace úroveň 5
- Teselace úroveň 6
- Teselace úroveň 7
Zapínání TruFormu ve hře funguje korektně až od verze 1.33. Chtěl jsem otestovat vliv jednotlivých úrovní teselace na výkon, ale benchmark je udělán pouze pro multi-player verzi Wolfensteina a tam podle všeho zase nefunguje zapínání TruFormu. Takže jen pro přehlednost jsem shrnul v grafu aktuální fps ze screenshotů, které podle mého subjektivního pozorování docela odpovídají ztrátě fps při zapnutí TruFormu při hraní single-playeru (CPU 1.3GHz, Radeon 9500).
![]() |
Serious Sam : The Second Encounter
Ještě mnohem zajímavější je situace v této hře (od novějších patchů platí to samé i pro první díl této hry). Hra má sice TruForm implementován, ale pouze v jedné místnosti Technology Testu, ne přímo v samotné hře. Podívejme se na následující obrázky:
![]() |
Na prvním obrázku je TruForm vypnut, na druhém je zapnut (úroveň 3). Všimněte si, že levá konvička zůstala netransformována. V této místnosti Technology testu tedy TruForm funguje správně, je použit pouze na určité modely. Na dolní obrázku je také TruForm třetí úrovně, ale v tzv. force (tedy vynuceném) módu. Tento mód pak funguje i v celé hře. Transformovány jsou tedy všechny modely, což má samozřejmě důsledek v některých takto vzniklých chybách zobrazení a také ve značné ztrátě hodnoty snímků za sekundu. Opět jsem tedy provedl pár měření ztráty výkonu na demu Elephant Atrium (CPU 1.3GHz, Radeon 9500):
![]() |
Pokud si vzpomenete na článek o Radeonu 9000 Pro, tak se ukazuje, že TruForm jednotka Radeonu 8500 prokazovala menší ztráty výkonu . Mohlo by to ukazovat na to, že TruForm v R300 je alespoň v dosavadních Catalystech částečně softwarový, jak se domnívají v recenzi Radeona 9700Pro na rage3d.com.
Ještě se podívejme na jeden příklad z chyb, které jsem zmiňoval:
![]() |
Kostka lékarničky se zaoblila a textura již není správně nanesená, výsledek je dost nepěkný. Na stromech či tělech nepřátel dopadne TruForm o hodně lépe, viz následující screenshot, opět s postupným zapínáním teselace:
- TruForm vypnut
- TruForm (force), teselace level 1
- TruForm (force), teselace level 2
- TruForm (force), teselace level 3
N-Patches (TruForm) je určitě perspektivní technologie, která hlavně s příchodem DirectX 9 her snad získá širší využití. Zatím však musím říct, že v současných titulech ještě není jeho implementace dotažená. Shrňme si pro a proti v obecné rovině:
Výhody:
- AGP a paměťová sběrnice značně ušetřena
- opět snadné modelování, pro zjemnění stačí změnit teselation level, počet rozdělení
- využití T&L jednotky, nezatěžování CPU
- použití trojúhelníků umožní použít stíny a osvětlení bez lightmaps (využití shaderů a T&L)
- všechny modely mohou být definovány jedním způsobem, ať už karta nebo ovladače N-Patches podporují nebo ne
- hotový software nevyžaduje většinou náročné přepracování
- potenciální možnost vynutit N-Patches v ovladačích
- hlavně hezčí a realističtější vzhled modelů
Nevýhody:
- kámen úrazu - mnoho aplikací nepoužívá k výpočtu osvětlení jen normálových vektorů, ale také lightmaps a jiné techniky, které ukládají předpočítané hodnoty pro vrcholy
- vhodné tedy pro aplikace používající standardní zdroje světla a možností T&L jednotky
- možnost vynutit podporu pro všechny aplikace v ovladačích (v jiných případech zároveň výhoda) - problém se scénami vykreslenými více průchody (tam kde se například používají proceduralní textury a lightmaps)
S definitivním ortelem počkejme ještě nějakou dobu než se (ne)objeví hry či jiné aplikace (třeba i CAD), kde budou N-Patches skutečně dobře využity.
Grafickou kartu (Radeon 9500 128MB), na které byly provedeny měření a pořízeny screenshoty zapůjčila firma LEVI.
Redakce si vyhrazuje právo odstranit neslušné a nevhodné příspěvky. Případné vyhrady na diskuze(zavináč)pctuning.cz
Kdybych pouzil Anti-Aliasing, tak by to sice urcite vypadalo lip, ale pak uz by nebylo jasne, co zpusobil Truform a co FSAA.
Na tech sreenshotech (a 1600x1200 screenshoty sem fakt davat prece nebudu) to je videt, ale je potreba si je ulozit a prohlizet pekne za sebou ve fullscreenu, aby bylo patrny, co se postupne meni. Na tech screenshotech z Wolfa se zamerte na cepici, ruce a trup vojaka, na tech ze SSama pak na strom anebo hlavu toho skorpiona.
Doporučuji pro starší hry.
Proč si jinak myslíte, že Engine UT2k3 má 100* více polygonů - skutečně si myslíte, že dnešní procesory jsou 100* rychlejší než z doby Unreala 1 (cca 300MHz PII vs 3000MHz P4)?
"které jsou definovány pomocí polynomů třetího stupně" heh ten polynom je n-tého stupně (tedy obecně jakéhokoliv). Např beziérova křivka stupně n je definována n+1 body neboli máme li např. 10 bodů, vyjde polynom stupně 9.
"Osvětlovací model je pak stále blíže Phongovu (počítá se pro každý pixel), protože při Gouradově stínovaní..." Mícháte do sebe osvětlovací modely a stínování (častá chyba). Phongovo máme jak osvětlování, tak stínování a podle toho, co jste napsal bych řekl, že myšleno bylo stínování :-)
Jinak hezké.
a misto tzv. melo byt napr., to je taky fakt
zkusim ty nedokonalosti opravit nebo nekomu rict, at to za me opravi