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.

d3dkurs4.jpg
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

0 komentarzy