4. Wykorzystanie tekstur
Szczawik
1 Wstęp
2 Definiowanie wierzchołków
3 Renderowanie
4 Przywracanie urządzenia
5 Kod źródłowy
Wstęp
Wykorzystamy program z kroku 3. Wyświetlanie figur płaskich na ekranie, ale, zamiast ekranowych wierzchołków, opisanych kolorem, użyjemy tekstury. Tekstura to obraz dwuwymiarowy nałożony na obiekt w przestrzeni. Ponieważ jednak same wierzchołki są ekranowe, tekstura na razie będzie po prostu obrazem, narysowanym w określonym miejscu okna.
Rys. 2. Okno aplikacji z kwadratem z wierzchołków ekranowych
Definiowanie wierzchołków
Tym razem do klasy TDirectX dodajmy pole prywatne:
private CustomVertex.TransformedTextured[] vertex;
Będzie to tablica czterech wierzchołków kwadratu. Wypełnijmy ich opis w funkcji Initialize. Ponieważ jako typu wierzchołków wybraliśmy wierzchołki ekranowe, opisane teksturą, musimy podać współrzędne położenia X, Y, Z, RHW oraz współrzędne tekstury Tu, Tv. Współrzędna Tu odpowiada teksturze w osi X i jest wartością między 0..1. Wartość 0 oznacza, że wierzchołkowi odpowiada lewa krawędź tekstury, wartośc 1.0 - prawa, natomiast wartości pośrednie - punktom pośrednim tekstury. Tekstura rozpostarta między dwoma wierzchołkami, gdy jeden ma Tu równe 0, a drugi równe 2.5 przedstawia dwuipółkrotnie powtórzoną szerokość obrazu. Analogicznie Tv odpowiada osi Y tekstury.
Dodatkowo należy dodać pole obiektu tekstury:
private Texture texture;
Po uzupełnieniu parametrów wierzchołków, można utworzyć obiekt tekstury, któremu podamy jako parametr strumień, zawierający obraz tekstury. Następnie strumień należy zwolnić.
/// <summary>
/// Tworzenie wszystkich elementów sceny
/// </summary>
private void Initialize()
{
vertex = new CustomVertex.TransformedTextured[4];
vertex[0].X=0;
vertex[0].Y=0;
vertex[0].Z=0;
vertex[0].Rhw = 1;
vertex[0].Tu = 0;
vertex[0].Tv = 0;
vertex[1].X=64;
vertex[1].Y=0;
vertex[1].Z=0;
vertex[1].Rhw = 1;
vertex[1].Tu = 1;
vertex[1].Tv = 0;
vertex[2].X=0;
vertex[2].Y=64;
vertex[2].Z=0;
vertex[2].Rhw = 1;
vertex[2].Tu = 0;
vertex[2].Tv = 1;
vertex[3].X=64;
vertex[3].Y=64;
vertex[3].Z=0;
vertex[3].Rhw = 1;
vertex[3].Tu = 1;
vertex[3].Tv = 1;
System.IO.Stream stream = new System.IO.FileStream(@"c:\windows\kawa.bmp", System.IO.FileMode.Open);
texture = new Texture(device, stream, Usage.Dynamic, Pool.Default);
stream.Dispose();
}
Renderowanie
Renderowanie odbywa się podobnie jak poprzednio. Dodatkowo wybierana jest aktualna tekstura. Warto podkreślić, że tekstura jest stosowana do kolejnych obiektów, renderowanych po jej deklaracji.
device.SetTexture(0, texture);
device.VertexFormat = CustomVertex.TransformedTextured.Format;
device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, vertex);
Przywracanie urządzenia
Tekstury są jednym z zasobów, który należy przywrócić po utracie dostępu do urządzenia, na przykład w wyniku minimalizacji okna. Odpowiedzialny jest za to kod obsługi zdarzenia device.DeviceReset, w naszym przypadku metoda:
protected virtual void RestoreDeviceObjects(object sender, EventArgs e)
{
texture.Dispose();
Initialize();
}
Zwalnia on niepoprawny już obiekt bitmapy i wykonuje ponowne definiowanie obiektów.
Kod źródłowy
Całość kodu źródłowego projektu: d3dkurs4.zip