Opengl pe exemple

Concepte de bază

Mai întâi, să facem niște definiții. Renderingul este un proces. cu care computerul creează imagini ale obiectelor. Obiectele constau din primitive geometrice - puncte. linii. gropile de gunoi. care sunt definite cu ajutorul vârfurilor. Pixelul este cel mai mic element elementar elementar al afișajului. Informațiile despre pixeli sunt stocate în memorie sub formă de zone de biți - plan. unde pentru fiecare pixel este atribuit 1 biți. Avionele sunt organizate într-un framebuffer. Luați în considerare un exemplu simplu - cum să desenați un dreptunghi alb pe fundal negru:
main () glClearColor (0.0, 0.0, 0.0, 0.0);
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1,0, 1,0, 1,0);
glOrtho (0,0, 1,0, 0,0, 1,0, -1,0, 1,0);
glBegin (GL_POLYGON);
glVertex3f (0,25, 0,25, 0,0);
glVertex3f (0,75, 0,25, 0,0);
glVertex3f (0,75, 0,75, 0,0);
glVertex3f (0,25, 0,75, 0,0);
glEnd ();
glFlush ();
>
glClearColor () stabilește culoarea de fundal în negru. glClear () șterge fundalul. În viitor. de fiecare dată. când este apelat glClear (). va șterge fereastra neagră. glColor3f () stabilește culoarea desenului în alb. glOrtho () definește sistemul de coordonate. glBegin () și glEnd () definesc obiectul. care vor fi trase. glVertex3f () definește vârfurile poligonului. ca parametri - 3 coordonate x, y, z. glFlush () ne garantează. că desenul poligonului va fi executat imediat. Toate comenzile OpenGL încep cu prefixul gl. toate constantele încep de asemenea cu prefixul GL_. De exemplu. în comanda glColor3f (), numărul 3 indică faptul că. care coordonează 3. și prefixul "f" spune că. că argumentul este un punct plutitor. În general. în OpenGL există 8 tipuri principale de tip de date. 1. 8 biți întreg 2. 16 biți întreg 3. 32 de biți întreg 4. 32 de biți în virgulă mobilă 5. 64 biți în virgulă mobilă 6. 8 biți întreg fără semn întreg 7. 16 biți fără semn 8. 32-bit întreg nesemnat So. Cele două comenzi glVertex2i (1, 3) și glVertex2f (1.0, 3.0) sunt de fapt echivalente. deși au tipuri diferite. Unele comenzi au ultimul caracter "v". care indică un vector. De exemplu. glColor3f (1,0,0,0,0,0); GLfloat color_array [] =; glColor3fv (color_array); Aici definim o matrice și îi oferim un vector vectorial. Accesul la această matrice este determinat utilizând comanda frecvent folosită GLvoid (). După ce am setat culoarea cu glColor3f (). toate obiectele ulterioare vor fi afișate în exact aceeași culoare. Până vom schimba din nou. Printre conceptele de bază se numără vizualizarea curentă. proiecții, linie. poligoane de scriere, moduri de desen poligon, convenții de împachetare a pixelilor, poziții și caracteristici lumini, proprietăți ale materialelor. Puteți accesa variabilele utilizând glEnable () sau glDisable (). Funcția glGetBooleanv (), glGetDoublev (), glGetFloatv (), glGetIntegerv (), glGetPointerv (), glIsEnabled () - setați tipul de date. glPushAttrib () și glPushClientAttrib () sunt scrise în stivă. glPopAttrib () și glPopClientAttrib () sunt restabilite. OpenGL este foarte clar organizat în ceea ce privește ordinea de executare a operațiunilor. GLUT Ca regulă. toate sursele OpenGL au în header 2 hidrați. #include #include Când se utilizează GLUT este de asemenea specificat. Biblioteca GLUT are o interfață cu sistemul de operare la nivelul API. GLUT este recomandat în stadiul inițial al studiului OpenGL. Gestionarea ferestrelor. · GlutInit (int * argc, char ** argv) - prima comandă de inițializare · glutInitDisplayMode (modul unsigned int) - setează modelul de culoare - RGBA sau culoare index. De exemplu. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) - setează bufferul dublu. model color RGB. · GlutInitWindowPosition (int x, int y) - să stabilească originea ferestrei · glutInitWindowSize (latime int, int size) - dimensiunea ferestrei · int glutCreateWindow (char * string) - creează o fereastră - glutDisplayFunc () - numit de fiecare dată când o fereastră este redesenat. - glutMainLoop (void) - această funcție este numită după toate celelalte. Un exemplu mic. #include
#include

void display (void)
<
/ * ștergeți * /
glClear (GL_COLOR_BUFFER_BIT);

/ * trage un dreptunghi alb
* (0,25, 0,25, 0,0) și (0,75, 0,75, 0,0)
* /
glColor3f (1,0, 1,0, 1,0);
glBegin (GL_POLYGON);
glVertex3f (0,25, 0,25, 0,0);
glVertex3f (0,75, 0,25, 0,0);
glVertex3f (0,75, 0,75, 0,0);
glVertex3f (0,25, 0,75, 0,0);
glEnd ();

void init (void)
<
/ * setarea fundalului negru * /
glClearColor (0.0, 0.0, 0.0, 0.0);

/ * inițializarea valorilor de vizualizare * /
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (0,0, 1,0, 0,0, 1,0, -1,0, 1,0);
>

/ *
Definiți parametrii ferestrei. modul de afișare
* (tampon unic și RGBA). Deschide fereastra cu fraza "salut"
* în bara de titlu.
* /
int principal (int argc, char ** argv)
<
glutInit (argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPoziție (100, 100);
glutCreateWindow ("salut");
init ();
glutDisplayFunc (afișare);
glutMainLoop ();
retur 0; / * ISO C necesită principal pentru a întoarce int. * /
>

GLUT are un desen încorporat de obiecte tridimensionale. cone icosahedron teapot Cube octaedron tetraedru Dodecahedron sphere torus Exemplul de mai jos arată cum funcționează comanda glutSwapBuffers (). efectuarea unui swap de buffer. Există 2 tampoane. și până când unul dintre ele este afișat complet pe ecran. al doilea rămâne complet în spatele scenei. și nu va exista suprapunere a unuia pe altul. Program dublu-tamponat: double.c #include
#include
#include
#include

staticul GLfloat spin = 0,0;

void init (void)
<
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
>

void display (void)
<
glClear (GL_COLOR_BUFFER_BIT);
glPushMatrix ();
glotat (spin, 0,0, 0,0, 1,0);
glColor3f (1,0, 1,0, 1,0);
glRectf (-25,0, -25,0, 25,0, 25,0);
glPopMatrix ();
glutSwapBuffers ();
>

void spinDisplay (void)
<
spin = rotire + 2,0;
dacă (spin> 360.0)
spin = rotire - 360,0;
glutPostRedisplay ();
>

void reshape (int w, int h)
<
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (-50,0, 50,0, -50,0, 50,0, -1,0, 1,0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
>

void mouse (buton int, stare int, int x, int y)
<
comutator (buton) <
cazul GLUT_LEFT_BUTTON:
dacă (state == GLUT_DOWN)
glutIdleFunc (spinDisplay);
pauză;
cazul GLUT_MIDDLE_BUTTON:
dacă (state == GLUT_DOWN)
glutIdleFunc (NULL);
pauză;
default:
pauză;
>
>

/ *
* modul de afișare tampon dublu.
* Înregistrați funcțiile de redirecționare a intrărilor mouse-ului
* /
int principal (int argc, char ** argv)
<
glutInit (argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPoziție (100, 100);
glutCreateWindow (argv [0]);
init ();
glutDisplayFunc (afișare);
glutReshapeFunc (remodelarea);
glutMouseFunc (mouse);
glutMainLoop ();
retur 0;
>

Articole similare