Te-ai decis să înveți OpenGL, dar știi de unde să începi? Am făcut o selecție de materiale.
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.
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.
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.
Î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.
Cartea discută modalități de lucru cu grafica computerizată, probleme comune, sunt date exemple de programe în C++.
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.
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.
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:
i | Licărire |
ui | GLuint |
f | GLfloat |
d | GLdublu |
s | GLscurt |
S.U.A | GLuscurt |
b | GLbyte |
ub | GLubyte |
v | matrice |
Î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*
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.
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 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ă 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();
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ă.
- glÎncepe (GL_QUADS) ;
- glVertex2i(250, 450);
- glVertex2i(250, 150);
- glVertex2i(550, 150);
- glVertex2i(550, 450);
- glEnd() ;
- int main (int argc, char * argv)
- glutInit(& argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE| GLUT_RGBA) ; /*Activează tamponarea dublă și culoarea cu patru componente*/
- glutInitWindowSize(800, 600);
- glutCreateWindow("Lecția 1 OpenGL" );
- glutReshapeFunc(reshape) ;
- glutDisplayFunc(display) ;
- glutMainLoop() ;
- returnează 0;
- void remodelare (int w, int h)
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION) ;
- glLoadIdentity() ;
- gluOrtho2D(0, w, 0, h);
- glMatrixMode(GL_MODELVIEW) ;
- glLoadIdentity() ;
- void display()
- glClear(GL_COLOR_BUFFER_BIT) ;
- glBegin(GL_QUADS) ;
- glColor3f(1,0, 1,0, 1,0);
- glVertex2i(250, 450);
- glColor3f(0,0, 0,0, 1,0);
- glVertex2i(250, 150);
- glColor3f(0,0, 1,0, 0,0);
- glVertex2i(550, 150);
- glColor3f(1,0, 0,0, 0,0);
- glVertex2i(550, 450);
- glEnd() ;
- glutSwapBuffers() ;
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.
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.
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.
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:
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.
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.
va fi plasat în folderul ~/Projects/OpenGLTutorials/
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/
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ă.
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”);