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

2. diel - XNA tvorba v 3D - textúry

A máme tu tretí diel nášho snáď nie mini seriálu o XNA a 3D. Naposledy sme si ukázali ako vykresliť viac ako jeden trojuholník. V tomto diele sa pozrieme ako na nami zvolený útvar naniesť textúru a priblížime sa tak už veľmi dosť sľubované SpriteBatch.

Najprv zo všetkého bude nutné zvoliť iný formát vertexu. Zatiaľ sme používali VertexPositionColor kde boli k dispozícii iba dve zložky. Pozícia vertexu a jeho farba. Preto, aby bolo možné pridať textúru k vykreslenie, budeme potrebovať trochu viac než len to. VertexPositionTexture je presne tá štruktúra, ktorá sa nám hodí. Rovnako ako predchádzajúce obsahuje pozíciu (taký, ktorý by ju nemal, by asi nemal zmysel) a navyše miesto farby má v sebe premennú TextureCoordinate typu Vector2 pre súradnice textúry. Súradnice pre textúry sa zvyčajne nazývajú ako UV. Je to podobné ako máme XYZ tak tu to je UV a prípadne i W. Tieto súradnice nadobúdajú hodnôt od 0 do 1. Ak sa vyskytne číslo väčšie a prípadne menšie, je len na zvolenom módu grafickej karty ako sa k hodnote zachová, ale o tom viac až budeme hovoriť o shaderov. Pozorní čitatelia nielen tučného textu si všimli onoho W, ktoré som zatiaľ ponechal bez vysvetlenia. Nie je to žiadny môj výstrelok, ktorým by som provokoval. Ono W sa používa pre takzvané 3D textúry alebo tiež volumetrické textúry. Možno si ich predstaviť ako niekoľko klasických textúr vo vrstvách na sebe. Ešte som ale nevidel nikoho, kto by tieto 3D textúry použil, ale grafickej karty prácu s nimi ovládajú. Ak si niekto myslí, že predsa len je to k niečomu bežne využívané alebo má nejaké ďalšie informácie, podeľte sa s nami v komentároch. Tieto 3D textúry sú v XNA reprezentované triedou Texture3D, ale my sa uspokojíme len a len s triedou Texture2D. XNA dovedie nahrať tieto typy súborov: .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm a .tga. Mne sa najlepšie javí formát png (bezstratový, nejaká tá kompresia, podpora transparentnosti!), Všimnite si, že podporovaný nie je gif, takže sa ho ani nesnažte do hier prepašovať.

Prvá vec ktorú budete musieť vykonať ich vložiť si vami vybraný obrázok do projektu. Ak neviete ako na to, nevadí, tu sa to v časti prídavnom obsahu dozviete. Na prefixy sa rovno asi vykašlite :-) ale ak sa vám to zdá rozumné, nech je to vaša voľba. Ja ponúkam tento obrázok, ale môžete si nahrať aj ľubovoľný vlastné. Len si tu dovolím tučne odporučiť, aby ste nahrávali LEN obrázky s veľkosťou mocnín dvoch, teda 1x1, 2x2, 4x4, 8x8 .... 64x64, 128x128 .... 512x512 ... Ušetríte si tým veľa najbližších starostí a strastí. Áno, je možné pracovať aj s inými veľkosťami, ale budete mať obmedzené možnosti čo sa týka vykresľovanie. Vopred avizujú, že to nie je nejaká nejaké bezvýznamné slovné z XNA, ale iba jedna z vlastností grafickej karty. Ak sa vám všetko podarilo, tak by výsledok mal vyzerať nasledovne:

Základy 3D grafiky a tvorba enginu

Skvele, teraz máme všetko predpripravené a môžeme sa vrhnúť na písanie samotného kódu. Najprv opäť pole pre vertexy a samotnú premennú pre textúru:

Texture2D tex;
VertexPositionTexture[] ctverecVert;

V metóde Initialize opäť inicializujeme vertexy:

ctverecVert = new VertexPositionTexture[4];
ctverecVert[0] = new VertexPositionTexture(new Vector3(-10, -25, 0),new Vector2(0,1));
ctverecVert[1] = new VertexPositionTexture(new Vector3(-10, -5, 0), new Vector2(0, 0));
ctverecVert[2] = new VertexPositionTexture(new Vector3(10, -25, 0), new Vector2(1, 1));
ctverecVert[3] = new VertexPositionTexture(new Vector3(10, -5, 0), new Vector2(1, 0));
Základy 3D grafiky a tvorba enginu

V zátvorkách nie sú súradnice vo svete, ale práve ony UV súradnice pre textúry. Pripomeňme, že sú od nuly do jednej. Ďalej musíme nahrať textúru, to vykonáme v metóde LoadContent, ktorá je k tomuto určená.

tex = Content.Load<Texture2D>("erb");

Namiesto reťazca v parametri si dajte meno vášho obrázka a to bez prípony. Teraz je všetko pripravené k samotnému vykreslenie. Nastavíme parameter Texture u nášho efektu na nami načítanú textúru. Tiež povolíme použitia textúry a budeme vykresľovať rovnako ako naposledy. Dva trojuholníky as pomocou TriangleStripu. Nesmieme tiež zabudnúť novo nastavený efekt poslať do grafickej karty.

effect.Texture = tex;
effect.TextureEnabled = true;
effect.CurrentTechnique.Passes[0].Apply();

GraphicsDevice.DrawUserPrimitives<VertexPositionTexture>(PrimitiveType.TriangleStrip, ctverecVert, 0, 2);

Teraz program spustíme a máme nádherne otexturovaný štvorec. Že nie? Máte len nie zas tak peknú výnimku? Na niečo sme pozabudli. Pozrime sa na nej čo znamená.

The current vertex declaration does not include all the elements required by the current vertex shader. Color0 is missing.

Hovorí nám, že práve používaný shader požaduje nejaké údaje o vertexu, ktoré mu neposkytujeme. Farba vertexu naozaj nie je v nami vykreslovaných vertex prítomná. Možno to vyriešiť tak, že vypneme používanie týchto farieb v efektu:

effect.VertexColorEnabled = false;

A teraz keď spustíme tak ... Nie opäť ďalší výnimka.

The current vertex declaration does not include all the elements required by the current vertex shader. TextureCoordinate0 is missing.

Situácia sa opäť opakuje. Tentokrát je problém u vykresľovanie trojuholníka. Opäť tu nie je prítomná informácia o pozíciu textúry. Opäť riešenie je jednoduché, vypneme vykreslenie textúry:

effect.TextureEnabled = false;

Teraz je už všetko v poriadku a program sa spustí bez problémov a ukáže všetko tak ako bolo zamýšľané.

Základy 3D grafiky a tvorba enginu

O textúrach a textúrovanie, rôznych filtroch, adresných módoch a alfa kanálu sa toho dá napísať ešte veľa. Je ale asi na čase pohnúť sa ďalej. A ako vždy malý úlohu. Skúste si schválne urobiť obdĺžnik z viac trojuholníkov a naneste textúru na neho. Určite sa nebojte komentovať a prípadne i pripojte vaše priania čo ďalej očakávate a čo by ste radi videli ďalej.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

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

Stiahnuté 273x (99.01 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
XNA tvorba v 3D - dvaja je viac ako jeden
Všetky články v sekcii
Základy 3D grafiky a tvorba enginu
Preskočiť článok
(neodporúčame)
XNA tvorba v 3D - súradnice a matice 3D sveta
Článok pre vás napísal vodacek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Vodáček dělá že umí C#, naplno se již pět let angažuje v projektu ŽvB. Nyní studuje na FEI Upa informatiku, ikdyž si připadá spíš na ekonomice. Není mu také cizí PHP a SQL. Naopak cizí mu je Java a Python.
Aktivity