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:
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));
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é.
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#