13. 11. 2013

Textúrujeme - no limits


Moja prvá "3D" karta 3Dfx Voodoo 1 mala 4 mega vram, závratne rýchlo sme s týmto parametrom v neskorších rokoch stúpali na 8-16-32-64 mega, 128 /!!/. Psone malo 1 megovú vram a bežia na nej tie najlepšie hry histórie. Dnes má sociálne, mainstreamové GPU 1 giga /!!/ vram ale ani 2-3-4 giga nevzbudzuje väčšiu pozornosť. Apatia, pritom hrám to stále nestači. Pohneme teda zadkom a nájdeme nejaké skvelé riešenie - PRT alias DXTR /a priložíme aj PTEX/. Budúcnosť nám v začínajúcej 8. generácií konzol prinesie množstvo nových, revolučných, programátorských postupov alebo oprášenie tých úplne najstarších. To rebrandovaná starina bude aj hlavným hrdinom tohto článku. Tie divoké skrátky si rozpíšme - Partially Resident Textures, DirectX Tiled Resources a Per-Face Texture Mapping. Budeme teda hovoriť o textúrach /o desiatkách gigabajtoch v ultra kvalite/. V súčasnom "grafickom hernom modele" stále ešte používame polygonové modely potiahnuté tapetami. Hardvér je na to adaptovaný, aj keď nám toto riešenie prináša more problémov. Ak niekto z vás skúšal niečo modelovať a textúrovať v hoc akom "3D štúdiu" určite narazil na tzv. UV mapovanie, teda zladenie koordinátov textúry s modelom. Pre úplných laikov - skúste na guľu nalepiť A4 s porno obrázkom, tak aby to vyzeralo pekne, bez pokrčených "švíkov" a deformácií. Alebo textúru s extra vysokou detailnosťou /1K,2K,4K/ dajte na plochý mesh /bok lekárničky v FPS hre, ktorý má "až" 2 polygóny a aplikujte tam displacement mapping. Samé problémy.

A tie najväčšie ešte len prídu. Už od nepamäti  bojujeme o čo najväčšiu veľkosť videoram aby bolo kde uložiť stále väčšie a väčšie textúry /32x32 pixelov, 256x256 a valí sa nás 1024x1024 a viac takmer na každom povrchu/. S týmto nárastom dnešná VRAM aj o kapacite 1-3 /o chvíľu 10-12/ gigabajtov nevie udržať krok a ak by to aj dokázala, v živote taku masu dát nevieme efektívne /lacno !!/ prenášať po zberniciach, hlavne ak to chceme vo vysokom 4K rozlíšení na 60+ fps. Ako som už povedal - s týmto problémom sa vývojári potýkajú už takmer 40 rokov a keď na vás dnes AMD alebo MS zahuláka PRT alias DXT, tak ide o starú vestu /softvérové riešenie/ len konečne adekvátne optimalizovanú pre súčasný hardvér aka s HW podporou, ošetrenú v grafickom API a s potenciálom masového rozšírenia.

Ide teda o totot - ak má obrazovka v rozlíšení 1080p na ploche cca 2.1M pixelov a teda ju celú pokryje jedna 8 megová textúra /rozlíšenie krát 32 bit RGB a alfa, to jest 4x8 bit na kanál/ a rátame s worst case scenariou - s 20 násobným celoobrazovkovým overdraw tak by nám 160 megový vram buffer mal stačiť , ak .. ak nebudeme pracovať s komplet vo vram uloženými /pokiaľ možno všetkými/ textúrami v plnom rozlíšení. PRT /Partially Resident Textures/ na to ide inak - ak máme na scéne objekt /tank/, ktorý má relatívnu veľkosť 250x400 pixelov a je pokrytými 25 megami textúr, tak riešime iba tie viditeľné pixely z pohľadu hráča a neťahám do vram cez zbernice všetko, či to potrebujem alebo nie. Urobíme to rafinovanejšie - partially resident = čiastočne prítomné, čo znamená, že si všetky textúrky rozrežeme na povedzme 64 kilové dlaždice - tiles /zámerne presne definovaná velkosť a teda exaktná kontrola ich toku cez systém bez ohľadu na formát, velkosť materskej textúrky/ a do vram súkame iba tie časti textúr /nie celé textúry/, ktoré skutočne potrebujeme. Ďalšou fantastickou výhodou je to, že mipmap úroveň /detailnosť/ týchto 64KB dlaždic je možné riadiť pri každej z nich individuálne /ak sa pozeráte na bok tanku pod veľkým uhlom a vo väčšej vzdialenosti, tak tam nebudem lepiť najvyššiu možné rozlíšenie/ a nakoniec, pretože ide HW riešenie, tak mám k dispozicíí aj filtrovanie textúr /AF/ pomocou TMU, ktoré softvérou cestou bolo nemožné alebo iba hraničné použiteľné.


Per-Face Texture Mapping /PTEX/ je zvláštna forma PRT, ktorú rutinérsky používa napríklad Disney vo svojich CG filmoch. Odstraňuje všetky  problémy spojené s odlišným rozlíšenim textúry a siete polygónov objektu pod ním /1:1 mapovanie, texe : polygón/. Umožňuje mimoriadne slobodnú manipuláciu s mesh objektom - ohýbanie, delenie, deformácie, deštrukciu bez toho aby vám kolabovala samotná textúra, alebo aby si grafici trhali vlasy nad tým ako to čo najmenej pracne zrealizovať. AMD pripravilo "hernú" variantu /demo/ tohto postupu na bežných GPU, teraz sa jej však venovať nebudeme. Veľmi skoro s tým aj tak prídu samotní herní vývojári, potom si to pripomenieme /teselácia je za dverami a tam už PTEX a jeho varianty budú témou dňa/.

Technické zhrnutie. Najnovšie AMD GPU 7xxx a lepšie s GCN 1.x-2.x jadrom obsahujú v sebe hardvérovú podporu pre zvláštny typ manažmentu textúr. AMD to volá PRT, MS zas DXTR, OpenGL 3.2+ má podobné extenzie pre softvérové riešenie /Carmackov ID tech a Megatexture je zhruba to isté čo PRT, len to išlo softvérovou cestou/. DirectX TR štandard predpisuje minimálny set funkcií /tzv. tier 1/, ktoré táto technika má spĺňať na všetkých GPU. PS4 GPU beží v režime prísnejšej normy tzv. tier 2 plus vlastné custom SONY API extenzie. PRT slúži  hlavne na to, aby sme značnú časť vram nezaplňali textúrami v celej ich veľkosti a v plnom rozlíšení, šetrí nám priepustnosť zberníc, šetrí pracovné cykly GPU, je dokonca oveľa ľahšie znovupoužitie "dlaždice" vo viacerých frejmoch alebo aplikovaní shader kódu. Kopa technických nuáns. PRT z pohľadu hráča znamená vyššiu kvantitu /viac textúr/ a kvalitu /viac textúr vo vyššom rozlíšení a krajšie pixely - Image Quality, menej shimmeringu, moiré, pixel crawlingu, lebo 64 kilovú dlaždice prechádzajú cez "skrášlovacie" TMU jednotky, čo softvérové riešenie celkom dobre nevie/.


Dostupnosť v hrách ? Dnes Killzone:SF pre PS4 hlási, že má v ramke celé gigabajty "celých" textúr v plnom rozlíšení a zvyšok sa streamuje /hlavne mip map úrovne tých celých textúr/. Ide o klasické, zastaralé riešenie ale je to v poriadku - pamäte je zatiaľ dosť a tunelovky príliš na pílu netlačia. Samozrejme príde čas, ked sa voľne dostupný, "hrubý" výkon a prostriedky minú a dôjde na masové využívanie techník, o ktorých v článku píšem. Natívne first party dev teams s tým začnú možno už v hrách chystaných na budúci rok. Sandbox, free roaming hry veľmi ocenia, keď im drahocenný streamovací kanál /a voľnú ram/, nebudú obsadzovať na 65% textúry ale po novom im ostane viac miesto pre objekty alebo animáciu /fyziku, AI/. Hry proste budú krajšie a ako vidíte nemusí to byť iba vďaka ninja parametrom GPU s kopou pamäte, stačí aj rovnako razantné zvýšenie efektivity využitia dostupných zdrojov. Mimochodom identický proces už dnes vieme aplikovať na spracovanie nasvietenia scény /TBDR - tiled based deferred rendering, dnes už dnes považaný za prežitok heh, špičkou je PCDaFS -  v praxi uvidíte v dalšej next gen hre od Avalanche Studios/ a dokonca aj samotnej geometrie. Všetky tieto postupy naplno zažiaria v hrách /a enginoch a middleware !!/ ktoré nas ešte len čakajú, prvogeneračné hry pre PS4 po technickej stránke radšej vôbec neriešme.