OpenGL

Allikas: Vikipeedia

OpenGL (Open Graphics Library)[1] on standardne kirjeldus, mis defineerib mitmekeelse, mitmeplatvormilise programmiliidese (API) 2D ja 3D arvutigraafikat kuvavate rakenduste loomiseks. See liides koosneb üle 250st funktsiooni väljakutsest, mida saab kasutada lihtsate geomeetriliste primitiivide muutmisel keerukateks kolmedimensioonilisteks kujutisteks. OpenGL-i arendas 1992. aastal välja Silicon Graphics Inc.[2] ning seda kasutatakse laialdaselt CAD-is, virtuaalreaalsuses, teaduslikus visualiseerimises, lennusimulatsioonides ja videomängudes. OpenGL-i haldab mittetulunduslik tehnoloogiakonsortsium Khronos Group.

Struktuur[muuda | redigeeri lähteteksti]

OpenGL-il on kaks peamist otstarvet:

  1. Erinevate 3D kiirendite liidestamise keerukuse peitmine, esitledes/tutvustades ühtset liidest.
  2. 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äsklusi saadavad primitiive graafikakonveierisse või konfigureerivad seda protsessi, kuidas konveier primitiive töötleb. Enne OpenGL 2.0-i väljalaskmist 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 funktsionaalsuse põhitaset. Mõned näited sellest, mida OpenGL on aidanud arendada:

  1. rasterdatud punktid, jooned ja hulktahukad lihtsate primitiividena
  2. muundamise ja valgustuse (transform and lightning) konveier
  3. Z-puhverdamine
  4. Tekstuuri vastendamine
  5. Alfasujutamine

Graafikakonveieris toimuva protsessi lühikirjeldus võiks olla järgmine[3]:

  1. 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.
  2. Tehted otspunktidega, nende muundamine ja valgustamine materjalist sõltuvalt; ka kujutise nähtamatute osade kärpimine, et korrigeerida pildi vaateulatust.
  3. Eelneva info rasteriseerimine või muutmine piksliteks. Hulktahukad on esindatud sobiva värvi poolt, mis on määratud interpoleerimisalgoritmidega.
  4. Toimingud fragmendi kohta, muuhulgas väärtuste uuendamine olenevalt sissetulevatest ja varem talletatud sügavuse väärtustest või värvikombinatsioonidest.
  5. Fragmentide sisestamine kaadripuhvrisse.

Paljudel kaasaegsetel 3D kiirendajatel on eelpool kirjeldatust palju kõrgem funktsionaalsus, kuid nende uuendused põhinevad pigem siiski antud baaskonveieril, mitte selle radikaalselt ümbertöötatud variantidel.

Laiendused[muuda | redigeeri lähteteksti]

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

Võib juhtuda, et rohkem kui üks tootja nõustub sama laiendatud funktsionaalsust rakendama, sellisel juhul 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, nagu näiteks GLEW ja GLEE.

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

Kõrgema taseme funktsionaalsus[muuda | redigeeri lähteteksti]

OpenGL oli mõeldud vaid graafika väljastamiseks – tal on ainult renderdamise funktsioonid. 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, millel ta jookseb, 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:

Lisaks tagavad GLUT, SDL, SFML[5] ja GLFW[6] teegid põhiakenduse funktsionaalsust OpenGL-i kasutades.

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

Dokumentatsioon[muuda | redigeeri lähteteksti]

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

The Red book (Punane raamat)

„OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 4.1 (8th Edition)“
Kasutusjuhend ning 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 liidestamisest Microsoft Windowsiga.

The Orange book (Oranž raamat)

„OpenGL Shading Language, 3rd edition“
Kasutusjuhend ning käsiraamat GLSL-ist.

Ajalugu[muuda | redigeeri lähteteksti]

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[8] programmiliidest peeti tipptasemeliseks ning temast sai tööstuse de facto standard. IRIS GL oli üle avatud standarditel põhinevast PHIGS-ist, sest teda peeti kergemini kasutatavaks ja ta toetas kohese režiimiga renderdamist. Sellele vastupidiselt peeti PHIGS-i raskesti kasutatavaks ja funktsionaalsuse 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 litsenseerimise 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[9]. OpenGL arenes SGI varasemast 3D liidesest IrisGL-ist (ja on selle stiilile 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 saadud 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äljalaskmise peale, kuid seda ideed ei tehtud kunagi teoks[10].

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

31. juulil 2006 teatati, et OpenGL spetsifikatsiooni haldamine antakse üle Khronos grupile[13].

Versioonid[muuda | redigeeri lähteteksti]

OpenGL 1.0[muuda | redigeeri lähteteksti]

Lasti välja 1. juulil 1992. a.

OpenGL 1.1[muuda | redigeeri lähteteksti]

Lasti välja 1997. a. 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 ning fragmentidega töötamiseks.

OpenGL 1.2[muuda | redigeeri lähteteksti]

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

OpenGL 1.2.1[muuda | redigeeri lähteteksti]

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

OpenGL 1.3[muuda | redigeeri lähteteksti]

Lasti välja 14. augustil 2001. a. 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[muuda | redigeeri lähteteksti]

Lasti välja 24. juulil 2002. a. 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[muuda | redigeeri lähteteksti]

Lasti välja 29. juulil 2003. a. 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 endas 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[muuda | redigeeri lähteteksti]

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

OpenGL 2.1[muuda | redigeeri lähteteksti]

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

OpenGL 3.0[muuda | redigeeri lähteteksti]

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[muuda | redigeeri lähteteksti]

Lasti välja 24. märtsil 2009. a. Erinevalt eelmistest versioonidest, pole OpenGL 3.1 tagasiühilduv vanemate variantidega. Versiooni 3.0 käsud ning liidesed, mis leiti olevad 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 ning sellest uuemates versioonides.

OpenGL 3.2[muuda | redigeeri lähteteksti]

Lasti välja 3. augustil 2009. a. OpenGL 3.2 spetsifikatsioonist on kaks versiooni: tuumik- ning ü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[muuda | redigeeri lähteteksti]

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

OpenGL 4.0[muuda | redigeeri lähteteksti]

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

OpenGL 4.1[muuda | redigeeri lähteteksti]

Lasti välja 26. juulil 2010. a. OpenGL 4.1 spetsifikatsioonist on kaks versiooni: tuumik- ning ühilduvusprofiil. Mõlemad on tagasiühilduvad versiooni 4.0 vastavate profiilidega. Versioon 4.1 tõi uusi laiendusi ning 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[muuda | redigeeri lähteteksti]

Lasti välja 8. augustil 2011. a. Hetkel kõige uuem OpenGL variant (november 2011). OpenGL 4.2 spetsifikatsioonist on kaks versiooni: tuumik- ning ühilduvusprofiil. Mõlemad on tagasiühilduvad versiooni 4.1 vastavate profiilidega. Versioon 4.2 tõi uusi laiendusi ning võimalusi.

Kõikide versioonide kirjeldused on saadaval OpenGL dokumentatsioonis[14][15]'

OpenGL 4.5

Lasti välja 11. augustil 2014. a.

Viited[muuda | redigeeri lähteteksti]