IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Ako na textúry

Dávno už je minulosťou doba, kedy základom 3D grafiky bola vektorová grafika založená na rôznofarebných trojúhelníčcích. Bez textúr je dnešný 3D grafika neodmysliteľná. Ako však textúry správne používať?

Hoci sú textúry bežnými 2D obrázky, musíme ich chápať trochu odlišne. Textúra nie je len obrázok, ktorý sa "niekam" vykreslí. Jednotlivé grafické body textúry sú zdrojom farebné informácie pre renderovací jednotku. Renderovacie jednotka chápe textúru ako pole farebných komponentov, do ktorého nazerá pri každom vykresľovanie bodu. Najskôr vypočíta pozíciu renderovaného bodu relatívne k vrcholom trojuholníka (s prípadnou perspektívne korekciou), tú prepočíta na relatívnu súradnicu zodpovedajúceho bodu v textúre s využitím UV súradníc. Preto u textúr nepoužívame označenie pixely ako je tomu u 2D obrázkov, ale jednotlivé grafické body označujeme Texel.

UV súradnice sú súradnice v textúre v danom vrchole. Textúra má v každom smere rozsah súradníc 0.01.0, nezávisle na fyzickom rozmere textúry. Súradnice sú počítané tak, akoby textúry boli usporiadané vedľa seba ako dlaždice. Tým je zaistené opakovanie textúr zadaním súradníc mimo rozsah 0 až 1.

3D grafika

Texel sa adresujú akoby to boli plôšky o určitom rozmere. Napríklad v textúre o rozmere 4 x 4 body majú jednotlivé Texel rozmer 0.25 x 0.25. Pri barvových kalkuláciách sa ako vzťažný bod berie stred Texelu.

3D grafika

Ak vykonáva sa renderovanie textúry s vypnutou filtráciou textúr, použije sa v barvových kalkuláciách hodnota najbližšieho Texelu textúry (na predchádzajúcom obrázku variant grafu a) bez filtrácie). Na nasledujúcich obrázkoch vidíte vľavo prípad s vypnutou filtráciou textúr, vpravo je filtrácia textúr zapnutá. V prípade s vypnutou filtráciou môžete pozorovať zobrazenie samotných Texel textúry.

3D grafika 3D grafika

Ak je filtrácia textúr zapnutá, interpolujú sa farebné informácie medzi susednými 2 body. Vnútorné body textúry sú jasné, čo však krajné body? Tu je problém, pretože nie je známe, ktoré susediace body použiť pri výpočte farby. Rieši to voľba pre nastavenie módu adresovanie textúry. Implicitne sa textúra adresuje ako opakovaná (dlaždicové usporiadanie). Ak je napr. Rozsah UV súradníc medzi 2 vrcholmi 0 až 2.0, textúra sa zopakuje 2x. Pri opakovaní sa okraje textúr počítajú tak, že sa farba interpoluje medzi prvým a posledným Texel textúry. To umožní hladké prechody medzi opakovanými textúrami. Na predošlom grafe je to variant c) opakovanie.

Mód opakovanie však môže v niektorom prípade spôsobiť komplikácie. Na nasledujúcich 2 obrázkoch vidíte prípad použitia textúr pri generovaní terénu pomocou dlaždíc (štvorca). U ľavého obrázku je povolené opakovanie textúr. Ako je vidieť, interpoláciou medzi prvým a posledným Texel textúry vznikajú na hranách dlaždice nepríjemné viditeľné artefakty. Riešenie vypnutím vyhladenie textúr považujeme za neprijateľné. Máme pre tieto prípady ďalší mód adresovanie textúr, orezanie. Na grafoch vyššie je to prípad b) orezanie alebo dole je to obrázok vpravo. Okraje textúr nie sú interpolované, farba zostáva nezmenená od posledného známeho Texelu až po okraj textúry. V móde orezávanie je textúra vykresľovanie iba v rozmedzí súradníc 0 až 1, všetko ostatné mimo daný rozsah je orezaná na okrajovú farbu.

3D grafika 3D grafika

Ak to však bude možné, budeme sa snažiť vyhladzovanie opakovaním používať. Ako vidíte na nasledujúcich 2 obrázkoch, vľavo je zapnuté adresovanie orezaním, vpravo adresovanie opakovaním textúr. Je zrejmé, že v móde orezanie nedôjde k plynulému prechodu medzi okrajovými Texel susedných textúr a objavujú sa viditeľné zlomovej prechody.

3D grafika 3D grafika

V predošlom prípade sme tento efekt brali ako menšie zlo, radšej než vznik okrajových artefaktov. Aj v takom prípade však môžeme nájsť kompromisné riešenie. Pripravíme textúry tak, že rad bodov z koncov textúr skopírujeme aj na začiatky textúr Samozrejme myslené pre rovnaké spojovacie miesta textúr. Vytvoríme tým akési navzájom kompatibilné spojovacie konektory textúr. Potom bude zabezpečené, že prvý a posledný Texel susedných textúr sú vždy rovnaké a nedochádza tak k prechodovým zlomom ani v prípade ožezávání textúr. Ako vidíte na nasledujúcom obrázku, zlomy sa stratili. Ak budete aj po tejto korekcii pozorovať zlomy u vzdialených textúr, skúste zlepšiť situáciu vypnutím filtrácie vzdialených textúr alebo ešte lepšie nastavením maximálnej úrovne vzdialených textúr. Pri úpravách textúr pamätajte na zmenšovanie textúr pri vyhladení textúr. Napr. ak použijete vyhladenie textúr 2, musíte kopírovať 2 rady bodov. U Lite verzia Petra sú textúry automaticky zmenšené na maximálny rozmer 128.

3D grafika

Uvedený prípad filtrácie textúr sa vzťahoval predovšetkým k prípadu zväčšenie textúry, kedy sa 1 texel zobrazí ako niekoľko grafických bodov na obrazovke. Nastavenie filtrácie Určite prepínač filtrácie zväčšených textúr. Iným podobným prípadom je zmenšenie textúr, kedy na jeden grafický bod na obrazovke pripadá niekoľko Texel. Tento typ filtrácie je riadený prepínačom filtrácia zmenšených textúr. Pri zmenšovaní textúr sa farba výsledného pixelu získa interpoláciou dvoch najbližších Texel, podobne ako pri zväčšení, len v inom meradle.

Ak by sme použili u veľmi vzdialených (zmenšených) textúr filter pre zmenšenie textúr, uplatnili by sa vo výslednom obraze vždy len niektoré (najbližší) dva Texel, čo by malo za následok zrnitosť a preblikávania vzdialených objektov. V tomto prípade sa uplatní technika vzdialených textúr, mipmaping. Mipmap textúry sú textúry odvodené z pôvodnej textúry postupným delením veľkosti na polovicu, až po veľkosť 1 x 1 bod.

Príklad: V programe máme pripravenú textúru s rozmermi 256 x 256 bodov, s priehľadným pozadím. Je to obrázok v Petrovi, preto používa paletový režim 256 farieb. Je zvolené vyhladenie textúr 2. Pri generovaní textúry sa obrázok prevedie na TrueColor (32 bitov) a zmenší sa na rozmer 128 x 128 bodov. Z priehľadné farby sa odvodí alfa zložka (teda kanál transparentnosti). Vďaka tomu, že obrázok bol prevedený do farieb Petra s využitím ditheringu (čo je metóda simulácie RGB farby zmiešaním niekoľkých 8-bitových farieb - obrázok je pri bližšom pohľade bodkovaný), obrázok sa po zmenšení na rozmer 128 x 128 veľmi blíži TrueColor farbám. Z obrázku sa postupne odvodzujú nasledujúce úrobně mipmap reťazca, až po rozmer 1 x 1 bod.

3D grafika

Pri renderovanie textúry vyhľadá renderovací jednotka podľa aktuálneho mierky zobrazenia najbližšej mipmap textúru. Keď je zapnutý filter vzdialených textúr, získa sa výsledná farba interpoláciou medzi 2 najbližšími mipmap textúrami. Pri vypnutom filtra sa použije najbližší mipmap textúra. Úroveň rozhodovania, ktorá mipmap úroveň textúr bude použitá, môžeme riadiť prvkom zjemnenie vzdialených textúr. Štandardne má hodnotu 0. Hodnota prvku sa pripočíta k číslu použitej úrovne mipmap textúr. Nastavením na zápornú hodnotu (je možné zadávať aj desatinné čísla) sa použije väčšie mipmap textúra, obraz sa viac zaostrí. Kladné číslo zaistí väčšiu rozmazaniu vzdialených textúr. Zmena filtra o hodnotu 1 spôsobí posun mipmap o 1 úroveň (teda posun na dvojnásobnú alebo polovičnú veľkosť mipmap textúr).

Nakoniec si popíšeme ešte jeden trik s textúrami, bezšvíkové spájanie textúr. Dajme tomu, že chcete zobraziť veľkú fotografiu. Nemôžete použiť jedinú textúru kvôli obmedzeniu veľkosti textúr (buď kvôli obmedzeniu Lite verzia Petra alebo kvôli limitom grafickej karty), musíte fotografiu rozložiť na niekoľko menších častí (segmentov) a namapovať ich na niekoľko štvorcových dlaždíc. Je samozrejmé, že nemôžete použiť mód opakovanie textúr, v miestach spojov by sa objavili čiary. V prípade módu orezávanie textúr sa v miestach spojov budú objavovať zlomové hrany v plynulosti vyhladenie textúr. U fotografií nemôžete použiť ani trik s opakovaním prvej a poslednej rady bodov.

Riešenie spočíva v prekryv textúr. Obrázok rozdelíme na segmenty zdieľajúce jeden rad bodov. Textúru každého segmentu namapujete na plochu ako napnutú, o jeden texel, čiže na každej strane bude prečnievať o pol Texelu. Okrajové Texel tak budú ležať na hraniciach plôch a vonkajšie problémová oblasť Texel sa vôbec nepoužije. To umožní hladké napojovaní textúr bez vzniku artefaktov, dokonca nezávisle od zvoleného módu adresovanie. Na konci lekcie nájdete ukážkový program využívajúci bezšvíkové spájanie textúr na zobrazenie fotografií. Metódu si na ňom bližšie vysvetlíme.

3D grafika

V programe chceme zobraziť fotografie o koncovom rozmere 640 x 512. Budú súčasťou programu, preto budeme počítať s prevodom z 8-bitový farieb Petra a vyhladením textúr 2, čiže fotografie budú mať v programe rozmer 1280 x 1024 bodov. Použijeme textúry s koncovým rozmerom 128 x 128 bodov, čo znamená 256 x 256 bodov v 8-bitových farbách. Jedna fotografie sa bude skladať z 5 segmentov horizontálne (640/128 = 5) a 4 segmentov vertikálne (512/128).

Napojovanej segmenty budú zdieľať 1 bod. Stredná segmenty efektívne zobrazí 127 Texel, pretože prvý a posledný texel sa zobrazí len do polovice. U krajných segmentov sa zobrazí vnútorná Texel do polovice, ale krajné sa musí zobraziť celé. Krajné segmenty teda zobrazí 127,5 Texel. Keď tieto hodnoty sčítame zistíme, že sa z obrázku efektívne zobrazí 636 bodov na šírku a 509 bodov na výšku. Nestalo by sa moc keby sme nadbytočné body z obrázku len ignorovali, ale pretože chceme ukážkovo porovnávať metódy, obsahuje program obrázky už pripravené v korigované rozmere 1272 x 1018 bodov.

Rozsekávání obrázku na segmenty sa vykonáva programovo, vykreslením segmentu do grafickej plochy a odobratím segmentu do textúry. Jeden segment má rozmer 256 bodov, ale okno segmentov je pritom v obrázku posúvané po 254 bodoch (kvôli zmenšeniu textúry sa nezdieľa 1 bod ale 2), čím sa zabezpečí zdieľanie bodov medzi segmentmi. Zastavíme sa podrobnejšie u horizontálnych výpočtových operácií pre stredný segment, ako príklad.

Obsah premenné mierka X mapovanie textúry sa použije v príkaze mapovanie textúry pre jeden segment. Nastavením mierky mapovanie na zlomok 127/128 sa zabezpečí, že textúra sa roztiahne presne o 1 texel (šírka textúry po konverzii je 128 bodov). Roztiahnutia sa vykonáva okolo stredu, takže sa textúra roztiahne na každú stranu o 1/2 Texelu. Pri stredných segmentov zostáva stred mapovanie na súradnici 0.5, čo je stred textúry. U okrajových textúr sa nastavuje šírka mapovanie na hodnotu 127.5 / 128 (teda 127 a pol Texelu). Je potrebné zobraziť krajné texel celý, preto je nutné posunú stred mapovanie o 1/4 Texelu, teda o hodnotu 0.25 / 128.

Rozmery segmentov nastavujeme relatívne vzhľadom k celej skupine (tj. Aby výsledný rozmer obrazu mal hodnotu 1). Vnútorné segmenty zobrazujú 127 Texel, preto ich šírka bude (vzhľadom k celkovej šírke obrázku) 127/636. Šírka krajných segmentov je 127.5 / 636. Ľavú hraničný súradnicou obrazu je hodnota 0.5. Stred prvého segmentu je posunutý o 1/2 šírky od ľavého okraja, preto súradnice X ľavého segmentu je (127.5 / 636) / 2 - 0.5. Súradnice X každého ďalšieho (vnútorného) segmentu je odsadená od ľavého okraja o celú šírku prvého segmentu (tj. 127.5 / 636), o šírky predošlých vnútorných segmentov (každý je široký 127/636) ao polovicu šírky tohto segmentu.

3D grafika

Na nasledujúcich snímkach môžete porovnať účinnosť metódy. Vľavo je detail obrázku zobrazeného pomocou bežných nepřekryvných segmentov (u segmentov je nastavený mód orezávanie textúr), vpravo je zobrazenie s využitím bezšvového spájania textúr. Ak budete program skúšať, sú rozdiely najvýraznejšie pri obrázku číslo 3, ak sa k nemu viac priblížite. Obzvlášť je táto metóda úspešne využiteľná pri zobrazení textov, kde sa používajú textúry s malým rozlíšením a prechody medzi textúrami bývajú častým problémom.

3D grafika 3D grafika
3D grafika 3D grafika

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 243x (6.65 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Petr Lite (sú obsiahnuté v EXE súbore, ktorý možno v programe priamo otvoriť)

 

Všetky články v sekcii
3D grafika
Článok pre vás napísal Panda38
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Programátor C++, WinAPI, ASM.
Aktivity