Lucrul cu ajutorul supraabundență OpenGL

După cum știți deja, OpenGL este o bibliotecă multi-platformă care software-ul scris folosind OpenGL pot fi transferate cu ușurință într-un sistem de operare diferit, în timp ce obținerea aceluiași rezultat vizual. Singurul lucru care este rău - este că, pentru un anumit sistem de operare este necesar pentru producerea de configurare a lui OpenGL. Asta este, să presupunem că scrie software-ul OpenGL pentru Windows și doriți să-l mutați în Linux, codul OpenGL ar trebui să fie transportate fără nici o problemă, dar operațiunile cu operațiuni de interfață de management ferestre cu dispozitive I / O nevoie pentru a rescrie deja sub un alt sistem de operare - Linux .

Din fericire, există o bibliotecă specială multi-platformă care vă permite să rezolve problemele descrise mai sus. Iar numele acestei biblioteci - GLUT.

În primul rând, trebuie să învețe cel mai de bază - este crearea unei ferestre în care va fi posibil să se tragă folosind OpenGL. Programul minim care creează o fereastră și ceva atrage constă din următoarele etape:

Setarea parametrilor de ferestre.

Setarea funcțiilor responsabile de desen într-o fereastră, și schimba forma ferestrei.

Astfel, considerăm că toate cele 5 puncte mai în detaliu:

1. inițializarea GLUT se face cu:

void glutInit (int * argcp, char ** argv);

Primul parametru este un pointer la numărul de argumente pe linia de comandă, iar al doilea - pointer la o serie de argumente. De obicei, aceste valori sunt preluate din principalele caracteristici ale programului: int main (int argc, char * argv []).

2. Setați parametrii ferestrei conține mai multe etape. În primul rând, trebuie să specificați dimensiunea ferestrei:

void glutInitWindowSize (latime int, inaltime int);

Prima lățime parametru - lățimea ferestrei în pixeli, a doua înălțime - înălțimea ferestrei în pixeli. De asemenea, rețineți că, dacă omite această comandă, supraincarcarea va seta dimensiunea ferestrei implicit, de obicei 300x300.

Apoi, puteți specifica poziția ferestrei fiind creată în raport cu colțul din stânga sus al ecranului. Acest lucru se face cu:

void glutInitWindowPosition (int x, int y);

Trebuie să setați, de asemenea, modul de fereastra de afișare. Ie setați cum ar fi parametrii de ferestre: culoare modelul utilizat, numărul de tampoane diferite etc. Pentru a face acest lucru, acolo comanda GLUT:

void glutInitDisplayMode (mod unsigned int);

Echipa are un singur parametru, care poate fi reprezentat prin una dintre următoarele constante, sau o combinație a acestor constante folosind OR nivel de bit.

Deschideți fereastra pe tot ecranul. În același timp, scos din titlul ferestrei ecranului, iar restul părților, cu excepția conținutului ferestrei, și anume aplicația devine tot ecranul.

Există o altă caracteristică interesantă, care vă permite să setați cursorul în formă fereastra:

void glutSetCursor (int cursor);

parametru cursorul poate lua una dintre următoarele valori: GLUT_CURSOR_RIGHT_ARROW, GLUT_CURSOR_LEFT_ARROW, GLUT_CURSOR_INFO, GLUT_CURSOR_DESTROY, GLUT_CURSOR_HELP, GLUT_CURSOR_CYCLE, GLUT_CURSOR_SPRAY, GLUT_CURSOR_WAIT, GLUT_CURSOR_TEXT, GLUT_CURSOR_CROSSHAIR, GLUT_CURSOR_UP_DOWN, GLUT_CURSOR_LEFT_RIGHT, GLUT_CURSOR_TOP_SIDE, GLUT_CURSOR_BOTTOM_SIDE, GLUT_CURSOR_LEFT_SIDE, GLUT_CURSOR_RIGHT_SIDE, GLUT_CURSOR_TOP_LEFT_CORNER, GLUT_CURSOR_TOP_RIGHT_CORNER, GLUT_CURSOR_BOTTOM_RIGHT_CORNER, GLUT_CURSOR_BOTTOM_LEFT_CORNER, GLUT_CURSOR_INHERIT , GLUT_CURSOR_NONE, GLUT_CURSOR_FULL_CROSSHAIR.

Există un mod special de GLUT, care vă permite să utilizați modul de joc pentru programul dvs. OpenGL, și anume atunci când aplicația ocupă întregul ecran.

Pentru a face acest lucru, GLUT, există comenzi speciale pentru a controla acest mod.

void glutGameModeString (char const * string);

Această funcție definește parametrii stabiliți prin rezoluția ecranului, adâncimea de culoare și rata de reîmprospătare (în Hz). Formatul parametru de intrare este:

De exemplu: glutGameModeString ( "640x480: 16 @ 72"); - Mijloace pentru a selecta o rezoluție a ecranului de 640 x 480 pixeli, cu o adâncime de culoare de 16 biți și o rată de reîmprospătare de 72 hertzi.

Pentru a merge la modul GAME MODE trebuie să apelați funcția:

Și pentru a ieși din modul de joc modul pe care trebuie să apelați funcția:

Ei bine, pentru a face mai clar aici este un exemplu de utilizare a acestui mod:

Codul sursa completa a programului poate fi luat aici: game_mode.zip

De asemenea, rețineți că puteți apela o funcție glutGameModeString astfel:

Ie fără a specifica rata de reîmprospătare. Aici GLUT se selectează frecvența corespunzătoare.

In acest articol voi discuta despre modul în care interacțiunea a programului OpenGL și GLUT.

Chiar prima în importanță (fără de care nu se poate face în orice program) este funcția de responsabil pentru retrasarea continutul ferestrei:

anula glutDisplayFunc (void (* FUNC) (void));

Această funcție setează funcția în programul dvs., care va fi responsabil pentru redesenarea ferestrei. Acest lucru este de a se asigura că, atunci când sistemul are nevoie pentru a redesena fereastra (de exemplu, atunci când sunt în afara din cutie desfăcută pliată), aceasta va determina funcția corespunzătoare în programul dumneavoastră, care este responsabil pentru retrasarea continutul ferestrei. De asemenea, funcția de redraw fereastra se numește atunci când prima dată când executați aplicația. Observ că, dacă creați o fereastră de GLUT, apoi determină funcția de Redesenați ferestrei este necesară! Pe de altă parte, te poate face ca sistemul să redesenarea fereastra, este necesar, de exemplu, atunci când schimbați starea obiectelor sau a schimba aspectul lor, va trebui să redesena conținutul ferestrei pentru a afișa modificările. Prin urmare, există o funcție GLUT glutPostRedisplay specială (). ceea ce face ca sistemul să redesena fereastra curentă. Dacă doriți brusc pentru a redesena fereastra curentă nu este, deoarece unele altele, sunt oferite următoarele funcții: glutPostWindowRedisplay (int câștig). care redesenează conținutul câștiga fereastra.

void glutReshapeFunc (void (* FUNC) (int latime, inaltime int));

După cum sa menționat deja, această funcție setează o altă funcție în programul dvs., care va fi responsabil pentru redimensionarea ferestrei. Odată ce fereastra sa schimbat dimensiunea, este necesar să se reconstruiască producția de informații grafice este deja într-o fereastră nouă cu celelalte dimensiuni. Pentru a face acest lucru în funcția (de exemplu, o funcție în programul dvs.) a trecut 2 parametri de lățime și înălțime. și anume lățimea și înălțimea ferestrei modificate. De obicei, la începutul funcției, funcția glViewport. cum ar fi: glViewport (0, 0, lățime, înălțime). pentru a reconstrui ieșire imagine este deja într-o cutie cu alte dimensiuni.

O altă mare facilitate care setează funcția în programul dvs., care va fi numit de fiecare dată când sistemul atunci când fereastra devine vizibilă, sau invers pentru a deveni invizibil.

anula glutVisibilityFunc (void (* FUNC) (int stare));

Singurul parametru care este trecut la numit funcția de sistem: de stat. Prin compararea acestui parametru cu constantele și GLUT_NOT_VISIBLE GLUT_VISIBLE poate determina ce sa întâmplat cu fereastra, sau a devenit invizibil sau invers - este vizibil.

anula glutIdleFunc (void (* FUNC) (void));

O funcție care stabilește funcția în programul dvs., care va fi numit de către sistemul de fiecare dată când aplicația este inactiv, și anume Ea nu face nimic. Adesea, această funcție este utilizată pentru animație.

Ei bine, ultima funcție pe care noi considerăm:

anula glutTimerFunc (Millis int nesemnate, void (* FUNC) (int valoare), valoarea int);

Această funcție setează un cronometru. Primul parametru Millis definește timpul în milisecunde, timp în care funcția este numit, care conține ca al doilea parametru. A treia valoare parametru indică identificatorul este un temporizator, adică Temporizatoare pot fi simultan execută mai multe. Aceeași valoare de valoare există în funcția pe care este numit un cronometru. Acest lucru este necesar pentru a determina care este declanșat cronometrul, adică în cazul în care funcția se ocupă de mai multe cronometre.

În continuare, voi da exemplul unui mic program care desenează o linie de rotație. Codul sursă poate fi luată de aici și: animation.zip

Încercați pentru a minimiza fereastra, și apoi în jos și detalia uita-te la consola, ea a lucrat procedura de vizibilitate.

[A apărut o eroare în timpul procesării prezentei directive]

[A apărut o eroare în timpul procesării prezentei directive]