News

DirectX- oswajamy potwora. Wierzchołki.

Bufory wierzchołków w DirectX

Tym razem zajmiemy się aspektem bezpośrednio związanym z tworzeniem obrazu– koncepcją wierzchołków w grafice trójwymiarowej oraz ich realizacją w Direct Graphics. Po raz pierwszy narysujemy także coś przy pomocy narzędzi wbudowanych w API.

Początkowe efekty mogą wydać Ci się niezbyt imponujące w porównaniu z nakładem pracy, który włożylismy. Niestety taka jest specyfika programowania w DirectX i dość często przeraża ona początkujących. Nie należy się jednak zniechęcać, nowego kodu jest tym razem znacznie mniej niż poprzednio i daje on wreszcie jakieś widoczne efekty.

Zmienię także nieco sam układ poradnika. Tym razem najpierw omówię większość teorii, a dopiero na końcu przedstawię dość krótki przykładowy kod, który będzie praktyczną realizacją wspomnianej teorii. Zapraszam do lektury.

Wierzchołki

Jednym z pierwotnych pojęć w geometrii jest punkt. Przez dwa punkty możemy przeprowadzić linię, a z trzech punktów utworzyć trójkąt definiujący powierzchnię. Wierzchołek jest w grafice 3D odpowiednikiem punktu w geometrii. Nie definiujemy jego pojęcia, możemy natomiast określić takie jego parametry, jak położenie czy kolor. Dwa wierzchołki możemy połączyć ze sobą tworząc linię, natomiast trzy wierzchołki utworzą trójkąt (powierzchnię), czyli podstawowy element, z którego składa się obraz w grafice 3D.

Karty graficzne są zaprojektowane do wydajnej pracy z wierzchołkami, reprezentowanymi przez wektory (na razie nie będę wyjaśniał samego pojęcia wektora, przedstawię je przy omawianiu transformacji wierzchołków). Początkowy etap renderingu, wykonywany jeszcze przed teksturowaniem, opiera się wyłącznie na pracy z wierzchołkami (modyfikacja ich położenia, koloru). Zajmuje się nim jednostka T&L w karcie graficznej (a właściwie w niemal wszystkich obecnych kartach graficznych, jednostka VertexShader, ale o tym później).

Wierzchołki z perspektywy Direct Graphics

Jak już wspomniałem wyżej, każdy wierzchołek posiada parametry takie, jak położenie, kolor, współrzędne tekstury itp. Z perspektywy programisty wierzchołek jest tak naprawdę strukturą, zawierającą wspomniane parametry.

W DirectX struktura ta nie jest zdefiniowana na stałe i może być dowolnie modyfikowana przez programistę tak, by uzyskać pożądany efekt. Potrzebować różnych formatów wierzchołków będziemy wtedy, gdy na przykład jeden rodzaj obiektu w grze wymaga nałożenia 5 różnych tekstur (wymagane jest 5 zestawów współrzędnych tekstur), z kolei inny nie wymaga w ogóle tekstury, ale potrzebuje za to dwóch parametrów określających kolor.

Tworzenie różnych struktur wierzchołków dla różnych typów obiektów w świecie 3D pozwala na lepsze zagospodarowanie pamięci karty oraz poprawia wydajność (karta, zanim rozpocznie renderowanie dowiaduje się, które moduły musi wykorzystać i jakie optymalizacje może zastosować).

Zarządzanie formatami wierzchołków umożliwia system FVF (z ang. Flexible Vertex Format – Elastyczny Format Wierzchołków). Format każdego rodzaju wierzchołka definiowany jest za pomocą zestawu flag. Te najważniejsze dla nas w tej chwili przedstawione są w tabelce:

D3DFVF_XYZ Flaga definiuje trzy parametry typu float, opisujące położenie wierzchołka w przestrzeni. Taki wierzchołek jest określony jako nieprzetworzony i jest kierowany do modułu T&L.
D3DFVF_RHW Podobnie do poprzedniego, z tą różnicą, że DX traktuje wierzchołek jako wstępnie przetworzony przez aplikację i kieruje go od razu do potoku teksturującego.
D3DFVF_NORMAL Definiuje wektor normalny dla danego wierzchołka, czyli wektor prostopadły do powierzchni, której elementem jest dany wierzchołek. Jest on niezbędny do prawidłowych obliczeń oświetlenia obiektu (oświetlenie także omówię w kolejnych artykułach).
D3DFVF_DIFFUSE Definiuje kolor rozpraszający obiektu, czyli główny kolor powierzchni, którą reprezentuje dany wierzchołek.
D3DFVF_SPECULAR Definiuje kolor odbicia światła od obiektu.
D3DFVF_TEX0 - D3DFVF_TEX8 Definiuje współrzędne kolejnych tekstur dla danego wierzchołka (szczegóły omówię w kolejnym artykule).

Należy także pamiętać, że nie wszystkie flagi FVF możemy dowolnie mieszać ze sobą. Na przykład zmieszanie flag D3DFVF_XYZRHW i D3DFVF_NORMAL sprawi, że obiekt nie zostanie w ogóle oświetlony. Karta potraktuje go jako wstępnie przekształcony i niewymagający dodatkowej obróbki, czyli oświetlenia.

Format wierzchołka możemy zdefiniować w praktyce w następujący sposób:

#define FVF_WIERZCHOLEK (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
struct WIERZCHOLEK
{
float x,y,z,rhw; 
DWORD kolor;
};

Pierwsza linijka określa właściwy format FVF wierzchołków. Mamy tu kombinację flag mówiącą karcie, że wykorzystujemy już przekształcone wierzchołki, posiadające kolor rozpraszający. Poniższa struktura pozwala na dostęp do kolejnych parametrów wierzchołka w wygodny sposób. Modyfikacja tej deklaracji do poniższej postaci sprawi, że karta rozpozna jeszcze nieprzekształcone wierzchołki, wymagające dodatkowych obliczeń związanych z translacją, skalowaniem, obrotem i oświetleniem.

#define FVF_WIERZCHOLEK (D3DFVF_XYZ | D3DFVF_NORMAL |D3DFVF_DIFFUSE)

struct WIERZCHOLEK
{
float x,y,z,rhw;
float nx,ny,nz;
DWORD kolor;
};

Sądzę, że w tej chwili wygląda to dość skomplikowanie. Nie zniechęcaj się, gdy sam będziesz eksperymentował z tego typu kodem, na pewno szybko zrozumiesz, jak dobierać odpowiednie flagi i pola w strukturze.

Strona: 1 2 3 4 Następna
Zgłoś błąd