Janusz Ganczarski OpenGL Pierwszy program
Spis treści Spis treści..................................... 1 1. Pierwszy program.............................. 1 1.1. Rysowanie sceny 3D........................... 1 1.1.1. Kolor tła............................. 1 1.1.2. Czyszczenie bufora koloru................... 1 1.1.3. Kolor obiektu.......................... 1 1.1.4. Definiowanie obiektu...................... 2 1.1.5. Wykonanie poleceń OpenGL i zamiana buforów koloru... 3 1.2. Tworzenie okna renderingu....................... 3 1.3. Obsługa menu podręcznego....................... 4 1.4. Plik kwadrat1.cpp............................ 4 Literatura..................................... 7
1. Pierwszy program Pierwszy program korzystający z biblioteki OpenGL jest oczywiście bardzo prosty. Wyświetlimy w oknie o rozmiarach 400 400 pikseli kwadrat o bokach jednostkowych. Program składa się z trzech zasadniczych elementów. Pierwszy to funkcja rysująca scenę 3D, drugim jest inicjacja okna renderingu a trzecim obsługa menu podręcznego. 1.1. Rysowanie sceny 3D Rysowanie, czy też jak przyjęło się to nazywać, renderowanie sceny 3D, składa się z kilku kroków. Z uwagi na prostotę programu etapy występujące w pierwszym programie nie przedstawiają kompletnego schematu tworzenia sceny 3D. 1.1.1. Kolor tła Pierwszym etapem tworzenia sceny 3D, który realizuje funkcja Display, jest określenie koloru tła, czyli wartości jakimi zostanie wypełniony bufor koloru. Realizuje to funkcja: void glclearcolor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) której parametry red, green, blue określają wartości składowych koloru, a parametr alpha wartość składowej kanału alfa (stopień przezroczystości piksela). Wartości wszystkich parametrów funkcji glclearcolor powinny zawierać się w przedziale [0, 1]. Parametry przekraczające powyższy zakres zostaną odpowiednio przycięte: mniejsze od 0 przyjmą wartość 0, większe od 1 wartość 1. Domyślne podczas czyszczenia bufora koloru używa się koloru (0, 0, 0, 0). 1.1.2. Czyszczenie bufora koloru Po określeniu koloru tła przystępujemy do wyczyszczenia tła, czyli wypełnienia zawartości bufora koloru. Wykonuje to funkcja: void glclear (GLbitfield mask) której na razie jedynym parametrem jest stała GL COLOR BUFFER BIT określająca jaki element bufora ramki ma zostać wypełniony. 1.1.3. Kolor obiektu Kolejnym etapem tworzenia naszej sceny 3D jest określenie koloru obiektu. Wykorzystamy do tego celu jedną z funkcji z rodziny glcolor:
1. Pierwszy program 2 void glcolor3f (GLfloat red, GLfloat green, GLfloat blue) której parametry red, green, blue określają wartości składowych koloru. Zakres tych wartości powinny zawierać się w przedziale [0, 1]. Wartości znajdujące się poza tym przedziałem zostaną odpowiednio przycięte. Uważny Czytelnik zapyta zapewne dlaczego dla koloru obiektu nie określamy wartości składowej alfa. Jest to oczywiście możliwe - rodzina funkcji glcolor zawiera także funkcje określające kolor na podstawie czterech składowych. Jeżeli jednak zdecydujemy się na określanie tylko składowych RGB, składowa alfa przyjmuje domyślną wartość 1,0 (całkowita nieprzezroczystość). 1.1.4. Definiowanie obiektu Definiowanie obiektów w OpenGL rozpoczyna wywołanie funkcji: void glbegin (GLenum mode) która określa rodzaj generowanego prymitywu lub prymitywów. W pierwszym programie traktujemy kwadrat jako szczególny przypadek wielokąta, stąd stała GL POLYGON. Kolejne wierzchołki kwadratu określamy przy pomocy funkcji: void glvertex3f (GLfloat x, GLfloat y, GLfloat z) która należy do rodziny obszernej funkcji glvertex. Jeżeli uważnie popatrzymy na współrzędne wierzchołków rysowanego kwadratu, to zauważymy, że zawiera się on w płaszczyźnie o równaniu Z = 0. W takim przypadku do definiowania współrzędnych wierzchołków obiektów można także zastosować funkcję glvertex2, która pozwala określić dwie pierwsze współrzędne wierzchołków, trzeciej nadając wartość 0. Definiowane współrzędnych wierzchołków obiektu obowiązkowo kończy wywołanie funkcji: void glend (void) Specyfikacja biblioteki nie pozwala na uruchamianie wszystkich poleceń OpenGL pomiędzy parą wywołań funkcji glbegin i glend. Co do zasady mogą się tam znaleźć polecenia generujące obiekty sceny. Wywołanie niedozwolonej funkcji powoduje zgłoszenie błędu, ale nie przerywa działania programu.
1. Pierwszy program 3 1.1.5. Wykonanie poleceń OpenGL i zamiana buforów koloru To w jaki sposób biblioteka utworzy scenę 3D, po wywołaniu wszystkich funkcji tworzących jej elementy, zależy oczywiście od konkretnej implementacji. Jednak wywołując funkcję void glflush (void) możemy wymusić wykonanie wszystkich dotychczasowych poleceń. Ma to szczególne znaczenie, gdy dana implementacja stosuje bufory poleceń, a zależy nam na wykonaniu części zadań. Końcowym elementem tworzenia sceny 3D jest zamiana buforów koloru, co w przypadku stosowania biblioteki GLUT realizuje funkcja: void glutswapbuffers (void) 1.2. Tworzenie okna renderingu Okno renderingu tworzone jest funkcji main programu. Inicjalizację bufora ramki wykonuje funkcja: void glutinitdisplaymode (unsigned int mode) W przykładowym programie wartość parametru mode decyduje, że bufor ramki zawiera dwa bufory koloru (stała GLUT DOUBLE), które pracują w trybie RGB (stała GLUT RGB). Rozmiar okna renderingu, w którym będzie rysowana scena 3D określa funkcja: void glutinitwindowsize (int width, int height) której parametry width i height oznaczają odpowiednio szerokość i wysokość obszaru dostępnego do renderingu. Warto zauważyć, że wielkość okna jakie zostanie utworzone po wywołaniu funkcji: int glutcreatewindow (char *name) jest zależna od systemu operacyjnego i jest tak dobrane aby obszar dostępny do renderingu miał wcześniej określone rozmiary. W przykładowym programie obszar renderingu jest stały - zmiana rozmiaru okna (funkcja Reshape) nie modyfikuje jego rozmiarów. Zmiana rozmiaru okna nie powoduje zmiany wielkości ani przemieszczenia rysowanego kwadratu. Ostatnim etapem tworzenia okna renderingu jest dołączenie funkcji generującej scenę 3D (Display) oraz funkcji wywoływanej przy zmianie rozmiarów okna (Reshape). Realizują to funkcje: void glutdisplayfunc (void (*func)(void)) void glutreshapefunc (void (*func)(int width, int height))
1. Pierwszy program 4 1.3. Obsługa menu podręcznego Menu podręczne tworzy funkcja: int glutcreatemenu (void (*func)(int value)) której parametrem jest wskaźnik do funkcji obsługi komunikatów menu (w programie funkcja Menu) a zwracana wartośc to unikatowy numer menu. Dodanie kolejnych pozycji do menu podęcznego umożliwia funkcja: void glutaddmenuentry (char *name, int value) której parametry to nazwa pozycji menu i numer (unikatowy) przekazywany w przypadku wybrania tej pozycji do funkcji obsługującej komunikaty menu. W tym i dalszych programach unikatowość numerów menu zapewnia zastosowanie typu wyliczeniowego. W pierwszym programie menu ma minimalną zawartość - umożliwia jedynie wyjście z programu. Ostatnią operacją przy tworzeniu menu podręcznego jest wywołanie funkcji określającej, który przycisk myszki aktywuje menu: void glutattachmenu (int button) Możliwe są następujące wartości parametru button: GLUT LEFT BUTTON - lewy przycisk myszki, GLUT MIDDLE BUTTON - środkowy przycisk myszki, GLUT RIGHT BUTTON - prawy przycisk myszki. 1.4. Plik kwadrat1.cpp Początkowe okno programu kwadrat1.cpp, którego tekst źródłowy znajduje się poniżej, przedstawia rysunek 1. / ( c ) Janusz Ganczarski ( Power ) h t t p : / /www. j a n u s z g. hg. p l JanuszG@enter. n e t. p l / #include <GL/ glut. h> #include < s t d l i b. h> // f u n k c j a g e n e r u j ą c a s c e n ę 3D void D i s p l a y ( ) // k o l o r t ł a z a w a r t o ś ć b u f o r a k o l o r u g l C l e a r C o l o r ( 1. 0, 1. 0, 1. 0, 1. 0 ) ; // c z y s z c z e n i e b u f o r a k o l o r u g l C l e a r ( GL COLOR BUFFER BIT ) ; // k o l o r k w a d r a t u g l C o l o r 3 f ( 1. 0, 0. 0, 0. 0 ) ; // p o c z ą t e k d e f i n i c j i w i e l o k ą t a g l B e g i n (GL POLYGON) ; // k o l e j n e w i e r z c h o ł k i w i e l o k ą t a g l V e r t e x 3 f ( 0. 0, 0. 0, 0. 0 ) ; g l V e r t e x 3 f ( 0. 0, 1. 0, 0. 0 ) ;
1. Pierwszy program 5 Rysunek 1. Okno początkowe programu Kwadrat 1 g l V e r t e x 3 f ( 1. 0, 1. 0, 0. 0 ) ; g l V e r t e x 3 f ( 1. 0, 0. 0, 0. 0 ) ; // k o n i e c d e f i n i c j i prymitywu glend ( ) ; // s k i e r o w a n i e p o l e c e ń do wykonania g l F l u s h ( ) ; // zamiana b u f o r ó w k o l o r u glutswapbuffers ( ) ; // zmiana w i e l k o ś c i okna void Reshape ( int Width, int Height ) // g e n e r o w a n i e s c e n y 3D D i s p l a y ( ) ; // s t a ł e do o b s ł u g i menu p o d r ę c z n e g o enum EXIT // w y j ś c i e ; // ob sług a menu podręcznego void Menu ( int v a l u e ) switch ( v a l u e ) // w y j ś c i e
1. Pierwszy program 6 case EXIT : e x i t ( 0 ) ; int main ( int argc, char argv [ ] ) // i n i c j a l i z a c j a b i b l i o t e k i GLUT g l u t I n i t (& argc, argv ) ; // i n i c j a l i z a c j a b u f o r a ramki g l u t I n i t D i s p l a y M o d e (GLUT DOUBLE GLUT RGB ) ; // r o z m i a r y g ł ó w n e g o okna programu g l u t I n i t W i n d o w S i z e ( 4 0 0, 4 0 0 ) ; // u t w o r z e n i e g ł ó w n e g o okna programu glutcreatewindow ( Kwadrat 1 ) ; // d o ł ą c z e n i e f u n k c j i g e n e r u j ą c e j s c e n ę 3D glutdisplayfunc ( Display ) ; // d o ł ą c z e n i e f u n k c j i wywoływanej p r z y z m i a n i e r o z m i a r u okna glutreshapefunc ( Reshape ) ; // u t w o r z e n i e menu p o d r ę c z n e g o glutcreatemenu ( Menu ) ; // d o d a d n i e p o z y c j i do menu p o d r ę c z n e g o glutaddmenuentry ( Wyjście,EXIT ) ; // o k r e ś l e n i e p r z y c i s k u m y s z k i o b s ł u g u j ą c e j menu p o d r ę c z n e glutattachmenu (GLUT RIGHT BUTTON ) ; // w p r o w a d z e n i e programu do o b s ł u g i p ę t l i komunikatów glutmainloop ( ) ; return 0 ;
Literatura 7 Literatura [1] Mark Segal, Kurt Akeley: The OpenGL Graphics System. A Specification Version 2.0 [2] Jackie Neider, Tom Davis, Mason Woo: OpenGL Programming Guide The Red Book [3] Richard S. Wright jr, Michael Sweet: OpenGL Księga eksperta, Helion 1999 [4] The official OpenGL web page, http://www.opengl.org [5] Piotr andrzejewski, Jakub Kurzak: Wprowadzenie do OpenGL. Programowanie zastosowań graficznych, Kwantum 2000