Wizualizacje 3D
Prosty program- cpp #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> int main(int argc, char** argv) { glutinit(&argc, argv); glutinitdisplaymode( GLUT_DOUBLE GLUT_RGBA ); glutinitwindowsize(400, 400); glutinitwindowposition(100, 100) ; glutcreatewindow("opengl"); glutdisplayfunc( Display ); glutreshapefunc( Reshape); glutmainloop();
Prosty program cpp (2) void Display() { glclearcolor( 0.0, 0.0, 0.0, 0.0); glclear(gl_color_buffer_bit); glcolor3f( 1.0, 1.0, 1.0 ); glbegin( GL_TRIANGLES ); glvertex3f(-1, -1, -0.5); glvertex3f(-1, 1, -0.5); glvertex3f(1, 1, 1); glend(); glflush(); glutswapbuffers(); glutpostredisplay(); void Reshape(int w, int h) { Display();
Obszar renderingu void glviewport(glint x, GLint y, GLsizei width, GLsizei height) W aplikacjach pracujących w systemach okienkowych problem zmiany rozmiaru okna jest tak powszechny, że wymaga specjalnego potraktowania. Jednym z możliwych sposobów jego rozwiązania jest dynamiczna modyfikacja obszaru renderingu. Służy to tego właśnie ta funkcja. x, y współrzędne lewego dolnego narożnika obszaru renderingu względem lewego dolnego narożnika okna height wysokość okna renderingu width szerokość okna renderingu
Zastosowanie glviewport void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); Display();
Macierze OpenGL zawiera kilka stosów macierzy, z których w przykładowym programie wykorzystamy stos macierzy rzutowania oraz stos macierzy modelowania. Wybór bieżącej macierzy umożliwia funkcja: void glmatrixmode (GLenum mode) Parametr mode może przyjąć jedna z wartości: GL_MODELVIEW - macierz modelowania, GL_PROJECTION - macierz rzutowania, GL_TEXTURE - macierz tekstury.
Macierz jednostkowa Ponieważ początkowa wartość wybranej macierzy jest nieokreślona, przed wykonaniem jakiejkolwiek czynności na macierzy należy przyporządkować macierz jednostkową. 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 void glloadidentity (void)
Rzutowanie prostokątne void glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Rozmiar bryły odcinania w rzutowaniu prostokątnym Parametry określają współrzędne punktów przecięcia płaszczyzn tworzących bryłę odcinania z osiami układu współrzędnych kartezjańskich
Rzutowanie prostokątne Domyślnie bryła ma postać sześcianu o bokach = 2 glortho(-1,1,-1,1,-1,1)
Rzutowanie prostokątne dla sceny 2D void gluortho2d (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) Parametry left, right, bottom i top odpowiadaja parametrom funkcji glortho, a przednia (near) i tylna (far) płaszczyzna obcinania maja wartosci odpowiednio -1 i 1.
Przykład zastosowania rzutowania perspektywicznego void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); glcolor3f (0.0,0.0,0.0); glbegin (GL_LINES); glvertex3f (1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glend (); glflush (); glutswapbuffers();
void Reshape(int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode (GL_PROJECTION); glloadidentity (); glortho (-2.0, 2.0, -2.0, 2.0, -2.0, 2.0); Display();
Rzutowanie perspektywiczne Rzutowanie perspektywiczne daje bardziej realistyczne efekty niż rzutowanie prostokątne, stąd jest szeroko stosowane np. w grach. Parametry bryły odcinania, która przy rzutowaniu perspektywicznym ma postać ostrosłupa ściętego o wierzchołku znajdującym się w początku układu współrzędnych.
Rzutowanie perspektywiczne (2) void glfrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Parametry left, right, bottom i top wyznaczaja rozmiary górnej podstawy bryły odcinania (jest to obszar bezposrednio odwzorowywany na obszar renderingu), a near i far wyznaczaja połozenie odpowiednio górnej i dolnej podstawy ostrosłupa (przedniej i tylnej płaszczyzny odcinania), które zawieraja sie w płaszczyznach o równaniach: z = near i z = far. Parametry near i far musza miec wartosci dodatnie.
Przekształcenia geometryczne (3) Macierz rzutowania perspektywicznego, tworzona przez funkcje glfrustum i mnożona przez aktualnie wybrana macierz, ma postać:
void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode (GL_PROJECTION); glloadidentity (); glfrustum(-2.0,2.0,-2.0,2.0,1.0,5.0); Display();
Przykład - glfrustum void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); gltranslatef (0, 0, -3.0); glcolor3f (0.0,0.0,0.0); glbegin (GL_LINES); glvertex3f (1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glend (); glflush (); glutswapbuffers();
Rzutowanie perspektywiczne (4) Alternatywny sposób określania rzutu perspektywicznego umożliwia funkcja z biblioteki GLU: void gluperspective (GLdouble fovy, GLdouble aspect, GLdouble znear, GLdouble zfar) gdzie parametr fovy określa w stopniach kat widzenia obserwatora zawarty w płaszczyźnie YZ (kąt między top, 0, a bottom), a aspect jest stosunkiem szerokości do wysokości przedniej płaszczyzny odcinania, czyli górnej podstawy ostrosłupa ograniczającego scenę 3D. Parametry znear i zfar odpowiadają parametrom near i far funkcji glfrustum.
Rzutowanie perspektywiczne (5) Macierz rzutowania perspektywicznego, tworzona przez funkcje gluperspective i mnożoną przez aktualnie wybrana macierz, ma postać:
Rzutowanie perspektywiczne (6) Wewnętrznie funkcja gluperspective wykorzystuje do ustawienia macierzy rzutowania perspektywicznego funkcję glfrustum. Oto wzory przekształcenia parametrów funkcji gluperspective na parametry glfrustum:
Przykład - gluperspective
Obsługa klawiatury Podstawowa funkcja obsługi klawiatury ma trzy parametry: key - kod ASCII klawisza, x, y - współrzędne kursora myszki w chwili naciśnięcia przycisku klawiatury. Aby obsługa klawiatury działała, w części głównej programu należy włączyć funkcje obsługi klawiatury wywołując funkcje: void glutkeyboardfunc (void (*func)(unsigned char key, int x, int y))
Przykład #include <GL/glut.h> #include <stdlib.h> GLdouble fovy = 90; int main (int argc, char *argv[]) { glutinit (&argc,argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (400,400); glutcreatewindow ("Szescian"); glutdisplayfunc (Display); glutreshapefunc (Reshape); glutkeyboardfunc (Keyboard); glutmainloop (); return 0;
void Reshape (int width, int height) { glviewport (0, 0, width, height); glmatrixmode (GL_PROJECTION); glloadidentity (); GLdouble aspect = 1; if (height > 0) aspect = width/(gldouble)height; gluperspective (fovy,aspect,1.0,5.0); Display ();
void Keyboard (unsigned char key, int x, int y) { if (key == '+' && fovy < 180) fovy++; else if (key == '-' && fovy > 0) fovy--; Reshape (glutget (GLUT_WINDOW_WIDTH), glutget (GLUT_WINDOW_HEIGHT));
Położenie obserwatora Biblioteka GLU zawiera funkcje glulookat, która pozwala na jednorazowe zdefiniowanie wszystkich parametrów opisujących obserwatora: void glulookat (GLdouble eyex, GLdouble eyey,gldouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) eyex, eyey, eyez - współrzedne połozenia obserwatora, centerx, centery, centerz - współrzedne punktu, w którego kierunku jest zwrócony obserwator, upx, upy, upz - współrzedne wektora okreslajacego kierunek do góry. Domyślne położenie obserwatora odpowiada wywołaniu: glulookat (0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0)
Obsługa klawiszy specjalnych W głównym programie można włączyć obsługę klawiszy kursora i klawiszy funkcyjnych wywołując funkcje: void glutspecialfunc (void (*func)(int key, int x, int y)) x, y - współrzędne kursora myszki w chwili naciśnięcia przycisku klawiatury. key - kod przycisku; zwracana jest jedna z poniższych wartości: GLUT_KEY_F1 - przycisk F1, GLUT_KEY_F2 - przycisk F2, ( ) GLUT_KEY_F11 - przycisk F11, GLUT_KEY_F12 - przycisk F12, GLUT_KEY_LEFT - kursor w lewo, GLUT_KEY_UP - kursor do góry, GLUT_KEY_RIGHT - kursor w prawo, GLUT_KEY_DOWN - kursor w dół, GLUT_KEY_PAGE UP - przycisk Page Up GLUT_KEY_PAGE DOWN - przycisk Page Down, GLUT_KEY_HOME - przycisk Home, GLUT_KEY_END - przycisk End, GLUT_KEY_INSERT - przycisk Insert.
Przykład - glulookat #include <GL/glut.h> #include <stdlib.h> GLdouble eyex = 0; GLdouble eyey = 0; GLdouble eyez = 3; GLdouble centerx = 0; GLdouble centery = 0; GLdouble centerz = -100; int main (int argc, char *argv[]) { glutinit (&argc,argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (400,400); glutcreatewindow ("Szescian"); glutdisplayfunc (Display); glutreshapefunc (Reshape); glutkeyboardfunc (Keyboard); glutspecialfunc (SpecialKeys); glutmainloop (); return 0;
void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode(gl_projection); glloadidentity(); glfrustum (-2.0,2.0,-2.0,2.0,1.0,5.0); Display ();
void Keyboard (unsigned char key, int x, int y) { if (key == '+') else eyez -= 0.1; if (key == '-') eyez += 0.1; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); void SpecialKeys (int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: eyex += 0.1; break; case GLUT_KEY_UP: eyey -= 0.1; break; case GLUT_KEY_RIGHT: eyex -= 0.1; break; case GLUT_KEY_DOWN: eyey += 0.1; break; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); glulookat(eyex,eyey,eyez, centerx,centery,centerz, 0,1,0); glcolor3f (0.0,0.0,0.0); glbegin (GL_LINES); glvertex3f (1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, 1.0, 1.0); glvertex3f (-1.0, 1.0, 1.0); glvertex3f (1.0, -1.0, 1.0); glvertex3f (-1.0, -1.0, 1.0); glvertex3f (1.0, -1.0, -1.0); glvertex3f (-1.0, -1.0, -1.0); glvertex3f (1.0, 1.0, -1.0); glvertex3f (-1.0, 1.0, -1.0); glend (); glflush (); glutswapbuffers();
Przekształcenia geometryczne Obrót realizują funkcje: void glrotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z) void glrotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z) Gdzie: angle - kat obrotu w stopniach, x, y, z - współrzędne wektora określającego oś obrotu. Obrót realizowany jest w kierunku przeciwnym do ruchu wskazówek zegara w kierunku prostej wyznaczonej przez wektor [x, y, z] zaczepionym w początku układu współrzędnych.
Przekształcenia geometryczne cd. Funkcje glrotated i glrotatef mnożą bieżąca macierz przez macierz obrotu, która ma następująca postać
Przekształcenia geometryczne cd. Skalowanie void glscalef (GLfloat x, GLfloat y, GLfloat z) void glscalex (GLfixed x, GLfixed y, GLfixed z) gdzie x, y, z są współczynnikami skalowania względem kolejnych osi układu współrzędnych.
Przekształcenia geometryczne cd. Funkcje te mnożą bieżącą macierz przez macierz skalowania, która ma postać:
Przekształcenia geometryczne cd. Przesunięcie (translacja) void gltranslatef (GLfloat x, GLfloat y, GLfloat z) void gltranslatex (GLfixed x, GLfixed y, GLfixed z) gdzie x, y, z sa współrzednymi wektora przesuniecia.
Przekształcenia geometryczne cd. Funkcje mnożą bieżącą macierz przez macierz translacji, która ma postać:
Mnożenie macierzy przekształceń glmatrixmode(gl_model_v IEW); glloadidentity( ); gltranslatef(0.2,0.3,0.5); glscalef(1.5,1.5,0.5); glrotatef(30,1.0,0.0,0.0); glrotatef(45,0.0,1.0,0.0); glrotatef(-20,0.0,0.0,1.0); Kolejność wykonywania operacji Aktywacja pracy na macierzy przekształcania obiektów. Ładowanie macierzy jednostkowej Mnożenie macierzy jednostkowej przez macierz przesunięcia o wektor (0.2,0.3,0.5). Skalowanie obiektu: 1.5 raza w kierunku osi x i y oraz 0.5 raza w kierunku osi z. Obrót wokół osi x przeciwnie do ruchu wskazówek zegara o 30 stopni. Obrót wokół osi y przeciwnie do ruchu wskazówek zegara o 45 stopni. Obrót wokół osi z zgodnie z ruchem wskazówek zegara o 20 stopni.
Przykład #include <GL/glut.h> #include <stdlib.h> const GLdouble left = -10.0; const GLdouble right = 10.0; const GLdouble bottom = -10.0; const GLdouble top = 10.0; const GLdouble near_ = 50.0; const GLdouble far_ = 70.0; GLfloat scale = 1.0; GLfloat rotatex = 0.0; GLfloat rotatey = 0.0; GLfloat translatex = 0.0; GLfloat translatey = 0.0; int main (int argc, char *argv[]) { glutinit (&argc,argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (400,400); glutcreatewindow ("Przeksztalcenia"); glutdisplayfunc (Display); glutreshapefunc (Reshape); glutkeyboardfunc (Keyboard); glutspecialfunc (SpecialKeys); glutmainloop (); return 0;
void Display () { glclearcolor (1.0,1.0,1.0,1.0); glclear (GL_COLOR_BUFFER_BIT); glmatrixmode (GL_MODELVIEW); glloadidentity (); gltranslatef (0,0,-(near_+far_)/2); gltranslatef (translatex,translatey,0.0); glscalef (scale,scale,scale); glrotatef (rotatex,1.0,0,0); glrotatef (rotatey,0,1.0,0); glcolor3f (0.0,0.0,0.0); glutwiresphere (1.0,20,10); glflush(); glutswapbuffers ();
void Reshape (int w, int h) { if ( w < h ) { glviewport(0, (h-w)/2, w, w); else { glviewport((w-h)/2, 0, h, h); glmatrixmode (GL_PROJECTION); glloadidentity (); glfrustum (left,right,bottom,top,near_,far_); Display ();
void Keyboard (unsigned char key, int x, int y) { if (key == '+') scale += 0.1; if (key == '-' && scale > 0.1) scale -= 0.1; if (key=='s') translatey -= 0.5; if (key=='w') translatey += 0.5; if (key=='a') translatex -= 0.5; if (key=='d') translatex += 0.5; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT)); void SpecialKeys (int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: rotatey -= 1; break; case GLUT_KEY_UP: rotatex -= 1; break; case GLUT_KEY_RIGHT: rotatey += 1; break; case GLUT_KEY_DOWN: rotatex += 1; break; Reshape (glutget (GLUT_WINDOW_WIDTH),glutGet (GLUT_WINDOW_HEIGHT));
Gotowe obiekty 3D z biblioteki GLUT Kula void glutwiresphere (GLdouble radius, GLint slices, GLint stacks) radius - promien kuli, slices - ilosc południków, stacks - ilosc równolezników. Sześcian void glutwirecube (GLdouble size) size długość boku
Gotowe obiekty 3D z biblioteki GLUT cd Stożek void glutwirecone (GLdouble base, GLdouble height, GLint slices, GLint stacks) base - promien podstawy stozka, height - wysokosc stozka, slices - ilosc tworzacych, stacks - ilosc południków Torus void glutwiretorus (GLdouble innerradius, GLdouble outerradius, GLint sides, GLint rings) innerradius - promien koła tworzacego torus, outerradius - promien torusa, sides - ilosc scian bocznych, z których składa sie pojedynczy walec, rings - ilosc walców, z których składa sie torus
Gotowe obiekty 3D z biblioteki GLUT cd. Dwunastościan void glutwiredodecahedron (void) Czajnik void glutwireteapot (GLdouble size) size wielkość Ośmiościan void glutwireoctahedron (void) Czworościan void glutwiretetrahedron (void) Dwudziestoscian void glutwireicosahedron (void)
Stos macierzy Można zapamiętać aktualny stan macierzy zapisując ją na stosie. Operacje odłożenia bieżącej macierzy na stos: void glpushmatrix (void) Operacje zdjęcia macierzy ze stosu: void glpopmatrix (void)
Przykład Trzy czajniki ustawione obok siebie obrócone o różne kąty glpushmatrix(); gltranslatef(-2,0,0); glrotatef(45,1,0,0); glutwireteapot(0.8); glpopmatrix(); glpushmatrix(); gltranslatef(0,0,0); glrotatef(45,0,0,1); glutwireteapot(0.8); glpopmatrix(); glpushmatrix(); gltranslatef(2,0,0); glrotatef(45,0,1,0); glutwireteapot(0.8); glpopmatrix();
Przykład 2 Poprzedni przykład bez korzystania ze stosu macierzy gltranslatef(-2,0,0); glrotatef(45,1,0,0); glutwireteapot(0.8); gltranslatef(0,0,0); glrotatef(45,0,0,1); glutwireteapot(0.8); gltranslatef(2,0,0); glrotatef(45,0,1,0); glutwireteapot(0.8);
Primitywy Definiowanie współrzędnych wierzchołków figur podstawowych musi zawierać się pomiędzy wywołaniami funkcji: void glbegin (GLenum mode) void glend (void) Gdzie parametr mode okresla rodzaj prymitywu.
Rodzaje prymitywów
Definiowane współrzędnych wierzchołków 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)
Prostokąty Prostokąt rysowany jest na płaszczyźnie o równaniu Z=0, a jego boki są równoległe do osi układu współrzędnych. 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)
Punkty Rozmiar pojedynczego punktu void glpointsize (GLfloat size) size określa średnice punktu i jego wartość musi być większa od 0.
Linie Grubość (szerokość) linii void gllinewidth (GLfloat width) Parametr określa grubość linii i musi być większy od 0. Określenie wzoru jakim będzie rysowana linia void gllinestipple (GLint factor, GLushort pattern) pattern to 16-bitowa liczba całkowita zawierajaca wzór rysowanej linii factor określa zwielokrotnienie bitów wzoru. Włączenie mechanizmu rysowania linii ze wzorem wymaga wywołania funkcji glenable z parametrem GL_LINE_STIPPLE. glenable(gl_line_stipple); Wyłączenie mechanizmu rysowania linii ze wzorem wymaga wywołania funkcji gldisable(gl_line_stipple);
Timer Obsługa timera systemowego void gluttimerfunc(unsigned int milis, void(*func)(intvalue), value) Obsługa bezczynności void glutidlefunc(void(*func)(void))