Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie grafiki 3D Wprowadzenie Kilka słów o przedmiocie Czym jest OpenGL? Założenia i konwencje przyjęte w OpenGL Biblioteka GLUT Pierwszy program.

Podobne prezentacje


Prezentacja na temat: "Programowanie grafiki 3D Wprowadzenie Kilka słów o przedmiocie Czym jest OpenGL? Założenia i konwencje przyjęte w OpenGL Biblioteka GLUT Pierwszy program."— Zapis prezentacji:

1 Programowanie grafiki 3D Wprowadzenie Kilka słów o przedmiocie Czym jest OpenGL? Założenia i konwencje przyjęte w OpenGL Biblioteka GLUT Pierwszy program Prymitywy w OpenGL

2 Kilka słów o przedmiocie Forma zajęć: - Wykłady - Laboratoria Zaliczenie: - dwa kolokwia na laboratorium Tematyka: - Przede wszystkim OpenGL - VTK, ORGE

3 Kilka słów o przedmiocie Materiały dodatkowe: - internet: książki: The OpenGL Reference Manual - The Bluebook - Dave Shreiner OpenGL w praktyce - Janusz Ganczarski The OpenGL Programming Guide - The Redbook – Dave Shreiner Advanced Graphics Programming Using OpenGL – Tom McReynolds, David Blythe

4 Czym jest OpenGL? OpenGL (Open Graphics Library) - specyfikacja uniwersalnego API do generowania grafiki. Zestaw funkcji składa się z około 250 podstawowych wywołań, umożliwiających budowanie złożonych trójwymiarowych scen z podstawowych figur geometrycznych Silicon Graphics Inc. IRIS GL API 1992 OpenGL Architectural Review Board (ARB) 2004 OpenGL ARBKhronos (OpenGL 2.1) 3.VIII.2009 OpenGL VIII.2011 OpenGL 4.2

5 Czym jest OpenGL? - Systemem typu klient-serwer - API (ApplicationProgrammingInterface) do obsługi grafiki 3D - Biblioteką procedur niskopoziomowych - Maszyną stanu Czym OpenGL nie jest? - Biblioteką wysokiego poziomu - Systemem śledzenia biegu promieni świetlnych (raytracing) Pomocne dodatki do OpenGL: - GLU(GL UtilityLibrary) - GLUT(GL UtilityToolkit) - GLAUX, GLX, WGL, SDL… i wiele innych

6 Czym jest OpenGL? Potok przetwarzania grafiki (graphics pipe line) W OpenGL jest jeszcze drugi potok – przetwarzania obrazów rastrowych.

7 Czym jest OpenGL? Zalety OpenGL: - Najpowszechniej implementowany standard grafiki 3D - Stabilna, niezawodna - Systematycznie rozwijania (system rozszerzeń) - Łatwa w użyciu (znacznie łatwiejsza od DirectX) - Przenośna i skalowalna - Dobrze udokumentowana Wady OpenGL: - Zaszłości historyczne - Nieobiektowość (choć niektórzy traktują to jako zaletę) - Mnogość tożsamych funkcji - Brak możliwości bezpośredniego powiązania ze sterownikiem - Zaawansowane funkcje dostępne tylko w rozszerzeniach

8 Czym jest OpenGL? Zalety DirectX: - Łatwość pisania pod różne karty - Biblioteka obiektowa - Bardziej spójne API - Bezpośredni dostęp do sterowników Wady DirectX: - W zasadzie ograniczony do Windows i Xboxa - Trudniejszy w nauce - Gorsza dokumentacja i wsparcie internetowe Należy pamiętać, że DirectX to biblioteka znacznie szersza niż obsługa grafiki 3D. W zasadzie odpowiednikiem OpenGLa jest jedynie moduł Direct3D. Biorąc to pod uwagę, zaletą DirectXa będzie również obsługa całej multimedialności komputera.

9 Czym jest OpenGL? Licencja: - Wolna dla twórców oprogramowania bazującego na API OpenGL - Komercyjna dla producentów sprzętu (sterowniki) Aby skompilować i uruchomić program trzeba mieć: - Biblioteki statyczne: opengl32.lib, glu32.lib i ew. glut.lib - Pliki nagłówkowe: gl.h, glu.h ew. glut.h - W ścieżce muszą być widoczne: opengl32.dll, glu32.dll i ew. glut32.dll - Kartę graficzną obsługującą odpowiednią wersję OpenGLa Aby sprawdzić możliwości swojej karty graficznej (sterownika) w obsłudze OpenGL można użyć programu OpenGL ExtensionViewer

10 Ktoś używa OpenGL? Gry komputerowe: - Call of Duty (cała seria)

11 Ktoś używa OpenGL? Gry komputerowe: - Doom3 (i cała seria Quake)

12 Ktoś używa OpenGL? Gry komputerowe: - War of Warcraft (domyślnie pod Windows Direct3D) - Star Wars: Knights of the Old Republic (również II część) - Counter-Strike i wiele, wiele innych Inne programy: - 3D Studio Max - Blender - Photoshop CS4, Premiere Pro, After Effects - Google Earth - Stellarium

13 Konwencje typ OpenGLbityopis GLboolean1typ logiczny GLbyte8liczba całkowita ze znakiem GLubyte8liczba całkowita bez znaku GLchar8znak tekstowy GLshort16liczba całkowita ze znakiem GLushort16liczba całkowita bez znaku GLint32liczba całkowita ze znakiem GLuint32liczba całkowita bez znaku GLsizei32nieujemna liczba całkowita GLenum32typ wyliczeniowy GLintptr*adres liczby całkowitej ze znakiem GLsizeiptr*adres liczby całkowitej bez znaku GLbitfield32pole bitowe GLfloat32liczba zmiennoprzecinkowa pojedynczej precyzji GLclampf32liczba zmiennoprzecinkowa pojedynczej precyzji z przedziału GLdouble64liczba zmiennoprzecinkowa podwójnej precyzji GLclampd64liczba zmiennoprzecinkowa podwójnej precyzji z przedziału

14 Konwencje OpenGL stosuje następującą konwencję nazywania funkcji: rtype Name{1|2|3|4}{b|s|i|f|d|ub|us|ui}{v}([args,]T arg1,..., T argN[,args]) Typ zwracany Liczba argumentów Podaje typ argumentów: b - argumenty typu GLbyte, s - argumenty typu GLshort, i - argumenty typu GLint, f - argumenty typu GLfloat, d - argumenty typu GLdouble, ub - argumenty typu GLubyte, us - argumenty typu GLushort, ui - argumenty typu GLuint Podaje typ argumentów: b - argumenty typu GLbyte, s - argumenty typu GLshort, i - argumenty typu GLint, f - argumenty typu GLfloat, d - argumenty typu GLdouble, ub - argumenty typu GLubyte, us - argumenty typu GLushort, ui - argumenty typu GLuint Argumentem będzie tablica wartości. Liczby argumentów nie podaje się. Argumentem będzie tablica wartości. Liczby argumentów nie podaje się. Argumenty funkcji Nazwy wszystkich funkcji biblioteki OpenGL rozpoczynają się od przedrostka gl, a funkcje biblioteki GLU od przedrostka glu.

15 Konwencje OpenGL stosuje następującą konwencję nazywania funkcji: rtype Name{1|2|3|4}{b|s|i|f|d|ub|us|ui}{v}([args,]T arg1,..., T argN[,args]) Typ zwracany Liczba argumentów Podaje typ argumentów: b - argumenty typu GLbyte, s - argumenty typu GLshort, i - argumenty typu GLint, f - argumenty typu GLfloat, d - argumenty typu GLdouble, ub - argumenty typu GLubyte, us - argumenty typu GLushort, ui - argumenty typu GLuint Podaje typ argumentów: b - argumenty typu GLbyte, s - argumenty typu GLshort, i - argumenty typu GLint, f - argumenty typu GLfloat, d - argumenty typu GLdouble, ub - argumenty typu GLubyte, us - argumenty typu GLushort, ui - argumenty typu GLuint Argumentem będzie tablica wartości. Liczby argumentów nie podaje się. Argumentem będzie tablica wartości. Liczby argumentów nie podaje się. Argumenty funkcji Nazwy wszystkich funkcji biblioteki OpenGL rozpoczynają się od przedrostka gl, a funkcje biblioteki GLU od przedrostka glu. void glPixelTransferf (GLenum pname, GLfloat param) void glPixelTransferi (GLenum pname, GLint param) void glColor3ub (GLubyte red, GLubyte green, GLubyte blue) void glColor3ui (GLuint red, GLuint green, GLuint blue) void glColor3ubv (const GLubyte *v) void glColor3uiv (const GLuint *v) void glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) void glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha) void glPixelTransferf (GLenum pname, GLfloat param) void glPixelTransferi (GLenum pname, GLint param) void glColor3ub (GLubyte red, GLubyte green, GLubyte blue) void glColor3ui (GLuint red, GLuint green, GLuint blue) void glColor3ubv (const GLubyte *v) void glColor3uiv (const GLuint *v) void glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) void glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha)

16 Konwencje OpenGL przyjmuje prawoskrętny układ współrzędnych z osią z standardowo skierowaną w stronę widza. X Y Z UWAGA: W grafice komputerowej znacznie częściej przyjmuje się lewoskrętny układ współrzędnych. UWAGA: W grafice komputerowej znacznie częściej przyjmuje się lewoskrętny układ współrzędnych. Maszyna stanów OpenGL przechowuje wszystkie parametry pracy biblioteki. Wiele parametrów można ustawić (włączyć) funkcją: void glEnable(GLenum cap) a wyłączyć funkcją: void glDisable(GLenum cap)

17 Konwencje GLenum glGetError(void) Obsługę błędów realizuje funkcja: GLenum glGetError(void). Błędy w OpenGL odkładane są na stosie. Funkcja zwraca wartość błędu z góry stosu. GL_OUT_OF_MEMORY Wystąpienie błędu z wyjątkiem GL_OUT_OF_MEMORY nie przerywa wykonania programu. Pomijana jest jedynie operacja powodująca błąd. błądopis GL_NO_ERRORbrak błędu GL_INVALID_ENUMbłędna wartość typu wyliczeniowego GL_INVALID_VALUEbłędna wartość argumentu GL_INVALID_OPERATIONoperacja niemożliwa do wykonania GL_STACK_OVERFLOWprzepełnienie stosu GL_STACK_UNDERFLOWniedomiar stosu GL_OUT_OF_MEMORYbrak pamięci GL_TABLE_TOO_LARGEzbyt duża tablica const GLubyte *gluErrorString(GLenumerrorCode) Biblioteka GLU udostępnia: const GLubyte *gluErrorString(GLenumerrorCode). GLU_INVALID_ENUM Błędy z OpenGL mają swoje odpowiedniki w GLU np. GLU_INVALID_ENUM.

18 Biblioteka GLUT Biblioteka OpenGL została zaprojektowana tak, aby być niezależną zarówno od sprzętu jak i od systemu operacyjnego. Nie zawiera zatem żadnych funkcji odpowiedzialnych za interfejs użytkownika. Biblioteka GLUT uzupełnia tą lukę i jest również multiplatformowa. Biblioteka zawiera 10 grup funkcji. Initialization Begining event processing Windows management Menu management Callback Registration Index Colormap Management State Retrieval Font Rendering Overlay management Geometric Object Rendering inicjalizacja biblioteki, początkowe pozycje i rozmiary okien, inicjalizacja trybu graficznego obsługa pętli zdarzeń tworzenie i niszczenie okien zarządzanie oknami i ich parametrami obsługuje tryb nakładki tworzy i zarządza menu programu rejestracja funkcji obsługujących zdarzenia obsługa indeksowanego trybu barw obecnie bezużyteczna zwraca parametry stanu obsługa wbudowanych czcionek bitmapowych 9 typowych obiektów każdy w wersji solid i wire

19 Biblioteka GLUT GLUT Open GLUT Free GLUT Oryginalna biblioteka autorstwa Marka J. Kilgarda z Silicon Graphics Od wersji 3.7 (2001 rok) nie rozwijana Najpopularniejsza Pełna zgodność z GLUT Dodatkowe funkcje (m.in. menu z ikonkami) Pełna zgodność z GLUT Bezproblemowa integracja z różnymi środowiskami

20 Biblioteka GLUT Funkcje inicjalizujące Pierwszą linijką w każdym programie używającym biblioteki GLUT zawsze jest wywołanie funkcji: void glutInit(int *argc, char **argv) Drugą linijką najczęściej jest wywołanie funkcji inicjalizującej bufor ramki: void glutInitDisplayMode(unsigned int mode) Parametr mode jest maską bitową, której bity można ustawiać korzystając z operatora |. GLUT_RGBAGLUT_INDEXGLUT_ALPHAGLUT_RGB GLUT_RGBA, GLUT_INDEX, GLUT_ALPHA, GLUT_RGB – ustala tryb koloru GLUT_SINGLEGLUT_DOUBLE GLUT_SINGLE, GLUT_DOUBLE – ustala liczbę buforów GLUT_ACCUM GLUT_ACCUM – włącza bufor akumulacyjny GLUT_DEPTH GLUT_DEPTH – włącza bufor głębokości GLUT_STENCIL GLUT_STENCIL – włącza bufor szablonowy GLUT_MULTISAMPLE GLUT_MULTISAMPLE – włącza wielopróbkowanie GLUT_STEREO GLUT_STEREO – włącza tryb stereoskopowy (niewiele implementacji obsługuje ten tryb) GLUT_LUMINANCE GLUT_LUMINANCE – zamiast trybu RGB włącza tryb odcieni szarości

21 Biblioteka GLUT Funkcje tworzenia i obsługi okien. void glutInitWindowSize(int width, int height) void glutInitWindowPosition(int x, int y) int glutCreateWindow(char *name) void glutSetWindow(int win) int glutGetWindow(void) int glutCreateSubWindow(int win, int x, int y, int width, int height) void glutDestroyWindow(int win) void glutPositionWindow(int x, int y) void glutReshapeWindow(int width, int height) void glutFullScreen(void) void glutSetWindowTitle(char *name) void glutSetIconTitle(char *name) void glutPostRedisplay(void) void glutSwapBuffers(void) void glutHideWindow(void) void glutShowWindow(void) void glutIconifyWindow(void)

22 Biblioteka GLUT Funkcje obsługi zdarzeń. Funkcja rejestrująca handler obsługujący przyciski klawiatury zwracające kod ASCII: void glutKeyboardFunc (void (*func)(unsigned char key, int x, int y)) Funkcja rejestrująca handler obsługujący klawisze specjalne: void glutSpecialFunc (void (*func)(int key, int x, int y)) Biblioteka oferuje predefiniowane stałe: GLUT_KEY_F1, …, GLUT_KEY_F12 GLUT_KEY_LEFT, GLUT_KEY_RIGHT, GLUT_KEY_UP, GLUT_KEY_DOWN GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT Obsługa wciśnięcia lub zwolnienia klawisza myszy: void glutMouseFunc (void (*func)(int button, int state, int x, int y)) button: GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON state: GLUT_UP, GLUT_DOWN Obsługa poruszania myszą z wciśniętym klawiszem. void glutMotionFunc(void (*func)(int x, int y)) Obsługa poruszania myszą ze zwolnionym klawiszem. void glutPassiveMotionFunc (void (*func)(int x, int y))

23 Biblioteka GLUT Obsługa zdarzeń polegających na wejściu kursora w obszar okna oraz wyjścia poza okno: void glutEntryFunc(void (*func)(int state)) state: GLUT_LEFT, GLUT_ENTERED Obsługa zdarzeń związanych z oknem: void glutDisplayFunc(void (*func)(void)) void glutReshapeFunc(void (*func)(int width, int height)) void glutVisibilityFunc(void (*func)(int state)) state: GLUT_NOT_VISIBLE, GLUT_VISIBLE Obsługa stanu bezczynności: void glutIdleFunc(void (*func)(void)) Obsługa timera systemowego: void glutTimerFunc(unsigned int milis, void (*func)(int value), value)

24 Biblioteka GLUT Funkcje tworzenia i obsługi menu. Tworzenie, usuwanie i przełączanie się między menu: int glutCreateMenu(void (*func)(int value)) void glutDestroyMenu(int menu) void glutSetMenu(int menu) int glutGetMenu(void) Dodawanie, usuwanie i zmiana pozycji w menu: void glutAddMenuEntry(char *name, int value) void glutRemoveMenuItem(int entry) void glutChangeToMenuEntry(int entry, char *name, int value) Tworzenie i zmiana podmenu: void glutAddSubMenu(const char *label, int submenu) void glutChangeToSubMenu(int entry, char *name, int menu) Dodawanie, usuwanie i zmiana pozycji w menu: void glutAddMenuEntry(char *name, int value) void glutRemoveMenuItem(int entry) void glutChangeToMenuEntry(int entry, char *name, int value)

25 Biblioteka GLUT Powiązanie i usuwanie powiązania menu z klawiszem myszy. void glutAttachMenu (int button) button: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON void glutDetachMenu(int button) Obsługa pętli zdarzeń: void glutMainLoop(); Czcionki bitmapowe void glutBitmapCharacter(void *font, int character) void glutBitmapWidth(void *font, int character) font: GLUT_BITMAP_8_BY_13, GLUT_BITMAP_9_BY_15, GLUT_BITMAP_TIMES_ROMAN_10, GLUT_BITMAP_TIMES_ROMAN_24 GLUT_BITMAP_HELVETICA_10, GLUT_BITMAP_HELVETICA_12, GLUT_BITMAP_HELVETICA_18 Niestety biblioteka GLUT obsługuje wyłącznie kodowanie ISO

26 Biblioteka GLUT Zmienne stanu Stan klawiszy specjalnych można sprawdzić funkcją: int glutGetModifiers(void); W bibliotece zdefiniowano stałe: GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL, GLUT_ACTIVE_ALT. Sprawdzenie czy dany klawisz został wciśnięty przeprowadza się następująco: If (GLUT_ACTIVE_CTRL & glutGetModifiers()) … Funkcja zwracająca wartość wybranego parametru : int glutGet(GLenum type); GLUT_WINDOW_X, GLUT_WINDOW_Y, GLUT_WINDOW_WIDTH, GLUT_WINDOW_HEIGHT, GLUT_INIT_WINDOW_WIDTH, GLUT_INIT_WINDOW_HEIGHT, GLUT_SCREEN_WIDTH, GLUT_SCREEN_HEIGHT GLUT_WINDOW_BUFFER_SIZE, GLUT_WINDOW_RED_SIZE, GLUT_WINDOW_GREEN_SIZE, GLUT_WINDOW_BLUE_SIZE, GLUT_WINDOW_ALPHA_SIZE, GLUT_WINDOW_STENCIL_SIZE GLUT_WINDOW_ACCUM_RED_SIZE, GLUT_WINDOW_ACCUM_GREEN_SIZE, GLUT_WINDOW_ACCUM_BLUE_SIZE, GLUT_WINDOW_ACCUM_ALPHA_SIZE

27 Pierwszy program. #include bool keys[256],specialkeys[256]; int main(intargc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(0,0); glutCreateWindow("OpenGL -Szablon..."); initOpenGL(); glutDisplayFunc(drawScene); glutReshapeFunc(reshapeScreen); glutKeyboardFunc(keyDown); glutKeyboardUpFunc(keyUp); glutSpecialFunc(specialKeyDown); glutSpecialUpFunc(specialKeyUp); glutMainLoop(); return 0; }

28 Pierwszy program. #include bool keys[256],specialkeys[256]; int main(intargc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(0,0); glutCreateWindow("OpenGL -Szablon..."); initOpenGL(); glutDisplayFunc(drawScene); glutReshapeFunc(reshapeScreen); glutKeyboardFunc(keyDown); glutKeyboardUpFunc(keyUp); glutSpecialFunc(specialKeyDown); glutSpecialUpFunc(specialKeyUp); glutMainLoop(); return 0; } void initOpenGL() { glClearColor(0.0f,0.0f,0.0f,0.0f); } void initOpenGL() { glClearColor(0.0f,0.0f,0.0f,0.0f); }

29 Pierwszy program. #include bool keys[256],specialkeys[256]; int main(intargc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(0,0); glutCreateWindow("OpenGL -Szablon..."); initOpenGL(); glutDisplayFunc(drawScene); glutReshapeFunc(reshapeScreen); glutKeyboardFunc(keyDown); glutKeyboardUpFunc(keyUp); glutSpecialFunc(specialKeyDown); glutSpecialUpFunc(specialKeyUp); glutMainLoop(); return 0; } void initOpenGL() { glClearColor(0.0f,0.0f,0.0f,0.0f); } void initOpenGL() { glClearColor(0.0f,0.0f,0.0f,0.0f); } void drawScene() { handleKeys(); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glutSwapBuffers(); glutPostRedisplay(); } void drawScene() { handleKeys(); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glutSwapBuffers(); glutPostRedisplay(); }

30 Pierwszy program. #include bool keys[256],specialkeys[256]; int main(intargc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(0,0); glutCreateWindow("OpenGL -Szablon..."); initOpenGL(); glutDisplayFunc(drawScene); glutReshapeFunc(reshapeScreen); glutKeyboardFunc(keyDown); glutKeyboardUpFunc(keyUp); glutSpecialFunc(specialKeyDown); glutSpecialUpFunc(specialKeyUp); glutMainLoop(); return 0; } void initOpenGL() { glClearColor(0.0f,0.0f,0.0f,0.0f); } void initOpenGL() { glClearColor(0.0f,0.0f,0.0f,0.0f); } void drawScene() { handleKeys(); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glutSwapBuffers(); glutPostRedisplay(); } void drawScene() { handleKeys(); glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glutSwapBuffers(); glutPostRedisplay(); } void handleKeys() { if(keys[27]) exit(0); } void handleKeys() { if(keys[27]) exit(0); }

31 Pierwszy program. #include bool keys[256],specialkeys[256]; int main(intargc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(0,0); glutCreateWindow("OpenGL -Szablon..."); initOpenGL(); glutDisplayFunc(drawScene); glutReshapeFunc(reshapeScreen); glutKeyboardFunc(keyDown); glutKeyboardUpFunc(keyUp); glutSpecialFunc(specialKeyDown); glutSpecialUpFunc(specialKeyUp); glutMainLoop(); return 0; } void reshapeScreen(int w, int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, 0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void reshapeScreen(int w, int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, 0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }

32 Pierwszy program. #include bool keys[256],specialkeys[256]; int main(intargc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowSize(640,480); glutInitWindowPosition(0,0); glutCreateWindow("OpenGL -Szablon..."); initOpenGL(); glutDisplayFunc(drawScene); glutReshapeFunc(reshapeScreen); glutKeyboardFunc(keyDown); glutKeyboardUpFunc(keyUp); glutSpecialFunc(specialKeyDown); glutSpecialUpFunc(specialKeyUp); glutMainLoop(); return 0; } void keyDown(unsigned char key, int x,int y) { keys[key]=true; } void keyUp(unsigned char key, int x,int y) { keys[key]=false; } void specialKeyDown(int key, int x, int y) { specialkeys[key]=true; } void specialKeyUp(int key, int x, int y) { specialkeys[key]=false; } void keyDown(unsigned char key, int x,int y) { keys[key]=true; } void keyUp(unsigned char key, int x,int y) { keys[key]=false; } void specialKeyDown(int key, int x, int y) { specialkeys[key]=true; } void specialKeyUp(int key, int x, int y) { specialkeys[key]=false; }

33 Prymitywy w OpenGL Definicja każdego podstawowego obiektu OpenGL składa się z uporządkowanego zbioru punktów (vertexów) opisujących wierzchołki obiektu i zawsze ma postać: void glBegin(GLenum mode) … definicje wierzchołków i inne parametry (*)… void glEnd(void) Argument mode informuje o tym jaki prymityw powstanie. W OpenGL dostępne są: modeprymitywmodeprymityw GL_POINTSzbiór odseparowanych punktówGL_TRIANGLE_STRIPwstęga trójkątów GL_LINESpojedyncze linieGL_TRIANGLE_FANwachlarz trójkątów GL_LINE_STRIPlinie połączone (łamana)GL_QUADSczworokąty GL_LINE_LOOPłamana zamkniętaGL_QUAD_STRIPwstęga czworokątów GL_TRIANGLESoddzielne trójkątyGL_POLYGONwielokąt (*) glVertex, glColor, glSecondaryColor, glIndex, glNormal, glTexCoord, glMultiTexCoord, glVertexAttrib, glFogCoord, glArrayElement, glEvalCoord, glEvalPoint, glMaterial, glEdgeFlag, glCallList, glCallLists

34 Prymitywy w OpenGL GL_POINTS GL_LINE_STRIP GL_LINES GL_LINE_LOOP GL_POLYGON GL_TRIANGLES

35 Prymitywy w OpenGL GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP

36 Prymitywy w OpenGL Wierzchołki mogą być definiowane przez funkcje jednej z trzech grup: void glVertex2d (GLdouble x, GLdouble y) void glVertex2f (GLfloat x, GLfloat y) void glVertex2i (GLint x, GLint y) void glVertex2s (GLshort x, GLshort y) void glVertex2dv (const GLdouble *v) void glVertex2fv (const GLfloat *v) void glVertex2iv (const GLint *v) void glVertex2sv (const GLshort *v) void glVertex2d (GLdouble x, GLdouble y) void glVertex2f (GLfloat x, GLfloat y) void glVertex2i (GLint x, GLint y) void glVertex2s (GLshort x, GLshort y) void glVertex2dv (const GLdouble *v) void glVertex2fv (const GLfloat *v) void glVertex2iv (const GLint *v) void glVertex2sv (const GLshort *v) void glVertex3d (GLdouble x, GLdouble y, GLdouble z) void glVertex3f (GLfloat x, GLfloat y, GLfloat z) void glVertex3i (GLint x, GLint y, GLint z) void glVertex3s (GLshort x, GLshort y, GLshort z) void glVertex3dv (const GLdouble *v) void glVertex3fv (const GLfloat *v) void glVertex3iv (const GLint *v) void glVertex3sv (const GLshort *v) void glVertex3d (GLdouble x, GLdouble y, GLdouble z) void glVertex3f (GLfloat x, GLfloat y, GLfloat z) void glVertex3i (GLint x, GLint y, GLint z) void glVertex3s (GLshort x, GLshort y, GLshort z) void glVertex3dv (const GLdouble *v) void glVertex3fv (const GLfloat *v) void glVertex3iv (const GLint *v) void glVertex3sv (const GLshort *v) void glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w) void glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w) void glVertex4i (GLint x, GLint y, GLint z, GLint w) void glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w) void glVertex4dv (const GLdouble *v) void glVertex4fv (const GLfloat *v) void glVertex4iv (const GLint *v) void glVertex4sv (const GLshort *v) void glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w) void glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w) void glVertex4i (GLint x, GLint y, GLint z, GLint w) void glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w) void glVertex4dv (const GLdouble *v) void glVertex4fv (const GLfloat *v) void glVertex4iv (const GLint *v) void glVertex4sv (const GLshort *v) Wierzchołki wielokąta oraz czworokątów muszą leżeć w jednej płaszczyźnie. OpenGL tego nie sprawdza, a efekty nieprzestrzegania tej zasady mogą być nieprzewidywalne. Wierzchołki wielokątów muszą być uporządkowane. Czworokąty i wielokąty muszą być wypukłe.

37 Prymitywy w OpenGL Aby przyspieszyć rysowanie, w specjalny sposób zostały potraktowane prostokąty. void glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) void glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) void glRecti (GLint x1, GLint y1, GLint x2, GLint y2) void glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2) void glRectdv (const GLdouble *v1, const GLdouble *v2) void glRectfv (const GLfloat *v1, const GLfloat *v2 ) void glRectiv (const GLint *v1, const GLint *v2) void glRectsv (const GLshort *v1, const GLshort *v2) void glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) void glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) void glRecti (GLint x1, GLint y1, GLint x2, GLint y2) void glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2) void glRectdv (const GLdouble *v1, const GLdouble *v2) void glRectfv (const GLfloat *v1, const GLfloat *v2 ) void glRectiv (const GLint *v1, const GLint *v2) void glRectsv (const GLshort *v1, const GLshort *v2) void glPointSize(GLfloat size) Rozmiary punktów ustala funkcja: void glPointSize(GLfloat size). void glLineWidth(GLfloat width) Grubość linii ustala funkcja: void glLineWidth(GLfloat width). void glLineStipple(GLint factor, GLushort pattern) Rodzaj linii ustala funkcja: void glLineStipple(GLint factor, GLushort pattern). pattern Ustawione bity parametru pattern informują, które punkty prostej mają być rysowane. factor Zmienna factor określa ile razy poszczególne bity mają zostać powtórzone. Standardowo w maszynie stanu rysowanie linią z wzorca jest wyłączone. GL_LINE_STIPPLE Aby je aktywować, należy włączyć opcję GL_LINE_STIPPLE.


Pobierz ppt "Programowanie grafiki 3D Wprowadzenie Kilka słów o przedmiocie Czym jest OpenGL? Założenia i konwencje przyjęte w OpenGL Biblioteka GLUT Pierwszy program."

Podobne prezentacje


Reklamy Google