W tym artykule stworzymy rozbudowany szablon programu pracującego na OpenGl.

1. Przygotowanie podłoża dla programu

Nasz program pracujący na OpenGl nie będzie posiadał obiektu TForm oraz żadnych komponentów VCL.
Dzięki temu aplikacja będzie działać szybciej oraz będzie miała mniejszy rozmiar.

Na początku utwórz na dysku katalog dla naszego projektu np. Szablon. Następnie zrób w nim podkatalogi :

  • data – będzie zawierał wszystkie tekstury, obiekty oraz muzykę
  • dcu – w nim będą znajdować się skompilowane pliki źródeł.
  • source – katalog dla kodu źródłowego (pliki pas, dpr). Utwórz w nim podkatalog library. W nim
    znajdować się będą biblioteki opengl.

Teraz skopiuj gl.pas oraz glu.pas z archiwum do katalogu library.

W ten sposób przygotowaliśmy katalog dla naszego projektu. Nadszedł czas, aby uruchomić Delphi. W górnym menu wybierz File -> New -> Other … a następnie Console Application.
Musimy wyłączyć tryb konsoli, w tym celu usuwamy tekst {$APPTYPE CONSOLE}. W rezultacie powinniśmy zobaczyć taki oto kod :

Klikamy teraz w górnym menu Project -> Options… -> Directories/Conditionals . Wpisujemy w opdowiednie pola :

Output directory : ../
Unit output directory : ../dcu/

Klikamy OK, następnie Save All. Wybieramy wcześniej utworzony katalog i w podkatalogu source zapisujemy nasz program.

2. WinApi – obsługa komunikatów, wywołanie okna

Skończyliśmy przygotowywać „podłoże” dla programu. Teraz zabierzemy się za coś bardziej skomplikowanego.
Utwórzmy trzy dodatkowe unity o nazwach : api_func.pas, render.pas, timer.pas i zapiszmy je w katalogu source.

Teraz w naszym projekcie musimy zadeklarować wszystkie pliki z których będziemy korzystać. Umieścimy dodatkowo wywołanie funkcji, która będzie obsługiwać cały program. Jej tłumaczeniem zajmiemy się trochę później.

Otwórzmy przed chwilą utworzony plik api_func.pas. Wprowadź do niego kod :

Oprócz deklaracji plików w uses wprowadziliśmy trzy zmienne. Pierwsza zawiera tablicę klawiszy dwie następne są wymagane do wejścia w tryb OpenGl. Teraz dopiszmy procedurę, która będzie ustawiać początkowe parametry OpenGl.

Na początku uruchomiliśmy obsługę dwuwymiarowych tekstur. Następnie ustawiliśmy kolor tła na czarny.
W poszczególnych parametrach wpisujemy wartość od 0 do 1:

Wyczyściliśmy bufor, włączyliśmy testowanie głębokości a jako jego rodzaj wybraliśmy GL_LEQUAL.

Oto wszystkie dostępne rodzaje :
– GL_NEVER – nigdy nie rysuje
– GL_ALWAYS – zawsze rysuje.
– GL_LESS – rysuje, jeżeli ( ref & mask) GL_LEQUAL – rysuje, jeżeli ( ref & mask) ? ( stencil & mask).
– GL_GREATER – rysuje, jeżeli ( ref & mask) > ( stencil & mask).
– GL_GEQUAL – rysuje, jeżeli ( ref & mask) ? ( stencil & mask).
– GL_EQUAL – rysuje, jeżeli ( ref & mask) = ( stencil & mask).
– GL_NOTEQUAL – rysuje, jeżeli ( ref & mask) 1 ( stencil & mask).

ref – Wartość odniesienia, którego zakres jest wyznaczany przez ilość bitów (2n – 1)
mask – Jest do maska, do której przyrównywane są piksele. Piksel jest rysowany tylko dla wartości 1 maski.

Poniższa procedura resetuje ustawienia OpenGl przystosowując go do nowego rozmiaru okna:

Zmienne AWidth i AHeight to szerokość i wysokość nowego okna. Resztę poleceń wytłumaczyliśmy przy opisywaniu poprzedniej procedury. Kolejną funkcją w api_func.pas będzie WndProc. Jest ona odpowiedzialna na obsługę komunikatów WinApi : informowanie o wciśniętych klawiszach, wywołuje tryb OpenGl, zamyka go przy wychodzeniu z programu, uruchamia przed chwilą stworzoną procedurę podczas zmiany rozmiaru okna. Szczegółowy opis poszczególnych poleceń znajduje się w komentarzach obok nich.

Ostatnią funkcją w tym pliku jest WinMain. Spotkaliśmy się z nią na początku artykułu. Jest to „centrum zarządzania” naszego programu. W niej tworzymy okno, które następnie będzie wykorzystywane przez OpenGl, ustawiamy rozdzielczość ekranu.
Funkcja jest odpowiedzialna za wysyłanie i odbieranie komunikatów, które są interpretowane przez poprzednią funkcję WndProc.

3. Rendering sceny – wyświetlanie obiektów

Ufff … nareszcie koniec tego WinApi. Może to wyglądało dość skomplikowanie, ale w rzeczywistości nie dzieją się tam żadne cude. Ten kod niemalże w każdym projekcie wygląda identycznie, zmianie ulegają tylko pojedyncze parametry.

Przejdźmy teraz do rysowania i wyświetlania różnych elementów w OpenGl. Otwórz plik render.pas.
Jego górna część musi wyglądać następująco :

Poniższa procedura czyści ekran i wyświetla grafikę:

Ostania procedura w tym pliku odpowiedzialna jest za rysowanie elementów sceny. Oto ona:

Nie będę opisywał szczegółowo, co dzieje się w pętli. Jak uruchomicie program to zobaczycie. Oto jakie parametry ustawiamy w GlColor3f :

Każdy kolor przyjmuje wartości od 0 do 1. Jeżeli chcemy dodatkowo dodać kanał Alfa, odpowiedzialny za przezroczystość musimy użyć polecenia:

glVertex3f ustawia współrzędne przesunięcia dla wierzchołka. np.

rysuje wierzchołek przesunięty w górę o -5.

Szczegółowo prymitywy (podstawowe elementy w OpenGL) omówimy w następnym artykule.

3. Timer – obliczenia wykonywane przed wyświetleniem każdej klatki

Otwórzmy plik timer.pas. W nim będziemy umieszczać wszystkie procedury oraz funkcje odpowiedzialne za wszelkiego rodzaju obliczenia.  Oto cały kod w pliku:

Na razie znajduje się w nim tylko jedna procedura obliczająca pozycję dla wierzchołków wyświetlanych w RenderFrame.
Na tym zakończymy ten artykuł. Zapewne zauważyłeś, że został nałożony duży nacisk na porządek w kodzie. Oddzielne są pliki dla grafiki, obliczeń oraz winapi. Na tym nie koniec. Wkrótce  dołączymy pliki odpowiedzialne za obsługę klawiatury, myszki itd. Każde następne artykuły będą kontynuacją tego, opuścimy w nich wszelkie wiadomości opisane tutaj, a zajmiemy się wprowadzaniem nowych możliwości.

Autor: Nakiel

Załączniki