Programare folosind biblioteca opengl. Cunoașterea OpenGL

Te-ai decis să înveți OpenGL, dar știi de unde să începi? Am făcut o selecție de materiale.

Ce este OpenGL

OpenGL (deschis biblioteca grafica) este unul dintre cele mai populare standarde grafice pentru lucrul cu grafica. Programele scrise cu ajutorul lui pot fi transferate pe aproape orice platformă, obținându-se același rezultat. OpenGL vă permite să nu scrieți programe pentru hardware, ci să profitați de dezvoltările existente. OpenGL este dezvoltat de Silicon Graphics, în colaborare cu alți giganți ai tehnologiei.

Din punct de vedere al programării, OpenGL este interfata software Pentru grafică raster, ca acceleratoare grafice. Include aproximativ 150 diverse echipe, cu care programatorul poate defini diverse obiecte și poate randa.

Materiale de studiu

Tutoriale

Cursuri online

  • Lynda - „Curs OpenGL”;
  • Universitatea din Tokyo - „Interactiv grafica pe computer»;
  • Universitatea din San Diego - „Fundamentals of Computer Graphics”.

Cărți

În rusă

1. D. Shreiner - OpenGL Redbook - descărcare;

carte - ghid oficial pentru a învăța OpenGL. Ultimele ediții sunt aproape complet diferite de versiunile originale, autorul le actualizează în funcție de modificările versiunilor. Potrivit sutelor de experți care lucrează cu Open GL, această carte este primul lucru pe care ar trebui să-l învețe oricine dorește să învețe tehnologia.

2. D. Wolf - Open GL 4. Limbajul Shader. Carte de rețete (2015) - descărcare;

Această carte acoperă întregul spectru al tehnicilor de programare GLSL, de la shadere de bază — shadere de vârfuri și fragmente — până la shadere de geometrie, calcul și tesselation. După ce îl citiți, veți putea folosi GPU-ul pentru a rezolva o mare varietate de probleme.

3. D. Ginsburg - OpenGL ES 3.0. Ghidul dezvoltatorului (2014) - cumpără;

În această carte, autorul revizuiește întregul API și limbajul pentru scrierea shader-urilor. Veți găsi, de asemenea, sfaturi despre optimizarea performanței, maximizarea eficienței Funcționează APIși GPU și utilizare deplină OpenGL ES într-o gamă largă de aplicații.

4. V. Porev - Grafică computerizată (2002) - descărcare;

Cartea discută modalități de lucru cu grafica computerizată, probleme comune, sunt date exemple de programe în C++.

În limba engleză

1. P. Shirley - Fundamentals of Computer Graphics (2009) - ;

Cartea este concepută ca o introducere în grafica computerizată nivel de bază. Autorii acoperă bazele matematice ale graficii pe computer cu accent pe modul de aplicare a acestor baze pentru a dezvolta cod eficient.

2. E. Angel - Grafică computerizată interactivă - cumpără;

Această carte este destinată tuturor studenților care studiază informatica și programarea în profunzime. Animație pe computer iar grafica nu este la fel de complicată ca înainte. În urma declarației sale, autorul a scris cartea în limbajul cel mai ușor de înțeles.

OpenGL este activat în acest moment una dintre cele mai populare interfețe de program (API) pentru dezvoltarea de aplicații în domeniul bidimensional și Grafică 3D. Standardul OpenGL a fost dezvoltat și aprobat în 1992 de firme de dezvoltare de software de top și se bazează pe biblioteca IRIS GL dezvoltată de Silicon Graphics.

În acest moment, implementarea OpenGL include mai multe biblioteci (descrierea funcțiilor de bază ale OpenGL, GLU, GLUT, GLAUX și altele), al căror scop va fi descris mai jos.

Trăsăturile caracteristice ale OpenGL care au asigurat răspândirea și dezvoltarea acestui standard grafic sunt:

Stabilitate - completările și modificările la standard sunt implementate în așa fel încât să mențină compatibilitatea cu software-ul dezvoltat anterior.

Fiabilitate și portabilitate - aplicațiile care folosesc OpenGL garantează același rezultat vizual indiferent de tipul de software utilizat sistem de operareși organizarea afișării informațiilor. În plus, aceste aplicații pot rula pe computere personale, stații de lucru și supercomputere.

Ușurință în utilizare - Standardul OpenGL are o structură bine gândită și o interfață intuitivă, care vă permite să creați aplicații eficiente cu mai puține linii de cod decât folosind alte biblioteci grafice la un cost mai mic. Funcțiile necesare pentru a asigura compatibilitatea cu diverse echipamente sunt implementate la nivel de bibliotecă și simplifică foarte mult dezvoltarea aplicațiilor.

Caracteristici de bază OpenGL

    Un set de primitive de bază: puncte, linii, poligoane etc.

    Vizualizați și coordonați transformările

    Îndepărtarea linii invizibileși suprafețe (z-buffer)

    Utilizarea spline pentru a construi linii și suprafețe

    Aplicație de cartografiere a texturii și iluminare

    Adăugarea de efecte speciale: ceață, schimbarea transparenței, amestecarea culorilor, eliminarea aliasing-ului (anti-aliasing).

După cum sa menționat deja, există o implementare OpenGL pentru platforme diferite, pentru care a fost convenabil să se separe funcțiile de bază ale sistemului grafic și funcțiile pentru afișare informatii graficeși interacțiunea cu utilizatorul. Au fost create biblioteci pentru a afișa informații folosind subsistemul ferestre pentru sistemele de operare sisteme Windowsși Unix (WGL și, respectiv, GLX), precum și bibliotecile GLAUX și GLUT, care sunt folosite pentru a crea așa-numitele aplicații de consolă.

Biblioteca GLAUX este inferioară ca popularitate față de biblioteca GLUT scrisă ceva mai târziu, deși oferă aproximativ aceleași capacități. Biblioteca GLU include implementarea unor funcții mai complexe, cum ar fi un set de primitive geometrice populare (cub, bilă, cilindru, disc), funcții pentru construirea de spline, implementarea de operații suplimentare pe matrice etc. Toate sunt implementate prin funcții de bază OpenGL.

Caracteristici de arhitectură și sintaxă

Din punct de vedere arhitectural, sistemul grafic OpenGL este o conductă formată din mai multe etape de procesare a datelor:

    Aproximarea curbelor și suprafețelor

    Procesarea vârfurilor și asamblarea primitivă

    Rasterizarea și procesarea fragmentelor

    Operații pe pixeli

    Pregătirea texturii

    Transferarea datelor în cadru tampon

În general, OpenGL poate fi comparat cu o mașină de stări, a cărei stare este determinată de un set de valori ale variabilelor speciale (numele lor încep de obicei cu caracterele GL_) și valorile normalei curente, culoarea și coordonatele texturii. Toate aceste informații vor fi folosite la introducerea sistemului de coordonate a vârfurilor pentru a construi figura în care este inclusă. Modificările de stare apar folosind comenzi, care sunt emise ca apeluri de funcție.

INIȚIALIZAREA BIBLIOTECEI OpenGL ÎN C++

În primul rând, trebuie să includeți fișierele antet:

#include

#include

#include

· gl.h și glu.h conțin prototipuri ale principalelor funcții OpenGL definite în opengl32.dll și glu32.dll.

· glaux.h conține funcții auxiliare (glaux.dll).

După conectarea fișierelor antet, trebuie să setați formatul pixelilor. În acest scop este utilizată următoarea funcție:

BOOL bSetupPixelFormat(HDC hdc)

PIXELFORMATDESCRIPTOR pfd, *ppfd;

int pixelformat;

ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);

ppfd->nVersion = 1;

ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

ppfd->dwLayerMask = PFD_MAIN_PLANE;

ppfd->iPixelType = PFD_TYPE_RGBA;

ppfd->cColorBits = 16;

ppfd->cDepthBits = 16;

ppfd->cAccumBits = 0;

ppfd->cStencilBits = 0;

if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0)

MessageBox(NULL, „ChoosePixelFormat failed”, „Errore”, MB_OK);

if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)

MessageBox(NULL, „SetPixelFormat failed”, „Error”, MB_OK);

Trebuie spusă structura PIXELFORMATDESCRIPTOR.

cColorBits - adâncimea culorii

cDepthBits - dimensiunea tamponului de adâncime (Z-Buffer)

cStencilBits - dimensiunea tamponului stencil (nu o folosim încă)

iPixelType - format de specificare a culorii. Poate lua valorile PFD_TYPE_RGBA (culoarea este indicată de patru parametri RGBA - roșu, verde, albastru și alfa) și PFD_TYPE_COLORINDEX (culoarea este indicată de un index în paletă).

Funcția ChoosePixelFormat() selectează un format de pixel și returnează mânerul acestuia, iar SetPixelFormat() îl setează în contextul dispozitivului (dc).

După ce formatul pixelului este setat în contextul dispozitivului, trebuie să creați un context de redare (Context de redare) pentru aceasta, următoarele funcții sunt definite în OpenGL:

HGLRC wglCreateContext(HDC hdc);

BOOL wglMakeCurrent(HDC hdc, HGLRC hglrc);

În declarația de clasă de formular, în zona privată, trebuie să adăugați următoarele:

ghRC - indicator către contextul de randare (Context de randare)

ghDC este un mâner de dispozitiv (pentru noi este doar un indicator către o fereastră)

Procedura de extragere va fi responsabilă de tragere.

void __fastcall TForm1::FormCreate(TObject *Sender)

ghDC = GetDC(Handle);

dacă (!bSetupPixelFormat(ghDC))

ghRC = wglCreateContext(ghDC);

wglMakeCurrent(ghDC, ghRC);

glClearColor(0,0, 0,0, 0,0, 0,0);

FormResize(Expeditor);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_DEPTH_TEST);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

float p=(3,3,3,1),

glLightfv(GL_LIGHT0,GL_POSITION,p);

glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);

glViewport(0, 0, Width, Height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrto(-5,5, -5,5, 2,12);

gluLookAt(0,0,5, 0,0,0, 0,1,0);

glMatrixMode(GL_MODELVIEW);

glClearColor() setează culoarea care va umple ecranul la ștergere. Această procedură are 4 parametri, care corespund cu RGBA. În schimb, puteți scrie glClearIndex(0.0) . Această procedură setează indicele de culoare în paletă.

glViewport() setează zona de ieșire - zona în care OpenGL va scoate imaginea.

glMatrixMode() setează modul matricei de transformare a vederii.

glLoadIdentity() înlocuiește matricea de transformare a vederii curente cu una.

glOrtho() setează modul de proiecție ortogonal (dreptunghiular). Aceasta înseamnă că imaginea va fi desenată ca în izometrie. 6 parametri de tip GLdouble (sau pur și simplu dublu): stânga, dreapta, jos, sus, aproape, departe definesc coordonatele planurilor de tăiere stânga, dreapta, jos, sus, aproape și, respectiv, departe, i.e. tot ce este în afara acestor limite nu va fi desenat. De fapt, această procedură stabilește pur și simplu scara axelor de coordonate. Pentru a seta proiecția perspectivei, se folosesc procedurile glFrustum() și gluPerspective().

gluLookAt() setează parametrii camerei: primele trei sunt coordonatele sale, al doilea este vectorul de direcție, al treilea este direcția axei Y.

În OpenGL, totul este pornit și dezactivat (activat și dezactivat) prin procedurile glEnable() și glDisable().

glLightfv() stabilește proprietățile „becurilor”: poziția și direcția luminii.

Odată ce ați terminat de lucrat cu OpenGL, trebuie să eliberați resursele ocupate eliberând contextul apelând wglMakeCurrent cu un parametru nul pentru identificatorul de context OpenGL și distrugând acel context cu wglDeleteContext. În plus, trebuie să scoateți mânerul ghDC. Deoarece lucrul cu OpenGL se termină de obicei când se închide aplicația, codul corespunzător trebuie plasat în FormClose:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

wglMakeCurrent(ghDC,0);

wglDeleteContext(ghRC);

ReleaseDC(Mâner, ghDC);

CONCLUZIE

Pe parcursul stagiului meu din 5 iulie până în 31 iulie 2011 la JSC Transas, Divizia Aviație din departamentul de programare, m-am familiarizat cu activitatea departamentului de programare. M-am familiarizat cu proiectarea și funcționarea simulatoarelor de zbor complexe dezvoltate la JSC Transas. Am aflat despre un sistem de vizualizare a peisajelor și a diferitelor obiecte numit Aurora. Am dobândit abilitățile și abilitățile practice inițiale necesare pentru a dezvolta aplicații și software folosind un limbaj de programare modern de nivel înalt și o bibliotecă grafică.

OpenGL înlocuiește tipurile standard, inclusiv pe cele încorporate. Acest lucru se face pentru portabilitate. codul programului către alte platforme. În principiu, nu este nimic greu de amintit aceste tipuri și semnificațiile lor.

De exemplu, tipul GLint corespunde standardului int:

typedef int Licărire;

similar:

typedef unsigned int GLuint; typedef float GLfloat; typedef dublu GLdouble; typedef void GLvoid;

Aceste tipuri sunt declarate în GL.h. Numele tuturor acestor tipuri încep cu GL. Se recomandă utilizarea acestor tipuri cu funcții OpenGL.

Funcții OpenGL

Multe funcții OpenGL sunt variații între ele, care diferă doar prin tipurile de date și argumentele lor. Desigur, acest lucru nu s-ar fi întâmplat dacă OpenGL ar fi fost creat inițial pentru limbi care acceptau supraîncărcarea funcțiilor, cum ar fi C++.

Pentru a evita confuzia în numele funcțiilor, am introdus câteva convenții (reguli) prin care se construiește numele unei funcții OpenGL.

În primul rând, toate numele funcțiilor OpenGL încep cu prefixul gl. De exemplu,

GlBegin();
glEng();

În al doilea rând, dacă un set de funcții are aceeași semnificație și diferă doar prin numărul și tipurile de parametri, atunci numele acestor funcții este scris sub forma:

GlCommon_part_of_function_name[n],

unde n este numărul de parametri, tipul este tipul de parametri.

De exemplu:

glVertex2d(1 .0 , 0 .5 ) ; // 2d înseamnă: 2 parametri de tip GLdouble glVertex3f(1,0 f, 0,5 f, 0,0 f); // 3f înseamnă: 3 parametri GLfloat glColor3ub(127, 0, 255); // 3ub înseamnă: 3 parametri de tip GLubyte

Tabelul de mai jos arată semnificația abrevierilor pentru tip:

iLicărire
uiGLuint
fGLfloat
dGLdublu
sGLscurt
S.U.AGLuscurt
bGLbyte
ubGLubyte
vmatrice

În diverse documentații OpenGL, pentru a nu enumera toate funcțiile unei familii, se obișnuiește să scrieți numai numele părții comune a tuturor funcțiilor familiei și să puneți un asterisc „*” la sfârșit. De exemplu, funcțiile care specifică coordonatele vârfurilor sunt scrise astfel:

GlVertex*

Mai multe informații despre OpenGL

Comenzile OpenGL sunt interpretate de modelul client/server.

Codul aplicației (clientul) emite comenzi care sunt interpretate și procesate.

OpenGL (server) poate funcționa sau nu pe computer ca client. Un server poate conține mai multe contexte OpenGL. Clientul se poate conecta la oricare dintre aceste contexte.

Sistemul de ferestre alocă un cadru tampon. Acesta determină cât de mult din framebuffer-ul modelului poate fi accesat timp dat pentru OpenGL și notifică OpenGL cum sunt structurate aceste bucăți. Prin urmare, OpenGL nu are comenzi care să configureze framebuffer-ul sau să inițializeze OpenGL.

Biblioteci suplimentare

Pe lângă funcțiile și funcțiile OpenGL oferite de sistemul de operare, biblioteci suplimentare sunt adesea folosite pentru a lucra cu OpenGL.

Bibliotecile nu introduc nicio caracteristică nouă pentru OpenGL în sine. Scopul lor este de a simplifica codul. Bibliotecile elimină necesitatea ca programatorii să scrie funcții utilizate frecvent.

Se recomandă utilizarea bibliotecilor suplimentare cu precauție extremă. Pot apărea probleme la portarea codului pe o altă platformă. Sunt de obicei folosite pentru mici și programe de testare. În proiectele mari, aceste biblioteci sunt abandonate, lăsând preferința pentru OpenGL pur.

Cele mai cunoscute biblioteci:

Biblioteca de utilitare OpenGL (glu)

Biblioteca de utilitate glu oferă funcții care funcționează cu matrici, sisteme de coordonate, curbe și Suprafețele NURBS etc.

Această bibliotecă vine cu aproape toate implementările OpenGL, în special MS Visual C++.

Pentru a-l utiliza, trebuie să includeți fișierul antet glu.h în fișierul sursă:

#include

și includeți biblioteca statică glu32.lib în proiectul dvs. pentru conectare.

Numele funcțiilor din această bibliotecă de utilitare încep cu glu, de exemplu,

GluPerspective();

Biblioteca auxiliară OpenGL (glaux)

Biblioteca auxiliară glaux conține funcții care creează obiecte geometrice tridimensionale simple, cum ar fi sferă, cub, paralelipiped, cilindru, con etc., funcții care încarcă imagini din fișiere, funcții care funcționează cu fereastra de ieșire grafică etc.

Această bibliotecă este utilizată mai rar și funcționalitatea nu este inclusă în MSDN. Fișierele pentru lucrul cu biblioteca sunt, de asemenea, furnizate cu MS Visual C++.

Pentru a-l folosi, trebuie să includeți fișierul antet glaux.h în fișierul sursă:

#include

și includeți biblioteca statică glaux.lib în proiectul dvs. pentru conectare.

Numele funcțiilor din această bibliotecă de utilitare încep cu aux, de exemplu,

AuxSolidCube();

OpenGL Utility Toolkit (GLUT)

Instrument independent de sistemul de operare Windows pentru crearea de programe OpenGL. Oferă o implementare simplă a unei interfețe de fereastră. Această bibliotecă eliberează aplicațiile de pregătirile de inițializare, poate genera obiecte geometrice etc.

Pentru a-l folosi, trebuie să includeți fișierul antet glut.h în fișierul sursă și să includeți biblioteca statică glut32.lib în proiectul dumneavoastră pentru a le lega.

În plus, trebuie să aveți biblioteca de linkuri dinamice glut32.dll.

Pentru a face cunoștință cu OpenGL, trebuie să începeți cu faptul că OpenGL este caietul de sarcini. Aceste. OpenGL definește doar un set de capabilități necesare. Implementarea depinde de platforma specifică.
OpenGL este multiplatformă, independent de limbă Programare API pentru lucrul cu grafica. OpenGL este un API de nivel scăzut, așa că este o idee bună să aveți o anumită înțelegere a graficii în general și o algebră liniară de bază pentru a lucra cu el.

Denumire

Să spunem câteva cuvinte despre denumirea funcțiilor în OpenGL. În primul rând, numele tuturor funcțiilor furnizate direct de OpenGL încep cu prefixul gl. În al doilea rând, funcțiile care specifică un anumit parametru caracterizat printr-un set de numere (de exemplu, o coordonată sau o culoare) au un sufix de forma [număr de parametri + tip de parametri + reprezentare a parametrilor].
  • Număr de parametri - indică numărul de parametri acceptați. Acceptă următoarele valori: 1 , 2 , 3 , 4
  • Tip parametru - indică tipul de parametri acceptați. Sunt posibile următoarele valori: b, s, i, f, d, ub, S.U.A, ui. Aceste. octet (car în C, întreg de 8 biți), scurt (întreg de 16 biți), int (întreg de 32 de biți), float (număr în virgulă mobilă), dublu (număr în virgulă mobilă cu precizie dublă), octet fără semn, scurt fără semn, unsigned int (ultimele trei sunt numere întregi fără semn)
  • Reprezentarea parametrilor - indică în ce formă sunt transmisi parametrii, dacă fiecare număr este individual, atunci nu se scrie nimic dacă parametrii sunt transmisi ca o matrice, atunci se adaugă o literă; v
Exemplu: glVertex3iv specifică coordonatele vârfului, constând din trei numere întregi transmise ca pointer către o matrice.

Grafică

Toate obiecte graficeîn OpenGL sunt o colecție de puncte, linii și poligoane. Există 10 primitive diferite cu care sunt construite toate obiectele. Atât bidimensional, cât și tridimensional. Toate primitivele, la rândul lor, sunt specificate prin puncte - vârfuri.
  • GL_POINTS- fiecare vârf definește un punct
  • GL_LINES- fiecare pereche individuală de vârfuri definește o linie
  • GL_LINE_STRIP- fiecare pereche de vârfuri definește o linie (adică sfârșitul liniei anterioare este începutul următoarei)
  • GL_LINE_LOOP- asemănător celui precedent, cu excepția faptului că ultimul vârf este legat de primul și se obține o figură închisă
  • GL_TRIANGURI- fiecare triplu individual de vârfuri definește un triunghi
  • GL_TRIANGLE_STRIP- fiecare vârf următor definește un triunghi împreună cu cele două precedente (se dovedește panglică din triunghiuri)
  • GL_TRIANGLE_FAN- fiecare triunghi este definit de primul vârf și perechile ulterioare (adică triunghiurile sunt construite în jurul primului vârf, formând ceva similar cu o diafragmă)
  • GL_QUADS- fiecare patru vârfuri formează un patrulater
  • GL_QUAD_STRIP- fiecare următoarea pereche vârfurile formează un patrulater împreună cu o pereche de anterioare
  • GL_POLYGON- definește un poligon cu numărul de unghiuri egal cu numărul de vârfuri date
Pentru a defini o primitivă, utilizați construcția glBegin(tip_primitiv)...glEnd(). Vârfurile sunt specificate glVertex*. Vârfurile sunt setate în sens invers acelor de ceasornic. Coordonatele sunt stabilite din colțul din stânga sus al ferestrei. Culoarea vârfurilor este setată de comandă glColor*. Culoarea este specificată ca RGB sau RGBA. Comanda glColor* acționează asupra tuturor nodurilor care vin după ea până când este întâlnită o altă comandă glColor* sau asupra tuturor nodurilor dacă nu există alte comenzi glColor*.
Iată codul care desenează un pătrat cu vârfuri colorate diferite:
  1. glÎncepe (GL_QUADS) ;
  2. glVertex2i(250, 450);
  3. glVertex2i(250, 150);
  4. glVertex2i(550, 150);
  5. glVertex2i(550, 450);
  6. glEnd() ;

Bazele programului OpenGL

Pentru lucrul independent de platformă cu Windows, puteți utiliza . GLUT facilitează lucrul cu OpenGL.
Pentru a inițializa GLUT la începutul programului, trebuie să apelați glutInit(&argc, argv). Pentru a seta modul de afișare, sunați glutInitDisplayMode(mod), unde modul poate lua următoarele valori:
  • GLUT_RGBA- include culoarea cu patru componente (implicit)
  • GLUT_RGB- la fel ca GLUT_RGBA
  • GLUT_INDEX- include culoarea indexată
  • GLUT_DOUBLE- activează tamponul cu ecran dublu
  • GLUT_SINGLE- activează tamponul pentru un singur ecran (implicit)
  • GLUT_DEPTH- activează Z-buffer (buffer de adâncime)
  • GLUT_STENCIL- include tampon pentru stencil
  • GLUT_ACCUM- permite acumularea tampon
  • GLUT_ALPHA- permite amestecarea alfa (transparență)
  • GLUT_MULTISAMPLE- permite eșantionarea multiplă (anti-aliasing)
  • GLUT_STEREO- include imagine stereo
Pentru a selecta mai multe moduri în același timp, utilizați biți SAU „|”. De exemplu: glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH) activează tamponarea dublă, tamponul Z și culoarea quad. Dimensiunile ferestrelor sunt setate glutInitWindowSize(lățime, înălțime). Poziția lui este glutInitWindowPosition(x, y). O fereastră este creată de funcție glutCreateWindow(window_title).
GLUT implementează un mecanism bazat pe evenimente. Aceste. Există o buclă principală care începe după inițializare și toate evenimentele declarate sunt deja procesate în ea. De exemplu, apăsarea unei taste de pe tastatură sau mutarea cursorului mouse-ului etc. Puteți înregistra funcții de gestionare a evenimentelor folosind următoarele comenzi:
  • void glutDisplayFunc (void (*func) (void))- stabilește funcția de desenare a unei imagini
  • void glutReshapeFunc (void (*func) (int lățime, int înălțime))- setează funcția de procesare a redimensionării ferestrei
  • void glutVisibilityFunc (void (*func)(int state))- setează funcția de procesare a modificărilor în starea de vizibilitate a ferestrei
  • void glutKeyboardFunc (void (*func)(cheie caracter nesemnată, int x, int y))- setează funcția de procesare a tastelor de la tastatură (doar cele care generează caractere ascii)
  • void glutSpecialFunc (void (*func)(tasta int, int x, int y))- setează funcția de procesare a apăsărilor de taste de la tastatură (cele care nu generează caractere ascii)
  • void glutIdleFunc (void (*func) (void))- specifică o funcție numită atunci când nu există alte evenimente
  • void glutMouseFunc (void (*func) (buton int, stare int, int x, int y))- definește o funcție care procesează comenzile mouse-ului
  • void glutMotionFunc (void (*func)(int x, int y))- definește o funcție care procesează mișcarea cursorului mouse-ului atunci când orice buton al mouse-ului este apăsat
  • void glutPassiveMotionFunc (void (*func)(int x, int y))- definește o funcție care procesează mișcarea cursorului mouse-ului atunci când nu este apăsat niciun buton al mouse-ului
  • void glutEntryFunc (void (*func)(int state))- definește o funcție care gestionează mișcarea cursorului în afara ferestrei și întoarcerea acestuia
  • void glutTimerFunc (unsigned int msecs, void (*func)(int value), value)- specifică o funcție apelată pe un cronometru
Apoi puteți începe bucla principală glutMainLoop().

Primul program

Acum cunoaștem elementele de bază ale lucrului cu OpenGL. Poți scrie un program simplu pentru a consolida cunoștințele.
Să începem prin a include fișierul antet GLUT:

Acum știm deja ce să scriem în principal. Să înregistrăm doi handlere: pentru desenarea conținutului ferestrei și pentru procesarea redimensionării. Acești doi handlere sunt utilizate în esență în orice program care utilizează OpenGL și GLUT.
  1. int main (int argc, char * argv)
  2. glutInit(& argc, argv);
  3. glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGBA) ; /*Activează tamponarea dublă și culoarea cu patru componente*/
  4. glutInitWindowSize(800, 600);
  5. glutCreateWindow("Lecția 1 OpenGL" );
  6. glutReshapeFunc(reshape) ;
  7. glutDisplayFunc(display) ;
  8. glutMainLoop() ;
  9. returnează 0;

Acum trebuie să scriem o funcție de gestionare pentru redimensionarea ferestrei. Să setăm zona de ieșire a imaginii să fie de dimensiunea întregii ferestre folosind comanda glViewport(x, y, lățime, înălțime). Apoi încărcați matricea de proiecție glMatrixMode(GL_PROJECTION), înlocuiți-l cu unitatea glLoadIdentity()și setați proiecția ortografică. Și, în sfârșit, încărcați matricea model-view glMatrixMode(GL_MODELVIEW)și înlocuiți-l cu unul unitar.
Ca rezultat obținem:
  1. void remodelare (int w, int h)
  2. glViewport(0, 0, w, h);
  3. glMatrixMode(GL_PROJECTION) ;
  4. glLoadIdentity() ;
  5. gluOrtho2D(0, w, 0, h);
  6. glMatrixMode(GL_MODELVIEW) ;
  7. glLoadIdentity() ;

Tot ce rămâne este să scrieți o funcție pentru desenarea conținutului ferestrei. Vom desena pătratul pe care l-am dat mai sus ca exemplu. Va trebui să adăugați foarte puțin cod. În primul rând, înainte de a desena, trebuie să ștergeți diferitele tampoane folosind glClear (mod). Folosit în același mod ca glutInitDisplayMode. Valori posibile:
  • GL_COLOR_BUFFER_BIT- pentru a goli tamponul de culoare
  • GL_DEPTH_BUFFER_BIT- pentru a curăța tamponul de adâncime
  • GL_ACCUM_BUFFER_BIT- pentru a goli tamponul de acumulare
  • GL_STENCIL_BUFFER_BIT- pentru curățarea tamponului ecranului
În cazul nostru, trebuie doar să ștergem tamponul de culoare, deoarece Nu folosim altele. În al doilea rând, după desen, trebuie să-i cereți OpenGL să schimbe tampoanele de ecran folosind glutSwapBuffers(), deoarece avem dublu buffering activat. Totul este desenat pe un buffer ascuns utilizatorului și apoi tampoanele sunt modificate. Acest lucru se face pentru a obține o animație lină și pentru a evita efectul pâlpâie ecran.
Primim:
  1. void display()
  2. glClear(GL_COLOR_BUFFER_BIT) ;
  3. glBegin(GL_QUADS) ;
  4. glColor3f(1,0, 1,0, 1,0);
  5. glVertex2i(250, 450);
  6. glColor3f(0,0, 0,0, 1,0);
  7. glVertex2i(250, 150);
  8. glColor3f(0,0, 1,0, 0,0);
  9. glVertex2i(550, 150);
  10. glColor3f(1,0, 0,0, 0,0);
  11. glVertex2i(550, 450);
  12. glEnd() ;
  13. glutSwapBuffers() ;

Concluzie

Toate! Poate fi compilat. Ar trebui să arate cam așa:

Citiți primul meu tutorial OpenGL!

Înainte de a începe să învățați OpenGL în sine, mi se pare că este mai bine să vă spun cum să compilați codul, să-l rulați și, cel mai important, cum să experimentați cu codurile sursă prezentate în aceste lecții.

Ce trebuie să știți

Aceste lecții se adresează cititorilor fără cunoștințe speciale de programare. Desigur, cunoștințele oricărui limbaj de programare (C, Java, Lisp, JavaSript) vor fi un plus uriaș, dar acest lucru nu este necesar, trebuie doar să studiezi două materii în același timp - grafică 3D și programare.

Tot codul din aceste lecții este scris în C++ în cel mai simplu stil posibil. Fără șabloane, clase sau aritmetică pointer. Prin urmare, privind codul, puteți înțelege ce face acesta, chiar dacă sunteți doar familiarizat cu JavaSript.

Uitați tot ce știați despre OpenGL 1/2

Aceste lecții presupun că nu știi nimic despre grafica 3D. Dar dacă ați citit tutoriale OpenGL și ați dat peste ceva de genul glBegin(), atunci uitați. Aici vom studia OpenGL 3 și 4, iar ceea ce ați citit se aplică și pentru OpenGL 1 sau 2. De aceea, vă recomand să uitați tot ce știai înainte, altfel creierul tău va începe să se topească din neconcordanțe.

Construirea proiectului

Codul din aceste lecții poate fi compilat pentru Windows și Linux. Pentru a începe compilarea codului pentru oricare dintre platforme, trebuie să faceți următoarele:

  1. Actualizați driverele pentru placa dvs. video!! te-am avertizat :)
  2. Descărcați compilatorul dacă nu îl aveți deja.
  3. Instalați CMake
  4. Descărcați surse gata făcute lectii.
  5. Generați proiectul folosind CMake
  6. Asamblați proiectul.
  7. Experimentați cu codul pentru a înțelege mai bine ce se întâmplă acolo.

Mai jos am oferit o descriere mai detaliată a proiectelor de asamblare pentru fiecare platformă. Dar, în funcție de versiunea sistemului de operare, capturile de ecran pot diferi ușor de ceea ce va apărea pe ecran, dar, în general, totul ar trebui să fie aproximativ la fel.

Build pentru Windows


Build pentru Linux

Există un număr mare de variante diferite de Linux în lume, așa că nu vreau să dau exemple de asamblare a unui proiect pentru fiecare. Dacă ceva nu funcționează așa cum este descris mai jos, citiți documentația sau căutați pe Internet.

  1. Instala ultimele drivere pe placa ta video. Recomand cu căldură driverele non-open source. Nu sunt incluse în GNU, dar de multe ori funcționează mult mai bine.
  2. Dacă versiunea dvs. Linux nu oferă un program de instalare automat, încercați să citiți ghidul Ubuntu.
  3. Instalați compilatorul cu toate bibliotecile și instrumentele necesare. Iată o listă cu ceea ce aveți nevoie: cmake make g++ libx11-dev libgl1-mesa-dev libglu1-mesa-dev libxrandr-dev libxext-dev. Utilizați sudo apt-get install ***** sau su /yum install *****
  4. Descărcați sursele exemplu și dezarhivați-le într-un folder, de exemplu ~/Projects/OpenGLTutorials/
  • Accesați ~/Projects/OpenGLTutorials/ și introduceți următoarele comenzi:
  • mkdir build
  • CD build
  1. face..
  2. Dacă comenzile anterioare au fost executate cu succes, un makefile va fi creat în folderul build/ introduceți „make all” și după aceasta toate exemplele și dependențele lor vor fi compilate. Dacă nu există erori, atunci gata fișiere executabile

va fi plasat în folderul ~/Projects/OpenGLTutorials/

Îmi place foarte mult să folosesc QtCreator IDE. Acest IDE poate funcționa cu CMake din cutie și oferă o grămadă de alte bunătăți, cum ar fi depanarea, completarea automată etc.

1. Instrucțiuni pentru construirea unui proiect în QtCreator: În QtCreator faceți clic

2. File->Tools->Options->Compile&Execute->CMake

3. Specificați calea către CMake. Acesta va fi cel mai probabil /usr/bin/cmake

4. Fișier->Deschide Proiect și selectează tutoriale/CMakeLists.txt

5. Specificați folderul de compilare, folderul ar trebui să fie de preferință în afara folderului de tutoriale.

6. Opțional, setați –DCMAKE_BUILD_TYPE=Depanare în câmpul de opțiuni. Clic După aceasta, exemplele pot fi rulate din folderul tutoriale/

7. Pentru a rula exemple din QtCreator, selectați Proiecte ->Parametri de execuție ->Director de lucru și selectați directorul în care se află shaders-urile de textura și modelul. Pentru tutorialul 2 va fi ~/opengl -tutorial /tutorial02_red_triangle/

Exemple de rulare

Odată compilat proiectul, aplicațiile pot fi lansate direct din director.
Dacă trebuie să rulați exemple direct din IDE, utilizați instrucțiunile de mai sus pentru a seta corect directorul de lucru.

Cum să iei aceste lecții

Fiecare lecție vine cu cod sursăși date. Toate aceste fișiere pot fi găsite în directorul tutorialXX/ corespunzător.

Dar vă recomand să nu schimbați nimic în aceste fișiere, sunt doar pentru referință. Este mai bine să te joci în playground/playground.cpp și să schimbi ce vrei acolo. Dacă spargeți ceva și nu îl puteți restaura înapoi, puteți returna acest fișier pur și simplu prin copierea lui din orice altă lecție.

Pe măsură ce citiți aceste tutoriale, veți vedea bucăți de cod peste tot. Simțiți-vă liber să le copiați în playground.cpp pentru a le vedea în acțiune - experimentarea este întotdeauna bună. O mai spun, nu doar citi. cod gatași încercați să-l lansați. Nu veți învăța prea multe doar citind codul sursă. Chiar și cu simpla copiere-lipire, veți obține propria găleată de probleme, rezolvându-le pe care le veți câștiga experiența necesară.

Deschizând fereastra

In sfarsit! OpenGL!

Deși, va trebui să mai așteptați puțin. În toate lecțiile, operațiunile 3D vor fi efectuate la un nivel foarte scăzut, așa că nu va exista magie pentru tine. Cu toate acestea, lucrul cu ferestrele și mesajele sistemului este neinteresant și plictisitor, așa că vom lăsa biblioteca GLFW să facă treaba murdară pentru noi. Dacă chiar doriți, puteți utiliza Win32 Api pentru Windows sau X11 API pentru Linux sau puteți folosi altceva, cum ar fi SFML, FreeGLUT, SDL, ... citiți pagina de link.

Bine, să începem deja. Să începem cu faptul că trebuie să conectăm dependențe. Deoarece trebuie să trimitem mesaje către consolă, vom scrie următoarele:

// Conectarea antetelor standard

#include

#include

Apoi conectăm GLEW

// Nu trebuie să uităm că GLEW trebuie conectat înainte gl . h sau glfw . h

#include

Apoi conectăm GLFW. Această bibliotecă va face toată magia de gestionare a ferestrelor.

#include

Nu avem nevoie de această bibliotecă în acest stadiu, dar conține funcții matematice și vom avea nevoie de ea în curând. Nu există magie în GLM și, dacă doriți cu adevărat, puteți utiliza orice altă bibliotecă pentru a lucra cu matrici și vectori. Includem „utilizarea spațiului de nume” pentru a scrie „vec3” și nu „glm::vec3”

#include

folosind namespace glm;

Dacă copiați aceste bucăți de cod în playground.cpp, compilatorul va începe să se plângă că nu este funcții principale(). Deci hai sa adaugam:

int main())(

Ar fi mai bine să inițializați GLFW mai întâi:

// Inițializați GLFW

dacă(!glfwInit())

{

fprintf(stderr, „Inițializarea GLFW a eșuat\n”);

întoarcere -1;

}

Acum să creăm fereastra noastră OpenGL:

glfwOpenWindowHint( GLFW_ FSAA_ PROBE, 4); // 4 xnetezire

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); //S.U.A necesare OpenGL 3.3

glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);

glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // S.U.A Nu necesare vechi OpenGL

// Să deschidem o fereastră și să creăm un context

dacă(!glfwOpenWindow(1024, 768, 0,0,0,0, 32,0, GLFW_WINDOW))

{

fprintf(stderr, „Nu s-a putut deschide fereastra GLFW\n”);