Odwzorowywanie tekstur Kurs ITA-106 (Grafika i multimedia) – Moduł 4 Jacek Matulewski (e-mail: jacek@fizyka.umk.pl) http://www.fizyka.umk.pl/~jacek/dydaktyka/3d/ XNA Odwzorowywanie tekstur Wersja: 5 lutego 2009
Plan Współrzędne teksturowania Klasa werteksu VertexPositionColorNormalTexture Wczytywanie i nakładanie tekstury Zawijanie tekstury Przeźroczystość w teksturach Mipmapy Skybox
Współrzędne teksturowania 1/7 Współrzędne teksturowania Teksel (texel = texture element lub texture pixel) piksel tekstury nakładanej na bryłę w grafice 3D Współrzędna teksturowania (texture coordinate) (u,v) współrzędne w jednostkach rozmiaru tekstury wyznaczające położenie obrazu względem figury u v
2/7 Nowy typ werteksu Typ werteksu uwzględniający współrzędne teksturowania public struct VertexPositionColorNormalTexture { public Vector3 Position; public Color Color; public Vector3 Normal; public Vector2 TextureCoordinate; public static int SizeInBytes = 8 * sizeof(float) + sizeof(uint); … Element Pozycja Typ XNA Interpretacja Position VertexElementFormat.Vector3 VertexElementUsage.Position Color 3 * sizeof(float) VertexElementFormat.Color VertexElementUsage.Color Normal 3 * sizeof(float) + sizeof(uint) VertexElementUsage.Normal Texture Coordinate 6 * sizeof(float) + sizeof(uint) VertexElementFormat.Vector2 VertexElementUsage. TextureCoordinate
Projekt startowy do lab. podst. -/7 Projekt startowy do lab. podst. Projekt można pobrać z http://www.fizyka.umk.pl/~jacek/dydaktyka/3d/xna/ita106/ Plik 4B0 Tekstury (lab. podst.) - Start.zip Obracający się sześcian z normalnymi i oświetleniem Fragment kodu dodający współrzędne teksturowania do pobrania z txt\Zbior werteksow prostopadloscianu ze wspolrzednymi teksturowania.txt
Tekstury a karta graficzna -/7 Tekstury a karta graficzna
Labolatorium podstawowe -/7 Labolatorium podstawowe W pliku Prostopadloscian.cs: Zamienić typ werteksu na VertexPositionColorNormalTexture (Ctrl+H) W konstruktorach werteksów podać współrzędne teksturowania (kod do pobrania) Zdefiniować własność Prostopadloscian.Texture. W pliku Game1.cs: Wczytać teksturę (patrz następne przeźrocza) Powiązać wczytaną teksturę z efektem używanym do rysowania sześcianu.
Wczytywanie i nakładanie tekstury 3/7 Wczytywanie i nakładanie tekstury Przygotowujemy plik BMP/DDS, PNG, JPEG lub TGA. Kopiujemy plik obrazu do podkatalogu Content katalogu projektu. Dodajemy plik obrazu do projektu (Add, Existing Item…). Podczas kompilacji konwersja do formatu .xnb. Załadowanie tekstury do pamięci: efekt.Texture = game.Content.Load<Texture2D>("Nefryt"); efekt.TextureEnabled = true;
Zawijanie tekstur 4/7 Wrap Mirror Clamp Border Clamp w kierunku u Wrap w kierunku v
Przezroczystość tekstur 5/7 Przezroczystość tekstur Ładowanie tekstury efekt.Texture = this.Content.Load<Texture2D>("Xnalogo16"); int iloscPikseli = efekt.Texture.Width * efekt.Texture.Height; Color[] tabelaPikseli = new Color[iloscPikseli]; efekt.Texture.GetData<Color>(tabelaPikseli); Color kolorPrzezroczysty = tabelaPikseli[0]; //piksel (0,0) for (int i = 0; i < iloscPikseli; i++) if (tabelaPikseli[i] == kolorPrzezroczysty) tabelaPikseli[i].A = 0; efekt.Texture.SetData<Color>(tabelaPikseli); Kopiowanie tekseli do tablicy Color[] Białe bity będą przeźroczyste Zapisanie zmian do tekstury Należy pamiętać o włączeniu alpha blendingu!
Przezroczystość tekstur 5/7 Przezroczystość tekstur
6/7 Mipmapy 32 x 32 8 x 8 2 x 2 256 x 256 128 x 128 1 x 1 4 x 4 16 x 16 64 x 64 Przygotowanie tekstur w różnych rozmiarach, co ułatwia ich skalowanie (jakość i szybkość)
Skybox Sześcian obejmujący kamerę z odwróconym cullingiem 7/7 Skybox Sześcian obejmujący kamerę z odwróconym cullingiem Teksturujemy jego ściany pejzażem, np.: Źródło: http://www.scentednectar.com/skyboxes/