OpenGL | |
---|---|
Tip de | API |
Dezvoltator | Silicon Graphics , apoi Khronos Group |
Scris in | C și OpenGL Shading Language |
Sistem de operare | Software multiplatformă |
Prima editie | 1 iulie 1992 [1] |
ultima versiune | 4.6 ( 31 iulie 2017 ) |
Stat | vezi Vulcan |
Licență | EULA, ACORP |
Site-ul web | opengl.org |
Fișiere media la Wikimedia Commons |
OpenGL ( Open Graphics Library ) este o specificație care definește o interfață de programare independentă de platformă (independentă de limbajul de programare ) pentru scrierea aplicațiilor care utilizează grafică computerizată bidimensională și tridimensională . Dezvoltat în SUA și Europa, licențiat sub tipul GNU-/EU/.
Include peste 300 de funcții pentru desenarea scenelor 3D complexe din primitive simple. Folosit în crearea de jocuri pe calculator , CAD , realitate virtuală , vizualizare în cercetarea științifică. Pe platforma Windows , concurează cu Direct3D .
La un nivel de bază, OpenGL este doar o specificație , adică un document care descrie un set de caracteristici și comportamentul lor exact. Pe baza acestei specificații, producătorii de hardware creează implementări - biblioteci de funcții care corespund setului de funcții din specificație. Implementarea este concepută pentru a utiliza eficient capacitățile hardware-ului. Dacă hardware-ul nu permite o caracteristică, aceasta trebuie să fie emulată în software. Producătorii de hardware trec printr-o serie de teste specifice (teste de conformitate) înainte ca o implementare să fie clasificată ca implementare OpenGL. Deoarece este suficient ca dezvoltatorii de software să învețe cum să folosească funcțiile descrise în specificație, implementarea lor este lăsată în seama dezvoltatorilor de hardware.
Există implementări eficiente ale OpenGL pentru platformele Windows , Unix și Mac OS . Aceste implementări sunt de obicei furnizate de producătorii de plăci video și folosesc pe scară largă capacitățile acestora din urmă. Există, de asemenea, implementări open source ale specificației OpenGL, dintre care una este biblioteca Mesa . Din motive de licențiere, Mesa este o implementare „neoficială” a OpenGL, deși este pe deplin compatibilă la nivel de cod și acceptă atât emularea software, cât și accelerarea hardware cu driverele adecvate.
Specificația OpenGL este revizuită de consorțiul ARB (Architecture Review Board), care a fost format în 1992. Consorțiul este format din companii interesate să construiască un API larg acceptat și accesibil . Potrivit site-ului web oficial OpenGL, membrii ARB cu vot cu vot din noiembrie 2004 sunt producători profesioniști de hardware grafică SGI , 3Dlabs , Matrox și Evans & Sutherland (aplicații militare), producători de hardware grafică de consum ATI și NVIDIA , producător de procesoare Intel și computere. producători și hardware de computer de la IBM , Apple , Dell , Hewlett-Packard și Sun Microsystems , precum și unul dintre liderii din industria jocurilor pe computer, id Software . Microsoft , unul dintre membrii fondatori ai consorțiului, a plecat în martie 2003. Pe lângă membrii permanenți, un număr mare de alte companii sunt invitate în fiecare an să devină parte a OpenGL ARB în decurs de un an. Un număr atât de mare de companii implicate într-o gamă diversă de interese a permis OpenGL să devină o interfață de aplicație de uz general, cu o mulțime de caracteristici.
Kurt Akeley și Mark Segal sunt autorii specificației originale OpenGL. Chris Frazier a editat versiunea 1.1. Jon Leech a editat versiunile 1.2 până la 2.0.
OpenGL se concentrează pe următoarele două sarcini:
Principiul de bază al OpenGL este obținerea de seturi de primitive grafice vectoriale sub formă de puncte, linii și triunghiuri, urmate de prelucrarea matematică a datelor primite și construirea unei imagini bitmap pe ecran și/sau în memorie. Transformările vectoriale și rasterizarea sunt efectuate de conducta grafică, care este în esență un automat discret . Marea majoritate a comenzilor OpenGL se încadrează în unul dintre cele două grupuri: fie adaugă primitive grafice ca intrare în conductă, fie configurează conducta pentru a efectua diferite transformări.
OpenGL este un API procedural de nivel scăzut care forțează programatorul să dicteze secvența exactă de pași pentru a construi grafica bitmap rezultată (abordarea imperativă). Aceasta este principala diferență față de abordările cu descriptori, când întreaga scenă este transmisă ca o structură de date (cel mai adesea un arbore), care este procesată și construită pe ecran. Pe de o parte, abordarea imperativă cere programatorului să aibă o cunoaștere profundă a legilor graficii tridimensionale și ale modelelor matematice, pe de altă parte, îi oferă libertatea de a introduce diverse inovații.
Standardul OpenGL, odată cu apariția noilor tehnologii, permite furnizorilor individuali să adauge funcționalități bibliotecii prin mecanismul de extensie . Extensiile sunt distribuite folosind două componente: un fișier antet care conține prototipuri de funcții și constante noi și un driver de dispozitiv furnizat de dezvoltator. Fiecare producător are o abreviere care este utilizată atunci când își denumește noile funcții și constante. De exemplu, NVIDIA are abrevierea NV , care este folosită atunci când se numesc noile caracteristici, cum ar fi , glCombinerParameterfvNV()precum și constantele, GL_NORMAL_MAP_NV. Se poate întâmpla ca o anumită extensie să poată fi implementată de mai mulți producători. În acest caz, se folosește abrevierea EXT , de exemplu, glDeleteRenderbuffersEXT. Când o extensie este aprobată de consorțiul ARB , aceasta dobândește abrevierea ARB și devine o extensie standard. De obicei, extensiile aprobate de consorțiu sunt incluse în una dintre următoarele specificații OpenGL.
Lista extensiilor înregistrate poate fi găsită în baza de date oficială a extensiilor [2] .
Există o serie de biblioteci construite pe deasupra sau pe lângă OpenGL. De exemplu, biblioteca GLU , care este aproape o completare standard la OpenGL și o însoțește întotdeauna, este construită peste acesta din urmă, adică își folosește funcțiile pentru a-și implementa capacitățile. Alte biblioteci, cum ar fi GLUT și SDL , sunt concepute pentru a implementa caracteristici care nu sunt disponibile în OpenGL. Aceste caracteristici includ crearea unei interfețe cu utilizatorul (ferestre, butoane, meniuri etc.), configurarea unui context de desen (zona de desen utilizată de OpenGL), gestionarea mesajelor de la dispozitivele I/O (tastatură, mouse etc.) și lucrul cu fisiere.. De obicei, fiecare manager de ferestre are propria bibliotecă de extensii pentru a implementa caracteristicile de mai sus, cum ar fi WGL pe Windows sau GLX pe X Window System , dar bibliotecile GLUT și SDL sunt multi-platformă, ceea ce facilitează portarea aplicațiilor scrise către alte platforme.
Bibliotecile GLEW (Biblioteca OpenGL Extension Wrangler) și GLEE (Biblioteca OpenGL Easy Extension) sunt concepute pentru a facilita lucrul cu extensii și versiuni diferite ale OpenGL. Acest lucru este valabil mai ales pentru programatorii Windows, deoarece antetul și fișierele de bibliotecă livrate cu Visual Studio sunt la nivelul versiunii OpenGL 1.1.
OpenGL are doar un set de primitive geometrice (puncte, linii, poligoane) din care sunt create toate obiectele tridimensionale. Uneori, acest nivel de detaliu nu este întotdeauna convenabil atunci când creați scene. Prin urmare, biblioteci de nivel superior, cum ar fi Open Inventor și VTK , au fost construite pe OpenGL . Aceste biblioteci vă permit să operați cu obiecte 3D mai complexe, ceea ce face mai ușor și mai rapid crearea unei scene 3D.
GLM (OpenGL Mathematics) este o bibliotecă de utilitate care oferă programatorilor C++ clase și funcții pentru a efectua operații matematice. Biblioteca poate fi folosită atunci când se creează programe 3D folosind OpenGL [3] . Una dintre caracteristicile GLM este că implementarea se bazează pe specificația GLSL . Codul sursă GLM utilizează licența MIT .
Pentru a confirma independența limbajului de programare, diferite opțiuni pentru legarea (legarea) funcțiilor OpenGL au fost dezvoltate sau portate complet în alte limbaje. Un exemplu este biblioteca Java 3D , care poate folosi accelerarea hardware OpenGL. Legarea directă a funcției este implementată în Biblioteca de jocuri Java Lightweight [4] , care are legătură directă OpenGL pentru Java . Sun a lansat, de asemenea, o versiune de Java OpenGL (JOGL) care oferă legare directă la funcțiile OpenGL C , spre deosebire de Java 3D, care nu are un astfel de suport la nivel scăzut. Site-ul oficial OpenGL are link-uri către legături pentru Java, Fortran 90 , Perl , Pike , Python , Ada , Visual Basic și Pascal [5] . Există, de asemenea, opțiuni de legare OpenGL pentru C++ și C# [6] .
Grafica pe computer și-a găsit o largă distribuție și aplicare în viața de zi cu zi. Oamenii de știință folosesc grafica pe computer pentru a analiza rezultatele simulării. Inginerii și arhitecții folosesc grafica 3D pentru a crea modele virtuale . Realizatorii de film creează efecte speciale sau filme complet animate (" Shrek ", " Toy Story " etc.). În ultimii ani, jocurile pe calculator s-au răspândit și ele, profitând la maximum de grafica tridimensională pentru a crea lumi virtuale.
Răspândirea graficii pe computer a venit cu propriul set de dificultăți. În anii 1990, dezvoltarea unui produs software care să poată rula pe o mare varietate de hardware grafic a fost un efort care consuma mult timp și costuri. A fost necesar să se creeze module separat pentru fiecare tip de adaptoare grafice , ceea ce a dus uneori la duplicarea aceluiași cod de program. Acest lucru a împiedicat foarte mult dezvoltarea și răspândirea graficii pe computer.
Silicon Graphics (SGI) specializată în crearea de hardware și software grafic de înaltă tehnologie. Ca lider în grafica 3D la acea vreme, SGI a văzut probleme și bariere în creșterea pieței. Prin urmare, s-a decis standardizarea metodei de acces la hardware-ul grafic la nivelul interfeței programului .
Astfel, a luat naștere interfața de programare OpenGL, care standardizează accesul la hardware-ul grafic, transferând responsabilitatea creării unui driver hardware către producătorul dispozitivului grafic. Acest lucru a permis dezvoltatorilor de software să utilizeze un nivel mai ridicat de abstractizare din hardware-ul grafic, ceea ce a accelerat foarte mult crearea de noi produse software și a redus costurile acestora.
În 1992, SGI a condus OpenGL ARB , un grup de companii care dezvolta specificația OpenGL. OpenGL este derivat din interfața 3D a SGI, IRIS GL . Una dintre limitările IRIS GL a fost că permitea doar funcții acceptate de hardware; dacă capacitatea nu a fost implementată în hardware, aplicația nu ar putea să o folosească. OpenGL depășește această problemă prin implementarea unor caracteristici în software care nu sunt disponibile în hardware, permițând aplicațiilor să utilizeze această interfață pe sisteme cu putere relativ scăzută.
În 1995, a fost lansată biblioteca Microsoft Direct3D . În scurt timp, Microsoft, SGI și Hewlett-Packard au început un proiect numit Fahrenheit, care urmărea să creeze o interfață de programare mai generală bazată pe Direct3D și OpenGL. Ideea părea suficient de promițătoare pentru a aduce ordine în domeniul graficii 3D interactive, totuși, ca urmare a dificultăților financiare la SGI și a lipsei suportului industrial adecvat, proiectul a fost abandonat.
În septembrie 2001, 3DLabs și-a dezvăluit viziunea pentru OpenGL 2.0.
Versiunea OpenGL 2.0 a fost introdusă de 3Dlabs ca răspuns la preocupările legate de direcția lentă și neclară a dezvoltării OpenGL. 3Dlabs a propus o serie de completări semnificative la standard, dintre care cea mai semnificativă a fost adăugarea limbajului shader GLSL (OpenGL Shading Language) la nucleul OpenGL. Acest lucru permite programatorului să înlocuiască conducta fixă OpenGL cu programe mici într-un limbaj special pentru a crea diverse efecte, cum ar fi maparea cu bump , maparea normală , maparea paralaxă , HDR etc.
Cu toate acestea, chiar înainte de introducerea limbajului GLSL în standardul OpenGL, a fost posibil să se dezvolte efecte speciale în limbaje de asamblare (extensiile vertex_program, fragment_program) și Cg (NVidia C for Graphics). Multe caracteristici propuse nu sunt încă disponibile în OpenGL 2.0, deși unele dintre ele au fost implementate ca extensii de mulți furnizori.
OpenGL 2.1Lansat pe 2 iulie 2006.
S-a adăugat suport pentru GLSL versiunea 1.2
Extensii noi:
Pe 11 august 2008, grupul Khronos a lansat o nouă versiune a specificației OpenGL [7] .
Plăci video acceptate: seria Radeon HD; Seria GeForce 8, 9, GTX 100, GTX 200, GTX 300 și GTX 400.
OpenGL 3.1Pe 24 martie 2009, Khronos Group a anunțat OpenGL 3.1. Noua versiune a curățat componentele care au fost declarate învechite, dar au rămas în OpenGL 3.0 pentru a ușura tranziția la noua versiune a API (componentele învechite pot fi utilizate în viitor prin extensia GL_ARB_compatibility).
OpenGL 3.2Pe 3 august 2009, Khronos Group a anunțat OpenGL 3.2. Noua versiune continuă dezvoltarea standardului OpenGL pentru a oferi dezvoltatorilor de grafică acces la funcționalitatea GPU avansată.
Plăci video acceptate: seria Radeon HD; Seria GeForce 8000, 9000, GTX 200 și 400.
Inovații:
Introdus cu OpenGL 4.0 pe 11 martie 2010. Vă permite să vă apropiați cât mai mult de funcționalitatea OpenGL 4.0 pe hardware-ul generației anterioare.
Pe 11 martie 2010, Khronos Group a trimis versiunea finală a specificației OpenGL 4.0 și limbajul shader GLSL 4.0. OpenGL 4.0 este complet compatibil cu extensiile OpenGL mai vechi, folosind modul de compatibilitate introdus în OpenGL 3.2 [8] .
Printre inovații [9] :
Pe 26 iulie 2010, Khronos Group a anunțat specificația OpenGL 4.1. Specificația include o actualizare la GLSL (GL Shading language) la versiunea 4.10.
Inovații:
Extensii noi:
Pe 8 august 2011, Khronos Group a publicat specificația pentru OpenGL 4.2 și limbajul shader GLSL 4.2 [10] .
Inovații:
Pe 6 august 2012, Khronos Group a publicat specificația OpenGL 4.3 [11] [12] la SIGGRAPH 2012 . Pe lângă noile funcții, OpenGL 4.3 oferă suport pentru un nou tip de shader prin extensia GL_ARB_compute_shader. Noua versiune este compatibilă cu cele anterioare.
OpenGL 4.4Plăci video acceptate: seriale AMD/ATi Radeon HD 5000/6000/7000/8000 și 200, seria Nvidia GeForce 400/500/600/700/980.
Pe 22 iulie 2013, grupul Khronos de la SIGGRAPH din Anaheim, California, a publicat specificația OpenGL 4.4 [13] .
OpenGL 4.5Plăci grafice acceptate: AMD/ATi Radeon bazat pe arhitectura GCN, seria Nvidia GeForce 400/500/600/700/800/900.
Pe 11 august 2014, grupul Khronos de la SIGGRAPH din Vancouver, Canada a publicat specificația OpenGL 4.5 [14] .
OpenGL 4.6La 31 iulie 2017, grupul Khronos a publicat specificațiile OpenGL 4.6. Principala inovație este o reprezentare intermediară portabilă a shaderelor SPIR-V, dezvoltat inițial pentru Vulkan API [15] .
Apple în iunie 2018, la evenimentul WWDC , a depreciat tehnologiile OpenGL și OpenGL ES . [16]
Sistemele de operare Fuchsia și Stadia acceptă nativ doar Vulkan .
17 septembrie 2021 Valve a eliminat suportul pentru OpenGL din popularul joc Dota 2 [17] [18]
Toate jocurile noi din 2016 care utilizează motorul de joc id Tech 6 folosesc Vulkan ca interfață de randare .
Motorul de joc ID Tech 7 acceptă doar specificația Vulkan .
Atypical Games, susținut de Samsung , și-a asumat responsabilitatea de a oferi suport Vulkan motorului lor. În cele din urmă, a devenit clar că implementarea Vulkan va înlocui de fapt OpenGL pe toate platformele, cu excepția Apple [19]
Motorul de joc Unity nu acceptă OpenGL/OpenGL ES pentru pipeline HDR [20]
OpenGL nu acceptă Ray Tracing , un API pentru decodarea video pe GPU , spre deosebire de Vulkan
Mesh Shaders în OpenGL sunt acceptate numai pe nVidia [21]
Anti- aliasing cu AMD FidelityFX Super Resolution (FSR) [22] [23] și Nvidia Deep Learning Super Sampling (DLSS) [24] [25] algoritmii de învățare profundă nu sunt acceptați pentru OpenGL
Vulkan, cunoscut anterior ca glNext, este un nou API care îndeplinește cerințele realităților moderne și elimină principalele dezavantaje ale OpenGL. Oferă o supraîncărcare mai mică și un control mai direct asupra GPU-ului. Khronos Group îl dezvoltă din 2014. Versiunea 1.0 a fost lansată pe 16 februarie 2016 [26] .
grupului Khronos | Standardele|
---|---|
Activ | |
Inactiv |
|