bazele opengl

Am spus deja că aproape întotdeauna în trei jocuri într-un al doilea cadru este construit complet de mai multe ori. Cu alte cuvinte, de fiecare dată când un program este liber de prelucrare a mesajelor de sistem, aveți nevoie pentru a apela o funcție, să-l numim DrawFrame (), care de fiecare dată când va afișa toate obiectele din cadru.

Urmând exemplul nostru de construire a unei cereri, este clar că această funcție ar trebui să fie numit din funcția OnIdle ().


Ce acțiune comună ar trebui să apară funcția DrawFrame ()? În primul rând, trebuie să ștergeți tamponul invizibil (tampon spate), pentru a aduce toate obiectele în tampon și a face tamponul invizibil - vizibil.

Pentru purificare utilizată funcția glClear (). Această funcție șterge mai multe tipuri de tampoane, ne interesează cel care stochează imagini color (tampon de culoare). Prin urmare, funcția glClear va fi numit cu parametrul GL_COLOR_BUFFER_BIT.

DrawFrame Implementare () Funcția (add OpenGL.cpp):

DrawObjects funcția () se lasa pana cand un corp gol, o folosim în exemplele noastre privind încheierea primitivelor grafice.

primitivele grafice

Există mai multe tipuri de primitivilor: puncte, segmente de linii și poligoane.

Funcțiile responsabile pentru retragerea primitivelor, trebuie să specificați ce fel de primitivelor va fi afișat, indicând modul corespunzător. De exemplu, pentru punctele de ieșire GL_POINTS modul este setat, la liniile de ieșire - GL_LINES, și pentru triunghiuri - GL_TRIANGLES. În plus, există moduri speciale, care sunt utilizate pentru comoditate și optimizare. De exemplu, GL_QUADS - afișează patru primitivele vertex, GL_TRIANGLE_STRIP - lanț de ieșire de triunghiuri, care fiecare triunghi succesiv are o muchie comună cu anterioare etc.

Toate entitățile descrise vârfuri.

Datele nod este utilizat pentru a primitivelor de ieșire. Aceste date pot fi coordonate vertex, de culoare nod, normal, și coordonatele de textură ale steaguri linie.

Primitive de ieșire secvență de funcții vertex

Aceasta este cea mai veche metoda de noduri de ieșire implementate în OpenGL.

Primitive specifică funcțiile individuale pentru fiecare nod al funcționale paranteze glBegin () și glEnd ().

Tratamentul adecvat pentru tipul primitiv este setat la glBegin) funcția (. De exemplu:

Aceasta înseamnă că vom aduce triunghiuri, întrebând fiecare dintre ele trei noduri.

Funcții glVertex * - set coordonatele vertex, care la rândul său descriu forma unui obiect geometric. La efectuarea acestei funcții, celelalte date vertex, cum ar fi vectorul normal și culoarea este luată de la valorile stabilite anterior „curente“.

Exemplu. Asking trei (3) tipuri de coordonate GLfloat (f) pentru partea de sus:

Această funcție afișează un poligon simplu - triunghi, fiecare nod este dat glVertex3f (). Încă o dată, rețineți că toate glVertex * declarațiile sunt între glBegin () și glEnd ().

Valorile actuale ale unora dintre datele pentru nodurile se pot seta următoarele funcții:

glColor * - setează culoarea RGBA superioară cu condiții de lumină.

glNormal * - seteaza vectorul normale care corespunde vârfurilor individuale.

glTexCoord * - stabilește coordonatele textura actuală pentru partea de sus.

Valorile actuale pentru partea de sus expuse la glVertex * apel.

Această funcție atrage un triunghi cu două roșii și una blaturi albastru.

Primitive de ieșire folosind matrice

Această metodă trimite o eroare de calcul pachet de date imediat vertex. Adică, parametrii vertex, cum ar fi coordonatele, normalele și culorile nodurile sunt specificate nu separa funcțiile OpenGL pentru fiecare nod, și matricele individuale de coordonate, normalelor și așa mai departe. Aceasta tehnica este de obicei mai rapid și mai convenabil atunci când se lucrează cu obiecte, cu un număr mare de noduri .

OpenGL indicarea matricelor are loc funcțiile individuale, PIN-ul este, de asemenea, are loc o funcție separată.

De exemplu, din nou derivă același triunghi.

Avem o serie de noduri:
Acesta este dispus secvențial pe cele trei coordonate pentru cele trei vârfuri.

Instalarea de matrice a coordonatelor nodurilor are loc funcția glVertexPointer ():

Primul parametru în această funcție spune cât de mult merge coordonate pe vârf, valorile posibile - 2,3,4. Al doilea parametru este responsabil pentru tipul de coordonate. Al treilea parametru este un pas în octeți între date coordonatele pentru fiecare nod. 0 în acest caz înseamnă că coordonatele sunt apropiate unul de altul. A patra opțiune - de fapt, indicatorul la o serie de coordonate.

În plus, am pus un pointer la o matrice, trebuie să setați starea pentru OpenGL, ceea ce înseamnă că vom folosi un pointer la o serie de noduri. Această condiție este setată funcția glEnableClientState ().

De asemenea, puteți pune matrice de indicii pentru alte date vertex. Și nu uitați să includeți starea corespunzătoare. Dacă nu aveți nevoie de un fel de obiect, o parte din setul de matrice, puteți pur și simplu dezactiva prin eliminarea glDisableClientState funcția de stat ().

starea activat rămâne aprins, atâta timp cât îl dezactivați. Asta este, dacă merge în mod constant Afiseaza mai multe obiecte care conțin propria lor, de exemplu, rețelele vertex, doar o stare de comutare a tuturor obiectelor în fața retragerii primului obiect.

Dacă dorim obiectele sunt afișate folosind coordonatele matrice, dar au, de exemplu, o culoare comună pentru toate nodurile, atunci nu este necesar să se construiască o matrice cu aceleași valori de culoare. Utilizați funcția deja cunoscută ai glColor * ().

Să luăm acum în considerare una dintre funcțiile responsabile pentru retragerea primitivului cu matrice expuse.

Afișează în conformitate cu primitivele din matrice.
Mod - tratament adecvat pentru tipul primitiv,
în primul rând - în partea de sus a indicelui, cu care vom aduce un obiect
conta - numărul de noduri.

În cazul nostru - la un triunghi folosind 3 noduri.

Vă rugăm să rețineți că această funcție ar trebui să fie numit o pereche de glBegin () și glEnd ().

primitivele index

Mai târziu, în OpenGL versiunea 1.1 a introdus o metodă alternativă pentru a afișa. Această metodă vă permite să lucrați cu un index care specifică obiecte geometrice pentru ieșire la o eroare de calcul al adaptorului.

Ce înseamnă acest lucru? Aproape toate modelele poligonale au triunghiuri cu noduri comune. Și, de obicei, un astfel de număr mare de noduri. În mod evident, stocheze și să utilizeze copii ale acelorași vârfuri nechibzuit.

Să considerăm un exemplu simplu.

Avem trei triunghiuri vecine cu noduri comune. Pentru primul și al doilea triunghi - nodurile comune 1 și 2, al doilea și al treilea - 2.3. Vertex 2 este comună tuturor triunghiuri.

Dacă nu am folosi metoda de specificare a indicelui obiectului, atunci ar trebui să ceară retragerea acestor triunghiuri 9 noduri Th (trei pentru fiecare triunghi).

Cu toate acestea, puteți fi doar 5 noduri folosind matrici de coordonate sau a altor date vertex, și să se afișeze triunghiuri care indică codurile de locație în matrice de date vertex corespunzătoare.

care este
pentru primii indici de triunghi sunt - 0,1,2
pentru al doilea - 1,3,2
pentru al treilea - 2,3,4

Luați în considerare una dintre funcțiile de a lucra cu indici.

Această funcție este utilizată în cadrul cuplurilor glBegin () și glEnd (). De fapt, cerem noi indici. O matrice cu date despre ei înșiși blaturi instalat anterior.


Acest exemplu afișează trei triunghi colorat.

Cu toate acestea, indicii pot fi de asemenea setat matrice și ieșire un obiect apel unic glBegin () și glEnd ().

Puteți face această funcție:

aici
Modul - ca întotdeauna expune modul de tip poligon,
conta - numărul de indici pentru a lua din matrice,
tip - tipul de elemente în index matrice poate lua valori: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT sau GL_UNSIGNED_INT. De obicei, indicii utilizate scurt nesemnate.
indici - un pointer la o serie de indici. Rețineți că acest indice poate fi interpretat ca un pointer la elementul din care obiectul va fi calcul. Adică, puteți pune cursorul peste orice element din matrice.

Pentru claritate, un nou exemplu:

Exemplu afișează aceleași triunghiuri, deoarece culoarea nu este prezentat, atunci toate triunghiurile sunt albe.