Lekce 2 - XNA tvorba ve 3D - textury
A máme tu třetí díl našeho snad ne mini seriálu o XNA a 3D. Posledně, XNA tvorba ve 3D - dva je více než jeden, jsme si ukázali jak vykreslit více než jeden trojúhelník.
V tomto díle se podíváme jak na námi zvolený útvar nanést texturu a
přiblížíme se tak již velmi dost slibované SpriteBatch
.
Prvně ze všeho bude nutné zvolit jiný formát vertexu. Zatím jsme
používali VertexPositionColor
kde byly k dispozici pouze dvě
složky. Pozice vertexu a jeho barva. Proto, aby bylo možné přidat texturu k
vykreslení, budeme potřebovat trochu více než jen to.
VertexPositionTexture
je přesně ta struktura, která se nám
hodí. Stejně jako předchozí obsahuje pozici (takový, který by ji neměl,
by asi postrádal smysl) a navíc místo barvy má v sobě proměnnou
TextureCoordinate
typu Vector2
pro souřadnice
textury. Souřadnice pro textury se obvykle nazývají jako UV. Je to podobné
jako máme XYZ tak zde to je UV a případně i W. Tyto souřadnice nabývají
hodnot od 0 do 1. Pokud se vyskytne číslo větší a případně menší, je
jen na zvoleném módu grafické karty jak se k hodnotě zachová, ale o tom
více až budeme mluvit o shaderech. Pozorní čtenáři nejen tučného textu
si povšimli onoho W, které jsem zatím ponechal bez vysvětlení. Není to
žádný můj výstřelek, kterým bych provokoval. Ono W se používá pro
takzvané 3D textury nebo též volumetrické textury. Lze si je představit
jako několik klasických textur ve vrstvách na sobě. Ještě jsem ale
neviděl nikoho, kdo by tyto 3D textury použil, ale grafické karty práci s
nimi ovládají. Pokud si někdo myslí, že přecijen je to k něčemu běžně
využívané nebo má nějaké další informace, podělte se s námi v
komentářích. Tyto 3D textury jsou v XNA reprezentovány třídou
Texture3D
, ale my se spokojíme jen a jenom s třídou
Texture2D
. XNA dovede nahrát tyto typy souborů:
.bmp
, .dds
, .dib
, .hdr
,
.jpg
, .pfm
, .png
, .ppm
a
.tga
. Mě se nejlepší jeví formát png
(bezztrátový, nějaká ta komprese, podpora průhlednosti!), povšimněte si,
že podporován není gif
, takže se jej ani nesnažte do her
propašovat.
První věc kterou budete muset provést je vložit si vámi vybraný
obrázek do projektu. Pokud nevíte jak na to, nevadí, zde
se to v části Přidávní obsahu dozvíte. Na prefixy se
rovnou asi vykašlete ale
pokud se vám to zdá rozumné, budiž je to vaše volba. Já nabízím tento
obrázek, ale můžete si nahrát i libovolný vlastní. Jen si tady dovolím
tučně doporučit, abyste nahrávali POUZE obrázky o velikosti mocnin dvou,
tedy 1x1, 2x2, 4x4, 8x8....64x64, 128x128....512x512... Ušetříte si tím
spoustu příštích starostí a strastí. Ano, lze pracovat i s jinými
velikostmi, ale budete mít omezené možnosti co se týká vykreslování.
Předem avizuji, že to není nějaká vymyšlenost z XNA, ale pouze jedna z
vlastností grafické karty. Pokud se vám vše povedlo, tak by výsledek měl
vypadat následovně:

Skvěle, nyní máme vše předpřipraveno a můžeme se vrhnout na psaní samotného kódu. Prvně opět pole pro vertexy a samotnou proměnnou pro texturu:
Texture2D tex; VertexPositionTexture[] ctverecVert;
V metodě Initialize
opět 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ávorkách nejsou souřadnice ve světě, ale právě ony UV souřadnice
pro textury. Připomeňme, že jsou od nuly do jedné. Dále musíme nahrát
texturu, to provedeme v metodě LoadContent
, která je k tomuto
určena.
tex = Content.Load<Texture2D>("erb");
Namísto řetězce v parametru si dejte jméno vašeho obrázku a to bez
přípony. Nyní je vše připraveno k samotnému vykreslení. Nastavíme
parametr Texture
u našeho efektu na námi načtenou texturu. Také
povolíme použití textury a budeme vykreslovat stejně jako posledně. Dva
trojúhelníky a s pomocí TriangleStripu
. Nesmíme také
zapomenout nově nastavený efekt poslat do grafické karty.
effect.Texture = tex; effect.TextureEnabled = true; effect.CurrentTechnique.Passes[0].Apply(); GraphicsDevice.DrawUserPrimitives<VertexPositionTexture>(PrimitiveType.TriangleStrip, ctverecVert, 0, 2);
Nyní program spustíme a máme nádherně otexturovaný čtverec. Že ne? Máte jen ne zas tak pěknou výjimku? Na něco jsme pozapomněli. Podívejme se na ní co znamená.
The current vertex declaration does not include all the elements required by the current vertex shader. Color0 is missing.
Říká nám, že právě používaný shader požaduje nějaké údaje o vertexu, které mu neposkytujeme. Barva vertexu opravdu není v námi vykreslovaných vertexech přítomna. Lze to vyřešit tak, že vypneme používání těchto barev v efektu:
effect.VertexColorEnabled = false;
A nyní když spustíme tak... Ne opět další výjimka.
The current vertex declaration does not include all the elements required by the current vertex shader. TextureCoordinate0 is missing.
Situace se opět opakuje. Tentokráte je problém u vykreslování trojúhelníku. Opět zde není přítomna informace o pozici textury. Opět řešení je snadné, vypneme vykreslení textury:
effect.TextureEnabled = false;
Nyní je již vše v pořádku a program se spustí bez problémů a ukáže vše tak jak bylo zamýšleno.

O texturách a texturování, různých filtrech, adresních modech a alfa kanálu se toho dá napsat ještě mnoho. Je ale asi na čase pohnout se dál. A jako vždy malý úkol. Zkuste si schválně udělat obdélník z více trojúhelníků a naneste texturu na něj. Určitě se nebojte komentovat a případně i připojte vaše přání co dále očekáváte a co byste rádi viděli dále.
V příští lekci, XNA tvorba ve 3D - souřadnice a matice 3D světa, se podíváme na souřadnice a matice 3D světa.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 273x (99.01 kB)
Aplikace je včetně zdrojových kódů v jazyce C#