2. díl - XNA tvorba ve 3D - textury

C# .NET XNA game studio 3D grafika 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ě 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.


 

Stáhnout

Staženo 256x (99.01 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal vodacek
Avatar
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.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře
Zobrazit starší komentáře (1)

Avatar
Kit
Redaktor
Avatar
Kit:

Když už si hraješ s detaily, tak si uvědom, že "mocnina dvojky" postrádá na významu. Dvojku nelze umocňovat.

Odpovědět 6.12.2012 22:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Kit
TomBen:

Proč by nešlo umocňovat zrovna dvojku? :)
Možná to myslíš nějak jinak, ale takhle napsáno mi to zní dost divně.
Např. 2 na 3 = 2.2.2 = 8 => ejhle třetí mocnina dvojky, ne?

Odpovědět 7.12.2012 0:54
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
vodacek
Redaktor
Avatar
vodacek:

jsem rád že to někdo opravdu čte, jak to ale napsat lépe?

 
Odpovědět 7.12.2012 8:30
Avatar
Kit
Redaktor
Avatar
Odpovídá na TomBen
Kit:

Tak si to zkus třeba v Pythonu. Nejprve násobení:
Dva krát tři

>>> 2*3
6

Dvojka krát tři

>>> '2'*3
'222'

Tedy dvojku násobit můžeme, ale výsledek je trochu jiný, než jaký bys asi očekával.

A teď umocňování:
Dvě na třetí

>>> 2**3
8

Dvojka na třetí

>>> '2'**3
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

Dvojku umocňovat nelze.

Editováno 7.12.2012 10:25
Odpovědět 7.12.2012 10:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na vodacek
Kit:

... POUZE obrázky o velikosti mocnin dvou.

Odpovědět 7.12.2012 10:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vodacek
Redaktor
Avatar
Odpovídá na Kit
vodacek:

dobře, udělal jsem úpravu, děkuji za upřesnění

 
Odpovědět 7.12.2012 10:35
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Kit
TomBen:

Hned jsem si myslel, že půjde o něco takového. :D
Zprvu to vypadalo na konec umocňování v Čechách. 8|

Odpovědět  +1 7.12.2012 11:38
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
vodacek
Redaktor
Avatar
Odpovídá na Kit
vodacek:

tak když je ta dvojka char (znak) a chce se s ním počítat tak se nedivim že se to bouří...

 
Odpovědět 7.12.2012 12:29
Avatar
TomBen
Redaktor
Avatar
Odpovídá na vodacek
TomBen:

Řekl bych, že to bude jádro pudla. :)
Mocnina dvou nebo mocnina dvojky. Číslice a číslo.

Odpovědět 7.12.2012 12:32
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Kit
Redaktor
Avatar
Odpovídá na TomBen
Kit:

Zajímavé je, že PHP se nevzteká.

Odpovědět 7.12.2012 12:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 11. Zobrazit vše