DirectX: Labirynt 3D od podstaw
15.03.2010 - Adam Błaszkiewicz
Czas na Direct3D! Dotychczasowy projekt można pobrać z ramki po lewej. Teraz, zamiast tekstu, chcielibyśmy wyświetlić w naszym oknie scenę Direct3D. W tym celu musimy utworzyć urządzenie Direct3D, za pomocą którego będziemy wysyłali do karty graficznej scenę, którą będziemy chcieli wyrenderować. Dołączmy odpowiedni plik nagłówkowy:
DirectX jest oparty na modelu COM (Component Object Model). COM to binarny standard opisu obiektów, jest więc niezależny od języka programowania. Pozwala na odwoływanie się do obiektów za pomocą interfejsów i zapewnia współdzielenie obiektów w taki sposób, że są one automatycznie niszczone po zwolnieniu ostatniego interfejsu, czyli wtedy, gdy obiekt nie jest już używany. Dla uproszczenia, wskaźniki do interfejsów DirectX zadeklarujemy jako zmienne globalne:
Aby utworzyć D3DDevice, musimy użyć obiektu D3D, który musimy utworzyć wcześniej. Potrzebujemy też struktury D3DPRESENT_PARAMETERS oraz uchwytu do okna, więc musimy mieć to okno wcześniej utworzone. Najlepiej napisać poniższy kod tuż przed ShowWindow, aby wyświetlić już gotowe okno z gotowym do pracy Direct3D. Zauważ, że używamy tutaj bardzo nieeleganckiej instrukcji goto. Robimy to, aby przed wyjściem z programu zwolnić odpowiednie obiekty. W prawdziwym programie użylibyśmy klas w stylu RAII, ale wtedy kolejność wykonywania instrukcji w programie mogłaby nie być oczywista. Moglibyśmy też załatwić ten problem poprzez zagnieżdżanie bloków if, ale byłoby to koszmarnie nieczytelne. Dlatego na potrzeby tego tutoriala, w celu dydaktycznym, użyjemy instrukcji goto, która przenosi wykonywanie programu do momentu zwalniania pamięci w funkcji WinMain.
Wersja z komentarzami:
HRESULT jest typem kodującym wynik wywołania funkcji - kod błędu lub "kod sukcesu". Jest to liczba 32-bitowa. Domyślny błąd to E_FAIL, a domyślny sukces to S_OK. Zdefiniowane są następujące makra: SUCCEDED(hr) - TRUE (1), gdy hr jest kodem sukcesu, FALSE (0) w przeciwnym wypadku. FAILED(hr) - TRUE (1), gdy hr jest kodem błędu, FALSE (0) w przeciwnym wypadku. Powyższe makra są zdefiniowane w plikach nagłówkowych Windowsa, nie DirectX! Wartości typu HRESULT są także używane w COM. Zajmijmy się teraz zwalnianiem pamięci na końcu WinMain:
Wersja z komentarzami:
Jeśli w wyniku niepowodzenia zostanie użyta instrukcja goto, WinMain zwraca 1: (8.png) Musimy jeszcze wyrenderować naszą pierwszą, pustą scenę. Możemy to zrobić w obsłudze komunikatu WM_PAINT. Zastąpmy więc kod, który tam napisaliśmy, tym:
Funkcji ValidateRect używamy, aby oznaczyć cały obszar okna jako odmalowany i zapobiec zapętlonemu wysyłaniu komunikatu WM_PAINT przez system. Clear używamy, aby zamalować scenę na wybrany kolor - D3DCOLOR_XRGB( 128, 100, 50 ). Present wyświetla scenę. Możemy teraz skompilować i uruchomić nasz program. Aktualny projekt można pobrać z ramki po lewej. Ćwiczenie dla czytelnika: sprawdzić, co się stanie, jeśli wywołamy ShowWindow od razu po utworzeniu okna, a dopiero potem utworzymy Direct3D. (6 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com