Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL Dorota Smorawa
Pierwszy program Pierwszy program będzie składał się z trzech etapów: Funkcji rysującej scenę 3D, Inicjacji okna renderingu, Obsługa menu podręcznego
Funkcji rysującej scenę 3D Zawiera składowe: void scena() { zawartość bufora koloru kolor tła czyszczenie bufora dotyczącego koloru kolor prymitywu początek definicji prymitywu kolejne wierzchołki prymitywu koniec definicji prymitywu skierowanie poleceń do wykonania zamiana buforów }
Inicjacji okna renderingu void skalowania (int width, int height) { if (skalowanie = = SKALA_1_1) // obszar renderingu zachowanie proporcji 1:1 { if (width > height) // szerokość okna większa od wysokości okna glviewport ((width - height)/2,0,height,height); else if (width < height) // wysokość okna większa od wysokości okna glviewport (0,(height - width)/2,width,width); } else glviewport (0,0,width,height); // obszar renderingu bez zachowania proporcji generowanie sceny 3D }
Obsługa menu podręcznego void menu (int value) // obsługa menu podręcznego { switch (value) { case CALE_OKNO: // obszar renderingu - całe okno skalowanie = CALE_OKNO; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case SKALA_1_1: // obszar renderingu - skala 1:1 skalowanie = SKALA_1_1; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); break; case EXIT: // wyjście exit (0); } }
Obsługa menu podręcznego Stałe do obsługi menu podręcznego: enum { gdy nie zachowujemy proporcji gdy zachowujemy proporcje wyjście }; int skalowanie = SKALA_1_1;
Main int main (int argc, char *argv[]) { inicjacja biblioteki GLUT inicjalizacja bufora ramki z podwójnym buforowaniem ustalenie rozmiaru okna programu utworzenie głównego okna programu o podanej nazwie przyłączenie funkcji opisującej scenę 3D przyłączenie funkcji wywoływanej przy zmianie rozmiaru okna utworzenie menu podręcznego dodanie pozycji do menu podręcznego określenie przycisku myszki obsługującej menu podręczne wprowadzenie programu do obsługi pętli komunikatów return 0; }
glclearcolor Ustawia wartości koloru i kanału alfa stosowane w czasie czyszczenia bufora koloru. Funkcja ustala kolor, który będzie stosowany przy czyszczeniu bufora kolorów. Podawane wartości muszą być ograniczone do zakresu [0.0f, 1.0f] void glclearcolor(glclampf red, GLclampf green, GLclampf blue, GLclampf alpha) red składowa czerwona green składowa zielona blue składowa niebieska alpha składowa przezroczystości koloru
glclear Czyści zawartość określonego bufora lub kombinacji buforów void glclear (GL_COLOR_BUFFER_BIT) GL_COLOR_BUFFER_BIT ustawienie bufora kolorów
glcolor3f Funkcja ustala aktualny kolor definiowanego obiektu, pozwalając osobno składowe czerwoną, zieloną i niebieską. Funkcja pozwala też podanie wartości kanału alfa. Każda składowa reprezentowana jest liczbą z zakresu [0 1] void glcolor3f (GLfloat red, GLfloat green, GLfloat blue) red składowa czerwona green składowa zielona blue składowa niebieska alpha składowa przezroczystości koloru
glbegin Funkcja stosowana w połączeniu z funkcją glend do określania wierzchołków obiektów podstawowych biblioteki OpenGl. Wewnątrz jednej pary wywołań glbegin glend można definiować wiele zbiorów wierzchołków pod warunkiem, że będą one tworzyły obiekty podstawowe tego samego rodzaju. Funkcje, które można wywołać wewnątrz pary glbegin, glend glvertex, glcolor, glnormal, glevalcoord, glcalllist, glcalllists, gltexcoord, gledgeflag, glmaterial. void glbegin(plenum mode) mode ta wartość określa obiekt podstawowy, jaki będzie tworzony z wierzchołków. Na przykład GL_POLYGON rysowanie wielokątów wypukłych
glend Oznacza koniec listy wierzchołków definiujących obiekt podstawowy zapoczątkowanej wywołaniem funkcji glbegin void glend ()
glvertex3f Funkcja używana jest do definiowania współrzędnych wierzchołków punktów, linii, wielokątów definiowanych po uprzednim wywołaniu funkcji glbegin void glvertex3f(glfloat x, GLfloat y, GLfloat z) wartość 0.0 x, y, z współrzędne wierzchołka. Jeżeli wartość z nie jest podana, to nadawana jest jej domyślna
glflush ------------------------------------------- glutswapbuffers Czyści bufory i kolejki poleceń OpenGL. Powoduje natychmiastowe wykonanie wszystkich oczekujących poleceń. Operacja ta musi być zakończona w skończonym czasie. void glflush () ------------------------------------------------------- Wykonuje podmianę buforów w trybie podwójnego buforowania. Jeżeli aktualne okno działa w trybie podwójnego buforowania, to funkcja wykonuje wyczyszczenie potoku poleceń OpenGL i podmianę buforów. Dla pojedynczego buforowania funkcja wykonuje jedynie wyczyszczenie potoku poleceń void glutswapbuffers ()
glviewport Ustala część okna, na której może rysować biblioteka OpenGL. Funkcja ustala region wewnątrz okna, stosowany do odwzorowywania współrzędnych przestrzeni ograniczającej na fizyczne współrzędne okna void glviewport(glint x, GLint y, GLsizei width, GLsizei height) x liczba pikseli od lewej strony okna do początku widoku y liczba pikseli od dołu okna do początku widoku width szerokość widoku w pikselach height wysokość widoku w pikselach
glutinit Inicjacja biblioteki GLUT Składnia ------------------------------------------- glutget void glutinit(&argc, argv) ------------------------------------------- Pobiera informacje określone przez parametr int glutget(glenum type) Składnia type na przykład GLUT_WINDOW_WIDTH, GLUT_WINDOW_HEIGHT
glutinitdisplaymode Inicjacja trybu wyświetlania stosowanego przez bibliotekę GLUT w oknach OpenGL. Jest to pierwsza funkcja jaką wywołać musi program korzystający z biblioteki GLUT w celu skonfigurowania okna OpenGL. Funkcja ustala charakter okna, z których biblioteka OpenGL będzie korzystała w czasie rysowania void glutinitdisplaymode(unsigned int mode) Parametry (OR) mode maska lub kombinacja bitowa masek. Można je łączyć za pomocą operacji sumy logicznej (OR). Przykładowe maski GLUT_SINGLE pojedyncze buforowanie okna, GLUT_DOUBLE podwójne buforowanie okna, GLUT_RGB lub GLUT_RGBA okno z trybem kolorów
glutinitwindowsize Określa rozmiar okna renderingu, w którym będzie rysowana scena 3D. void glutinitwindowsize(int width, int height) width szerokość okna height wysokość okna
glutcreatewindow Tworzy okno współpracujące z biblioteką OpenGL. Funkcja tworzy nowe okno, które uznawane jest za aktualne int glutcreatewindow(char *name) name tekst wstawiany do nagłówka okna
glutdisplayfunc Ustala dla aktualnego okna funkcję zwrotną zajmującą się tworzeniem obrazu. Informuje bibliotekę GLUT, którą funkcję należy wywołać, gdy tylko zachodzi potrzeba narysowania zawartości okna. Void glutdisplayfunc(void(*func)(void)) func nazwa funkcji zajmującej się rysowaniem obrazu
glutreshapefunc Dla aktualnego okna ustala funkcję zwrotną zajmującą się obsługą zmian rozmiaru okna. Rejestruje funkcję zwrotną wywoływaną przez bibliotekę GLUT przy każdej zamianie rozmiaru lub kształtu okna. Funkcja zwrotna otrzymuje wartości nowej szerokości i wysokości okna void glutreshapefunc(void (*func)(int width, int height)) func nazwa funkcji wywoływanej przez bibliotekę GLUT przy zmianach rozmiaru okna
glutcreatemenu Tworzy menu podręczne Składnia int glutcreatemenu(void (*func)(int value)) func nazwa funkcji obsługi komunikatów menu. Zwracana wartość to unikatowy numer menu.
glutaddmenuentry Umożliwia dodanie kolejnych pozycji do menu podręcznego. Unikatowość numerów menu zapewnia zastosowanie typu wyliczeniowego. void glutaddmenuentry(char *name, int value) name nazwa pozycji menu value numer unikatowy przekazywany w przypadku wybrania tej pozycji do funkcji obsługującej komunikaty menu
glutattachmenu Funkcja określająca, który przycisk myszki aktywuje menu void glutattachmenu(int button) button GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON
glutmainloop Uruchamia główną pętlę biblioteki GLUT. Zajmuje się obsługą zdarzeń. Obsługiwane są wszystkie komunikaty związane z obsługą klawiatury, myszy, czasomierzy, rysowania i innych. Kończy swoje działanie dopiero wraz z końcem działania programu void glutmainloop() komunikaty menu
Literatura Richard S. Wright jr, Michael Sweet: OpenGL Księga eksperta Wydanie III, Helion2005 Pomoce dydaktyczne i instrukcje, http://icis.pcz.pl/~mkubanek Jackie Neider, Tom Davis, Mason Woo: OpenGL Programming Guide The RedBook Kevin Hawkins, Dave Astle: OpenGL. Programowanie gier, Helion 2003 The official OpenGL web page, http://www.opengl.org http://januszg.hg.pl/opengl/