OpenGL

**OpenGL** (**Open** **G**raphics **L**ibrary) on standardne kirjeldus, mis defineerib mitmekeelse, mitmeplatvormilise programmiliidese (API) 2D- ja 3D-arvutigraafikat kuvavate rakenduste loomiseks. See liides koosneb rohkem kui 250 funktsiooni väljakutsest, mida saab kasutada lihtsate geomeetriliste primitiivide muutmisel keerukateks kolmedimensioonilisteks kujutisteks. OpenGL-i töötas 1992. aastal välja Silicon Graphics Inc. ning seda kasutatakse laialdaselt CAD-is, virtuaalreaalsuses, teaduslikus visualiseerimises, lennusimulatsioonides ja videomängudes. OpenGL-i haldab mittetulunduslik tehnoloogiakonsortsium Khronos Group.

## Struktuur

OpenGL-il on kaks peamist otstarvet:
#Erinevate 3D-kiirendite liidestamise keerukuse peitmine, esitledes/tutvustades ühtset liidest.
#Riistvaraplatvormide erineva suutlikkuse peitmine, nõudes kogu riistvaralt OpenGL-i toetamist (vajadusel kasutades tarkvaralist emuleerimist)

OpenGL võtab geomeetrilisi primitiive, nagu punktid, jooned ja hulktahukad, ja muudab nad graafikakonveierit kasutades piksliteks. Enamik OpenGL-i käske saadavad primitiive graafikakonveierisse või konfigureerivad seda protsessi, kuidas konveier primitiive töötleb. Enne OpenGL 2.0-i väljaandmist oli igal konveieri etapil kindel otstarve ja selle konfigureerimine oli jäigalt piiratud. OpenGL 2.0-il seevastu on mitu täielikult programmeeritavat etappi, mida saab modifitseerida GLSL-i kasutades.

OpenGL on madalatasemeline protseduur-API, mis nõuab, et programmeerija kirjutaks ette täpsed kujutise renderdamiseks vajalikud sammud. See vastandub kirjeldava (ehk kujutisgraafi või säilitusrežiimiga) APIga selles, et viimases on programmeerijal vaja kujutist ainult kirjeldada ja saab lasta teegil edasi teostada selle visualiseerimise üksikasju.

OpenGL-i madalatasemeline struktuur nõuab programmeerijalt head graafikakonveieri tundmist, kuid annab ka teatud määral vabadust uudsete visualiseerimisalgoritmide kasutusele võtmiseks.

OpenGL on ajalooliselt olnud mõjutatud 3D-kiirendite arengust, edendades tarbijataseme riistvaras nüüdseks tavalist funktsioonivaliku põhitaset. Mõned näited sellest, mida OpenGL on aidanud arendada:
#rasterdatud punktid, jooned ja hulktahukad lihtsate primitiividena
#muundamise ja valgustuse (*transform and lightning*) konveier
#Z-puhverdamine
#tekstuuri vastendamine
#alfasujutamine

Graafikakonveieris toimuva protsessi lühikirjeldus võiks olla järgmine:
#Esiteks hinnatakse (vajadusel) polünoomseid funktsioone, mis defineerivad teatud sisendeid, milleks võivad olla näiteks NURBS pinnad, kõverate või pinnageomeetria määramine.
#Tehted otspunktidega, nende muundamine ja valgustamine materjalist sõltuvalt; ka kujutise nähtamatute osade kärpimine, et korrigeerida pildi vaateulatust.
#Eelneva info rasteriseerimine või muutmine piksliteks. Hulktahukad on esindatud sobiva värvi poolt, mis on määratud interpoleerimisalgoritmidega.
#Toimingud fragmendi kohta, muuhulgas väärtuste uuendamine olenevalt sissetulevatest ja varem talletatud sügavuse väärtustest või värvikombinatsioonidest.
#Fragmentide sisestamine kaadripuhvrisse.

Paljudel tänapäevastel 3D-kiirenditel on eespool kirjeldatust palju suurem funktsioonivalik, kuid nende uuendused põhinevad pigem siiski antud baaskonveieril, mitte selle radikaalselt ümbertöötatud variantidel.

## Laiendused

OpenGL-i standard lubab üksikutel tootjatel laienduste kaudu lisada tehnoloogia arenedes täiendavaid funktsioone. Laiendustega võivad kaasneda uued funktsioonid ja konstandid ning need võivad juba olemasolevate OpenGL-i funktsioonide piiranguid vähendada või ära kaotada. Igal tootjal on oma tähtedest koosnev lühend, mida kasutatakse tema loodud uute funktsioonide ja konstantide nimetamisel. Näiteks Nvidia lühendit NV kasutatakse nende loodud suletud funktsioonide (`glCombinerParameterfvNV())` ja konstantide (`GL_NORMAL_MAP_NV`) defineerimiseks.

Kui juhtub, et rohkem kui üks tootja nõustub sama laiendatud funktsioonivalikut rakendama, siis kasutatakse lühendit EXT. Võib ka nii juhtuda, et Architecture Review Board ülendab mingit laiendust; sel juhul hakatakse seda kutsuma standardlaienduseks ja kasutatakse lühendit ARB. Esimeseks ARB laienduseks oli `GL_ARB_multitexture`, mis lasti välja versioonis 1.2.1. Nüüdseks pole `GL_ARB_multitexture` enam valikuliselt implementeeritud ARB laiendus, vaid on olnud OpenGL-i programmiliidese põhiosas alates versioonist 1.3.

Enne laienduse kasutamist peab programm kindlaks tegema selle olemasolu ja seejärel kätte saama viidad uutele funktsioonidele, mida laiendus defineerib. See protsess on platvormispetsiifiline ning selle lihtsustamiseks on loodud teegid, näiteks GLEW ja GLEE.

Peaaegu kõikide laienduste spetsifikatsioone võib leida ametlikust laienduste registrist.

## Kõrgema taseme funktsioonivalik

OpenGL oli mõeldud vaid graafika väljastamiseks – tal on ainult renderdusfunktsioonid. API-l ei ole võimalusi akendussüsteemi, heli, ekraanile väljastamise, hiire/klaviatuuri ega teiste sisendseadmete kasutamiseks. Esmapilgul võib see küll piirav tunduda, aga see laseb renderdamisega tegeleval koodil olla operatsioonisüsteemist, kus seda käitatakse, täiesti sõltumatu. Siiski on integratsiooni omaakendussüsteemiga teatud määral vaja, et tagada puhas interaktsioon peremeessüsteemiga. Seda saavutatakse järgmiste API lisade (*add-on*) kaudu:
*GLX – X Windows (kaasa arvatud võrgu läbipaistvus)
*WGL – Microsoft Windows
*CGL – Mac OS X
Lisaks tagavad GLUT, SDL, SFML ja GLFW teegid põhiakenduse funktsionaalsuse OpenGL-i kasutamisel.

Mõned avatud lähtekoodiga mitmeplatvormilised tööriistakomplektid nagu GTK+, Qt ja WxWidgets sisaldavad vidinaid OpenGL-i sisu integreerimiseks.

## Dokumentatsioon

OpenGL-i edu taga on osaliselt tema ametliku dokumentatsiooni kvaliteet ja rohkus. OpenGL ARB on välja andnud kasutusjuhenditest ja programmiliidese muudatustega kooskõlla viidud spetsifikatsioonidest koosneva raamatute sarja, mille raamatuid nimetatakse nende kaanevärvide järgi.

**The Red book** (punane raamat)
::"OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 4.1 (8th Edition)" – kasutusjuhend ja käsiraamat – see on OpenGL programmeerijate tähtsaim raamat.

**The Blue book** (sinine raamat)
::"OpenGL SuperBible: Comprehensive Tutorial and Reference (5th Edition)" – põhimõtteliselt OpenGL man leheküljed raamatu kujul.

**The Green book** (roheline raamat)
::"OpenGL Programming for the X Window System" – praktiline juhend X Windows süsteemide programmeerimiseks.

**The White book** (valge raamat)
::"OpenGL Programming for Windows 95 and Windows NT" – raamat OpenGL-i liidestamisest Microsoft Windowsiga.

**The Orange book** (oranž raamat)
::"OpenGL Shading Language, 3rd edition" – GLSL-i kasutusjuhend ja käsiraamat .

## Ajalugu

1980. aastatel oli küllaltki keeruline kirjutada tarkvara, mis toimiks paljudel erinevatel graafikariistvaradel. Arendajad pidid looma igale riistvarajupile oma kohandatud liidesed ja draiverid, mis oli aga aeganõudev ning majanduslikult kallis.
 
1990. aastate algul oli Silicon Graphics (SGI) juhtiv tööjaamade 3D-graafikas. Tema IRIS GL-i programmiliidest peeti tipptasemeliseks ning temast sai tööstuse *de facto* standard. IRIS GL oli üle avatud standarditel põhinevast PHIGS-ist, sest seda peeti kergemini kasutatavaks ja see toetas kohese režiimiga renderdamist. Sellele vastupidi peeti PHIGS-i raskesti kasutatavaks ja funktsioonivaliku poolest iganenuks.

SGI rivaalid (nagu Sun Microsystems, Hewlett-Packard ja IMB), toetudes PHIGS-i standardile tehtud laiendustele, suutsid samuti 3D-riistvara turule tuua. See omakorda nõrgendas SGI turuosa, kuna üha rohkem 3D-graafika riistvara tarnijaid hakkas turule tulema. Püüdes turgu mõjutada, otsustas SGI muuta IrisGL API avatud standardiks.

SGI hinnangul ei olnud IrisGL API ise avamiseks sobiv, kuna sel oli probleeme litsentseerimise ja patendiga. Lisaks olid IrisGL-il API funktsioonid (näiteks akendamine, klaviatuuri ja hiire API), mis polnud 3D-graafika jaoks vajalikud.

Kõigele lisaks oli SGI-l suur hulk tarkvarakliente, keda nad kavatsesid hoida OpenGL API-ks muutmisega mõned aastad lukustatuna SGI (ja IBM-i) riistvara küljes, vähemalt seni, kuni turutoetus OpenGL-ile kasvas. Samal ajal proovis SGI oma kliente edasi oma riistvara peal hoida Iris Inventor ja Iris Performer programmeerimise API-de arendamisega.

Selle tulemisena andis SGI välja **OpenGL** standardi.

OpenGL standardiseeris ligipääsu riistvarale, lükkas riistvara liidestamisprogrammide draiverite arenduskohustuse riistvaratootjatele ja delegeeris akendamisfunktsioonid alusoperatsioonisüsteemile. Kõigi erinevate riistvara liidestamisprogrammide sel moel sama keelt rääkima saamisel oli märkimisväärne mõju – see andis tarkvara arendajatele kõrgematasemelise platvormi 3D-tarkvara arendamiseks.

1992. aastal juhtis SGI OpenGL ARB loomist, mis on grupp firmasid, mis säilitaksid ja laiendaksid tulevatel aastatel OpenGL spetsifikatsiooni. OpenGL arenes SGI varasemast 3D-liidesest IrisGL-ist (ja on selle stiiliga väga sarnane). Üheks IrisGL-i puuduseks oli, et ta tagas juurdepääsu vaid neile funktsioonidele, mida alusriistvara toetas; teisi funktsioone, mida riistvara ei toetanud, ei saanud kasutada. OpenGL ületas selle probleemi, tagades tarkvaraliselt neid funktsioone, mida riistvara ei toetanud, mis lasi rakendustel kasutada arenenud graafikat suhteliselt madala võimsusega süsteemides.

1994. aastal mõeldi OpenGL++-i väljaandmise peale, kuid seda ideed ei tehtud kunagi teoks.

1995. aastal lasi Microsoft välja Direct3D, millest kujunes OpenGL-i peamine konkurent. 17. detsembril 1997 alustasid Microsoft ja SGI Fahrenheiti projekti, mis oli nende ühine püüe OpenGL-i ja Direct3D liideste ühendamiseks . Hewlett-Packard ühines projektiga 1998. aastal, kuid SGI finantspiirangute ja Microsofti strateegiliste põhjuste ning üldise tööstuse toetuse puudumise tõttu loobuti sellest ideest 1999. aastal..

31. juulil 2006 teatati, et OpenGL spetsifikatsiooni haldamine antakse üle Khronose grupile.

## Versioonid
### OpenGL 1.0

Lasti välja 1. juulil 1992.

#### OpenGL 1.1

Lasti välja 1997.
Versioon 1.1 oli tagasiühilduv versiooni 1.0, mis tähendas, et kõik OpenGL 1.0 spetsifikatsiooni järgi teostatud programmid toimisid muutmata kujul ka 1.1 spetsifikatsiooni järgi. GL-ile lisati palju uusi võimalusi, eriti tekstuuri vastendamiseks, aga ka geomeetria ja fragmentidega töötamiseks.

#### OpenGL 1.2

Lasti välja 16. märtsil 1998.
Versioon 1.2 oli tagasiühilduv versiooniga 1.1. Selle versiooniga lisati GL-ile mitmeid uusi võimalusi, eriti tekstuuri vastendamiseks ja pikslitöötluskonveierile.

#### OpenGL 1.2.1

Lasti välja 14. oktoobril 1998.
Tõi sisse ARB laienduste kontseptsiooni. Ainuke selles versioonis defineeritud ARB laiendus oli multitekstuur, mis võimaldas ühe renderduskorraga fragmendile mitut tekstuuri rakendada.

#### OpenGL 1.3

Lasti välja 14. augustil 2001.
Oli tagasiühilduv kõigi varasemate OpenGL versioonidega. GL-ile lisati mitmeid uusi võimalusi, eriti eelnevalt defineeritud ARB tekstuuri vastendamise laiendusele.

#### OpenGL 1.4

Lasti välja 24. juulil 2002.
Oli tagasiühilduv kõigi varasemate OpenGL versioonidega. Lisaks paljudele klassikalise fikseeritud funktsioonidega GL konveieri lisavõimalustele, sisaldas versioon 1.4 ka OpenGL ARBi poolt heakskiidu saanud `GL_ARB_vertex_program` laiendust, mis toetas programmeeritavat otspunktide (*vertex*) töötlemist.

#### OpenGL 1.5

Lasti välja 29. juulil 2003.
Oli tagasiühilduv kõigi varasemate OpenGL versioonidega. OpenGL 1.5 tõi endaga kaasa lisavõimalusi klassikalise fikseeritud funktsioonidega GL konveierile ja ARB laienduste kogu, mis sisaldas muuhulgas ka varjustamiskeele GLSL (OpenGL Shading Language) spetsifikatsiooni, `GL_ARB_shader_object`, `GL_ARB_vertex_shader` ja `GL_ARB_fragment_shader` laiendusi, mille abil sai fikseeritud funktsioonidega konveieri asemel kasutada kõrgtasemelist varjustamiskeelt.

### OpenGL 2.0

Lasti välja 7. septembril 2004.
Oli tagasiühilduv kõigi varasemate OpenGL versioonidega. OpenGL 2.0 toetas kõrgtasemel programmeeritavaid varjutajaid.

#### OpenGL 2.1

Lasti välja 2. juulil 2006.
Oli tagasiühilduv kõigi varasemate OpenGL versioonidega. OpenGL 2.0 toetas kõrgtasemel programmeeritavaid varjutajaid. Sisaldas eelmise versiooni parandusi ja mõningaid muudatusi.

### OpenGL 3.0

Kasutades versiooni 3.0 *täielikku konteksti*, oli OpenGL 3.0 tagasiühilduv varasemate GL-i versioonidega. OpenGL 3.0 *ettepoole ühilduvat* konteksti kasutades polnud paljud OpenGL 2.1-s olevad võimalused kättesaadavad.

#### OpenGL 3.1

Lasti välja 24. märtsil 2009.
Erinevalt eelmistest versioonidest, pole OpenGL 3.1 tagasiühilduv vanemate variantidega. Versiooni 3.0 käsud ja liidesed, mis leiti olevat ebasoovitatavad, eemaldati sellest GL-i variandist. Ühilduvuse taastamiseks, kui seda vaja läheb, lisati uus laiendus `GL_ARB_compatibility`. See laiendus tohib esineda ainult 3.1 ja sellest uuemates versioonides.

#### OpenGL 3.2

Lasti välja 3. augustil 2009.
OpenGL 3.2 spetsifikatsioonist on kaks versiooni: tuumik- ja ühilduvusprofiil. Tuumikprofiil on tagasiühilduv ainult versiooniga 3.1. Ühilduvusprofiil tagab tagasiühilduvuse kõige vanemate GL-versioonidega ja asendab versioonis 3.1 sisse toodud `GL_ARB_compatibility` laienduse.

#### OpenGL 3.3

Lasti välja 11. märtsil 2010.
OpenGL 3.3 spetsifikatsioonist on kaks versiooni: tuumik- ja ühilduvusprofiil. Mõlemad profiilid on tagasiühilduvad 3.2 versiooni vastavate profiilidega. Tõi GLSL versiooni 3.30 toe ja uusi laiendusi.

### OpenGL 4.0

Lasti välja 11. märtsil 2010.
OpenGL 4.0 spetsifikatsioonist on kaks versiooni: tuumik- ja ühilduvusprofiil. Mõlemad porfiilid on tagasiühilduvad versiooni 3.3 vastavate profiilidega. Tõi GLSL versiooni 4.00 toe ja uusi laiendusi.

#### OpenGL 4.1

Lasti välja 26. juulil 2010.
OpenGL 4.1 spetsifikatsioonist on kaks versiooni: tuumik- ja ühilduvusprofiil. Mõlemad on tagasiühilduvad versiooni 4.0 vastavate profiilidega. Versioon 4.1 tõi uusi laiendusi ja täiustatud ühilduvuse OpenGL ES 2.0-ga, lisades OpenGL-ile OpenGL ES 2.0 omadusi, mida versioon 4.0 ei sisaldanud.

#### OpenGL 4.2

Lasti välja 8. augustil 2011. OpenGL 4.2 spetsifikatsioonist on kaks versiooni: tuumik- ja ühilduvusprofiil. Mõlemad on tagasiühilduvad versiooni 4.1 vastavate profiilidega. Versioon 4.2 tõi uusi laiendusi ja võimalusi.

Kõikide versioonide kirjeldused on saadaval OpenGL-i dokumentatsioonis.'

**OpenGL 4.5**

Lasti välja 11. augustil 2014.

## Viited