IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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ě:

Základy 3D grafiky a tvorba enginu

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));
Základy 3D grafiky a tvorba enginu

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.

Základy 3D grafiky a tvorba enginu

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#

 

Předchozí článek
XNA tvorba ve 3D - dva je více než jeden
Všechny články v sekci
Základy 3D grafiky a tvorba enginu
Přeskočit článek
(nedoporučujeme)
XNA tvorba ve 3D - souřadnice a matice 3D světa
Článek pro vás napsal vodacek
Avatar
Uživatelské hodnocení:
1 hlasů
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