Managed » Direct3D

4. Wykorzystanie tekstur

  • 2009-06-10 13:54
  • 0 komentarzy
  • 1090 odsłon
  • Oceń ten tekst jako pierwszy
Spis treści

     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.

Okno aplikacji z kwadratem z wierzchołków ekranowych
<center>Rys. 2. Okno aplikacji z kwadratem z wierzchołków ekranowych</center>

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 (5,01 KB)