OpenGL

***OpenGL*** (**''Open** **G**raphics **L**ibrary* — 'atklātā grafiskā bibliotēka') — specifikācija, kas nosaka no programmēšanas valodas neatkarīgu vairākplatformu [[lietojumprogrammas saskarne|lietojumprogrammu saskarni]], kas izmanto divdimensiju un trīsdimensiju grafiku.

*OpenGL* sevī iekļauj vairāk kā 250 sarežģītu trīsdimensiju ainavu zīmēšanai no vienkāršiem primitīviem paredzētas funkcijas.
*OpenGL* izstrādāja *Silicon Graphics Inc.* (SGI) 1992. gadā un tas tiek plaši izmantots datorspēļu izveidē, datorizētā projektēšanā, virtuālajā realitātē, zinātniskajā un informācijas vizualizēšanā, un lidojumu simulācijā. *OpenGL* aktīvi konkurē ar *Direct3d* *Windows* vidē.

== Specifikācija ==
Pašos pamatos, *OpenGL* — tā ir tikai specifikācija, proti, dokuments, kas apraksta funkciju kopumu un to darbību precīzu aprakstu, ko šīm funkcijām ir jāveic. Aparatūras ražotāji uz šīs specifikācijas pamata rada "realizācijas" — funkciju bibliotēkas, kas atbilst specifikācijas funkciju kopumam. Realizācija izmanto aparatūras iespējas, kur vien tas ir pieejams. Ja aparatūra neatbalsta to vai citu iespēju, tad šī iespēja tiek emulēta programmas līmenī. Ražotāju aparatūrai, pirms tās izziņošanas par *OpenGL* saderīgu, ir nepieciešams iziet specifiskus standartsaderības testus.

Efektīva *OpenGL* realizācija ir gan *Windows*, *MacOS*, *Linux* un *Unix* platformās, *PlayStation 3* un pat TI-89 grafiskajā platformā. Pastāv daudzi *OpenGL* funkciju īstenojumi, kas ļauj *OpenGL *darboties uz dažādām platformām, uz kurām pārdevējs nav paredzējis šādu atbalstu. Zīmīgi, ka brīvās programmatūras/atklātā pirmkoda bibliotēka *Mesa 3D* ir *OpenGL* funkciju programmrealizācija. Pateicoties licences specifikai, Mesa ir "neoficiāla" *OpenGL* realizācija, kaut arī tā koda līmenī ir pilnībā ir savietojama ar *OpenGL*.

*OpenGL* specifikāciju uzrada *OpenGL Architecture Review Board* (ARB), kuru šī mērķa īstenošanai nodibināja 1992. gadā. Konsorciju veido kompānijas, kas ir ieinteresētas plaši izplatītas un izmantojamas lietojumprogrammatūras saskarnes radīšanā. Atbilstoši *OpenGL* mājaslapā sniegtajai informācijai, 2004. gadā ARB biedru ar izšķirošām balsstiesībām vidū bija: profesionālās grafiskās aparatūras ražotāji [[SGI]], *3Dlabs*, *Matrox* un *Evans & Sutherland* (militārā aparatūra), plaša patēriņa grafiskās aparatūras ražotāji *ATI* un *NVIDIA*, procesoru ražotājs *Intel*, kā arī datoru un datoraparatūras ražotāji *IBM*, *Apple*, *Dell*, *Hewlett-Packard* un *Sun Microsystems*. Tāpat ARB biedru ar izšķirošām balsstiesībām ir arī viens no datorspēļu industrijas līderiem [[id Software]]. Microsoft, kas bija viens no konsorcija dibinātājiem, 2003. gadā izstājās no ARB. Pateicoties politikai — ik gadu aicināt daudzas kompānijas viena gada garumā ņemt līdzdalību *OpenGL ARB* darbībā — ir ļāvis *OpenGL* kļūt par plaša pielietojuma lietojumprogrammatūras saskarni ar plašām iespējām.

2006. gada 21. septembrī *OpenGL* uzraudzība tika nodota *Khronos Group*.[3] Tas tika darīts ar mērķi optimizēt *OpenGL* mārketingu un novērst šķēršļus, ko bija radījuši *OpenGL* un *OpenGL ES* dažādā attīstība. *Khronos *apakšstruktūra, ka vada OpenGL, vēsturisku iemeslu dēļ tika nosaukta *OpenGL ARB Working Group*.

Kurts Ekelejs (*Kurt Akeley*) un Marks Sīgals (*Mark Segal*) ir *OpenGL* sākotnējās specifikācijas autori. Kriss Freizers (*Chris Frazier*) ir 1.1 versijas redaktors. Jons Ličs ir bijis redaktors visām turpmākajām *OpenGL* versijām, sākot no 1.2 līdz 2.1.

== Arhitektūra ==
OpenGL ir orientēts divu uzdevumu veikšanai:
* novērst grūtības, kas ir saistītas ar dažādu 3D paātrinātāju darbību, izstrādātājiem piedāvājot vienu lietojumprogrammas saskarni;
* novērst aparatūras platformu iespēju atšķirības, pieprasot, lai visas implementācijas atbalstīt pilnu OpenGL iespēju kopumu (lietojot programmas emulāciju, ja tas nepieciešams).

OpenGL pamatuzdevums ir pieņemt primitīvus kā punktus, līnijas un poligonus, un konvertēt tos pikseļos. To paveic grafiskais konveijers (*graphics pipeline*), ko pazīst arī kā *OpenGL state machine*. Lielākā daļa OpenGL komandu ir saistītas vai nu ar primitīvu nodošanu grafiskajam konveijeram vai arī veidu, kā konveijers apstrādā šos primitīvus. Pirms OpenGL 2.0 versijas, konveijerapstrādes katrs posms tika izpildīts kā katras ainas fiksēta funkcija(fixed function) un bija konfigurējams tikai šauros limitos. OpenGL 2.0 piedāvā vairākus posmus, kas ir pilnībā programmējami izmantojot [[GLSL]].

OpenGL ir zema līmeņa, procedūru lietojumprogrammas saskarne, kas no programmētāja pieprasa secīgu soļu izpildi, lai renderētu ainu. Tā ir pamatatšķirība, kas OpenGL atšķir no deskriptīvās pieejas (descriptive API, scene graph vai retained mode), kad visa aina tiek nodota datu kopuma (visbiežāk visa koka) formā, kas pēc tam tiek apstrādāta un atainota uz ekrāna. No vienas puses imperatīvā pieeja no programmētāja prasa dziļas trīsdimensiju grafikas un matemātisko modeļu zināšanas, bet no otras — dod iespēju integrēt dažādas inovācijas, piemēram, renderēšanas algoritmus.

Vēsturiski OpenGL ir ietekmējis 3D grafikas paātrinātāju attīstību, piegādājot funkcionalitātes bāzes līmeni, kas tagad ir pašsaprotams plaša patēriņa aparatūrā:
* Rastras punkti, līnijas un poligoni kā vienkārši primitīvi,
[[Attēls:Pipeline OpenGL.svg|thumb|right|430px|Simplified version of the Graphics Pipeline Process; excludes a number of features like blending, VBOs and logic ops]]
* Transformāciju un gaismojuma konveijers (transform and lighting pipeline)
* Z-buferizācija (Z-buffering)
* Faktūrkartēšana (texture mapping)
* Alfa pārēju nodrošinājums (alpha blending)

Īss grafiskajā konveijerā notiekošo procesu apraksts varētu būt šāds:
# Ja nepieciešams, to polinomiālo funkciju, kas definē noteiktas ievades, piem., splainu (Nonuniform rational B-spline, NURBS) virsmas, aptuvenu līkņu un virsmu ģeometrijas analīze(evaluation).
# Virsotņu (*vertex*) operācijas, to pārveide un gaismošana, izejot no to materiāla. Ainas neredzamo daļu "apcirpšana" ar mērķi parādīt skatāmu vienību.
# Rastrēšana (*Rasterisation*) vai iepriekšējās informācijas pārvēršana pikseļos. Daudzstūri tiek attēloti kā atbilstošas krāsas ar interpolācijas algoritmu palīdzību.
# Fragmentsoļu operācijas (per-fragment operations) kā, piem., vērtību atjaunināšana atkarībā no ienākošajām un iepriekš noglabātajām dziļuma vērtībām (depth value) vai arī atkarībā no krāsu kombinācijām.
# Un fragmenti tiek ievietoti kadru buferī (frame buffer).

Daudzi mūsdienīgi 3D grafikas paātrinātāji piedāvā daudz plašāku funkcionalitāti par augstākminēto, bet šīs jaunās iespējas lielākoties ir pamatkonveijera uzlabojumi, nevis radikāli pārveidojumi.

== Piemērs ==
Šis piemērs demonstrē, kā uz ekrāna uzzīmēt zaļu laukumu. OpenGL ir vairākas metodes šī uzdevuma veikšanai, un šī ir vissaprotamākā.

<source lang="c">
glClear( GL_COLOR_BUFFER_BIT );
</source>
: Šis priekšraksts attīra krāsu buferi, lai ekrāns būtu tīrs.

<source lang="c">
glMatrixMode( GL_PROJECTION ); /* Subsequent matrix commands will affect the projection matrix */
glLoadIdentity(); /* Initialise the projection matrix to identity */
glFrustum( -1, 1, -1, 1, 1, 1000 ); /* Apply a perspective-projection matrix */
</source>
: Šie priekšraksti uzsāk matrices projicēšanu, uzstādot 3D šķeltā konusa (frustum) matrici, kas veido redzamo laukumu. Šī matrice pārveido kamerrelatīvās telpas (camera-relative space) objektus OpenGL projekciju telpas objektos.

<source lang="c">
glMatrixMode( GL_MODELVIEW ); /* Subsequent matrix commands will affect the modelview matrix */
glLoadIdentity(); /* Initialise the modelview to identity */
glTranslatef( 0, 0, -3 ); /* Translate the modelview 3 units along the Z axis */
</source>
: Šie priekšraksti iniciē modeļskata matrici(modelview matrix). Šī matrice nosaka transformāciju no modeļrelatīvajām koordinātēm uz kameras telpu. Modeļskata un projekcijas matrices apvienojums objektus transformē no modeļrelatīvās telpas uz projekcijas ekrāna telpu.

<source lang="c">
glBegin( GL_POLYGON ); /* Begin issuing a polygon */
glColor3f( 0, 1, 0 ); /* Set the current color to green */
glVertex3f( -1, -1, 0 ); /* Issue a vertex */
glVertex3f( -1, 1, 0 ); /* Issue a vertex */
glVertex3f( 1, 1, 0 ); /* Issue a vertex */
glVertex3f( 1, -1, 0 ); /* Issue a vertex */
glEnd(); /* Finish issuing the polygon */
</source>
: Šīs komandas uzzīmē zaļu laukumu XY plaknē (plane).

== Dokumentācija ==
OpenGL popularitātes pamatā daļēji ir lieliskā tai pieejamā dokumentācija. OpenGL ARB ir izlaidusi vairākas rokasgrāmatas līdztekus specifikāciju dokumentiem, kas tiek aktīvi atjaunināti no versijas uz versiju un apraksta visus jauninājumus un iespējas, kas ir pieejamas lietojumprogrammas saskarnēs. Šīs grāmatas ir hrestomātiski darbi par OpenGL:

* The Red Book — OpenGL Programming Guide, 5th edition. [http://www.google.com/books?id=T6kOAAAACAAJ&dq=OpenGL+Programming+Guide&ei=XPE6SPrMN4e0yQTN75jMDw]
*: Lasāma rokasgrāmata / Atsauču grāmata — "obligāta" grāmata OpenGL programmētājiem. Pirmais izdevums elektroniski pieejams tiešsaistē [https://web.archive.org/web/20080428165121/http://fly.cc.fer.hr/~unreal/theredbook/ te] un [http://www.glprogramming.com/red/ te].
* The Blue Book — OpenGL Reference manual, 4th edition.
*: Būtībā cietvāku izdevums ar Unix rokasgrāmatas lappusēm (Unix manual pages) par OpenGL.
*: Grāmatā atradīsiet plakāta izmēra diagrammu, kas demonstrē idealizētu OpenGL implementāciju. Grāmata ir pieejama [http://www.glprogramming.com/blue/ šeit].
* The Green Book — OpenGL Programming for the X Window System.
*: Grāmata par X11 saskarņošanu (interfacing) un OpenGL Utility Toolkit (GLUT).
* The Alpha Book (kurai gan, patiesību sakot, ir balts vāks) — OpenGL Programming for Windows 95 and Windows NT.
*: Grāmata par OpenGL saskarņošanu Microsoft Windows vidē.

Par OpenGL 2.0 un turpmākajām versijām:

* The Orange Book — The OpenGL Shading Language.
*: Rokasgrāmata un atsauču kolekcija par [[GLSL]].

== Paplašinājumi ==
OpenGL standarti ļauj individuāliem pārdevējiem (vendors) nodrošināt papildusfunkcionalitāti ar [[paplašinājums|paplašinājumu]] (extensions) palīdz;ibu, kolīdz ir radīta jauna tehnoloģija. Ar paplašinājumu palīdzību var ieviest jaunas funkcijas un konstantes, kā arī atvieglot vai noņemt ierobežojumus esošās OpenGL funkcijās. Katrs pārdevējs lieto alfabētisku saīsinājumu, kas tiek izmantots pārdevēja jauno funkciju un konstanšu apzīmēšanai. Piemēram, saīsinājums (*NV*) tiek lietots [[NVIDIA]] patentēto funkciju <code>glCombinerParameterfvNV()</code> un konstanšu <code>GL_NORMAL_MAP_NV</code> apzīmēšanai.

Pastāv iespēja, ka kāds cits pārdevējs piekrīt implementēt otra pārdevēja paplašināto funkcionalitāti. Tādā gadījumā šādas funkcionalitātes apzīmēšanai tiek lietots saīsinājums *EXT*. Pēcāk pastāv iespēja, ka Architecture Review Board (ARB), OpenGL konsorcijs, "svēta" šo paplašinājumu. Tādā gadījumā tas vēlāk kļūst par *standarta paplašinājumu*, un tā apzīmēšanai tiek lietos saīsinājums *ARB*. Pats pirmais ARB paplašinājums bija <code>GL_ARB_multitexture</code>, ko ieviesa OpenGL 1.2.1. versijā. Savukārt [[faktūrkartēšana]] (multitexturing), atbilstoši oficiālajai paplašinājumu veicināšanas politikai, tika nevis implementēta kā brīvizvēles ARB paplašinājums, bet gan iekļauta kā OpenGL lietojumprogrammas kodola saskarnē, sākot ar 1.3 versiju.

Lai paplašinājumu varētu izmantot, programmai no sākuma vajag noteikt tā pieejamību un darbgatavību, un tad iegūt norādes (pointers) uz jaunajām funkcijām, kuras sniedz paplašinājums. Šīs darbības mehānisms ir katrai platformai atšķirīgs un tādas bibliotēkas kā [[OpenGL Extension Wrangler Library|GLEW]] un [[OpenGL Easy Extension library|GLEE]] visupirms ir radītas šī procesa vienkāršošanai.

Teju vai visu paplašinājumu specifikācijas var aplūkot oficiālajā paplašinājumu reģistrā [http://www.opengl.org/registry/].

== Saistītās rīku bibliotēkas ==
Atsevišķas bibliotēkas ir "iebūvētas" OpenGL bāzē vai ārpus tās, lai nodrošinātu iespējas, kas pašā OpenGL nav pieejams. Tādas bibliotēkas kā [[OpenGL Utility Library|GLU]] var atrast OpenGL implementācijās, kamēr citas kā, piemēram, [[OpenGL Utility Toolkit|GLUT]] un [[Simple DirectMedia Layer|SDL]] ir attīstījušas laika gaitā un nodrošinājušas rudimentāru vairākplatformu logošanas (windowing) un peles funkcionalitāti, un, ja tā nav bijusi pieejama, tad šīs bibliotēkas bija ērti lejupielādējamas un pievienojamas izstrādes videi. Vienkāršas [[grafiskā lietotāja saskarne]]s (GUI) funkcionalitāte ir pieejama tādās bibliotēkās kā [[OpenGL User Interface Library|GLUI]] vai [[FLTK]]. Citas bibliotēkas kā, piemēram, [[AUX]] ir "atmestas" (deprecated) un aizstātas ar funkcionalitāti, kas ir plaši pieejama daudz populārākās bibliotēkās, tomēr AUX kods, ko tās lieto, aizvien ir pieejams vienkāršās pamācībās. Vēl citas bibliotēkas ir radītas, lai nodrošinātu OpenGL programmu izstrādātājus ar vienkāršiem OpenGL paplašinājumu un versiju pārvaldības līdzekļiem. Pie šādām bibliotēkām pieskaitāmas [[OpenGL Extension Wrangler Library|GLEW]] (the OpenGL Extension Wrangler Library) un [[GLEE]] (the OpenGL Easy Extension Library).

Līdztekus iepriekšminētajām vienkāršajām bibliotēkām, ir arī augstākā līmeņa objektorientētu ainu grafu [[paturošais režīms|paturošā režīma]] (retained mode) bibliotēkas, un tās būtu [[PLIB]], [[OpenSG]], [[OpenSceneGraph]] un [[OpenGL Performer]] bibliotēkas. Tās ir pieejamas kā vairākplatformu atklātā pirmkoda programmatūras vai kā [[īpašniekprogrammatūra]]s saskarnes, kas ir iekļautas OpenGL bāzē vai sistēmas bibliotēkās un ir paredzētas [[reāllaika skaitļošana]]s iespējošanai vizuālās simulācijas lietotņu darbā. Citi risinājumi atbalsta OpenGL [[virtuālā realitāte]]s programmu, [[mērogojamība]]s un [[grafiskais klasteris|grafisko klastera]] pielietojamības [[paralēldarbība|paralēldarbību]], kā piemēram, caurspīdīgi kā [[Chromium (programmatūra)|Chromium]] vai caur programmas saskarni — [https://web.archive.org/web/20080511163442/http://www.equalizergraphics.com/ Equalizer] gadījumā.

[[Mesa 3D]] ir atklātā pirmkoda OpenGL implementācija. Mesa 3D nodrošina OpenGL programmatūras līmeņa renderēšanu, kā arī aparatūras paātrināšanu Linux sistēmā vairākām 3D videokartēm. Sākot ar 2007. gada 22. jūniju Mesa 3D īsteno 2.1 versiju un izplata atsevišķus savus paplašinājumus dažādām platformām.

== Piesaistes ==
Lai izceltu OpenGL dažādu programmēšanas valodu un vairākplatformu raksturu, dažādas [[piesaiste (datorika)|piesaistes]] un porti ir izveidoti priekš OpenGL daudzās programmēšanas valodās. Dažas no šīm valodām un piesaistēm ir:
* [[Ada (programmēšanas valoda)|Ada]]: *'Ada OpenGL 1.1** atbalsta GL, GLU and GLUT [https://web.archive.org/web/20041013020717/http://www.cs.chalmers.se/~bond/OPENGL/ADA/]
* [[BlitzBasic|BlitzMax]]: OOP valoda bez izpildlaika (runtime). Atbalsta Win32/64, Linux, OSX(PPC,intel). Iebūvēts OpenGL atbalsts.
* [[C Sharp (programmēšanas valoda)|C#]]: **Tao** ietvars(framework) priekš [[Microsoft .NET]], iekļauto multivides bibliotēku starpā ir arī OpenGL [https://web.archive.org/web/20080607090153/http://www.taoframework.com/]
* [[D (programmēšanas valoda)|D]]: Vairāk informācijas [http://dsource.org/projects/bindings bindings] un [http://dsource.org/projects/derelict Project Derelict]
* [[Borland Delphi|Delphi]]: **Dot**[https://web.archive.org/web/20080308074632/http://www.delphi3d.net/dot/]
* [[Fortran]]: **f90gl** atbalsta OpenGL 1.2, GLU 1.2 un GLUT 3.7 [http://math.nist.gov/f90gl/]
* [[FreeBASIC]]: Vietējais OpenGL atbalsts. Iebūvēta OpenGL konteksta radīšana.
* [[Haskell (programmēšanas valoda)|Haskell]]: **HOpenGL** atbalsta GL, GLU un GLUT. Komplektā iekļauta arī [[Glasgow Haskell Compiler]] pēdējā versija. [http://www.haskell.org/ghc]
* [[Java (programmēšanas valoda)|Java]]:
** [[Java Bindings for OpenGL]] (JSR 231) un [[Java OpenGL]] (JOGL)
** [[Lightweight Java Game Library]] (LWJGL)
* [[Lisp]]: Vairāk informācijas: [http://common-lisp.net/project/cl-opengl/ the cl-opengl project at common-lisp.net]
* [[Scheme (programmēšanas valoda)|Scheme]]: [http://www.call-with-current-continuation.org/eggs/opengl.html Chicken Egg],[https://web.archive.org/web/20080311010156/http://pre.plt-scheme.org/plt/collects/sgl/doc.txt OpenGL bindings for PLT Scheme], [http://practical-scheme.net/gauche/packages.html OpenGL bindings for Gauche Scheme]
* [[Mercury (programmēšanas valoda)|Mercury]] Prolog mtogl
* [[Objective Caml|Ocaml]]: [http://glcaml.sourceforge.net/ GLCaml] un [http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgl.html LablGL]
* [[Perl]]:
** [[Perl OpenGL]] (POGL) modulis — C valodā rakstītas koplietojamās bibliotēkas
** [http://graphcomp.com/opengl/benchmarks C vs Perl and Perl vs Python] veiktspējas testi
* [[Pike (programmēšanas valoda)|Pike]]: Vietējā OpenGL saskarne. Tāpat tiek atbalstīts arī GLU un GLUT [https://web.archive.org/web/20121002205154/http://pike.ida.liu.se/about/pike/modules.xml]
* [[PHP]]: See http://phpopengl.sourceforge.net/ 
* [[PureBasic]]: Vietējais OpenGL atbalsts.
* [[Python]]: **PyOpenGL** atbalsta GL, GLU un GLUT [http://pyopengl.sourceforge.net/]
* [[Ruby MRI|Ruby]]: Vairāk informācijas [https://web.archive.org/web/20080515223313/http://ruby-opengl.rubyforge.org/] — atbalsta GL, GLU un GLUT
* [[Smalltalk]], kā tas bija redzams, [[Croquet Project]] darbojas uz Squeak Smalltalk
* [[Visual Basic]]: [http://www.weihenstephan.de/~syring/ActiveX/ ActiveX Control]
* [[Visual Prolog]] komerciāla redakcija

Vairāk par OpenGL piesaistēm:
[https://web.archive.org/web/20080321020019/http://www.opengl.org/wiki/index.php/Language_bindings opengl.org viki].

== Augstākā līmeņa funkcionalitāte ==
OpenGL ir veidots, lai nodrošinātu grafikas izvadi: tas nodrošina tikai [[renderēšana (datorgrafika)|renderēšanas]] funkcijas. Lietojumprogrammas saskarnes kodolā nav [[logošanas sistēma]]s, audio, izdrukas uz ekrāna, tastatūras, peles vai kādas citas [[ievadierīce]]s koncepta. Neskatoties uz to, ka pirmajā brīdī tas varētu šķist ierobežojoši, tieši tas pieļauj tādu kodu, kas padara iespējamu renderēšanu neatkarīgi no izmantotās [[operētājsistēma]]s, izstrādi tādējādi pārvēršot par vairākplatformu. Un tomēr — ierobežotu apmēru integrācija vietējā logošanas sistēmā ir nepieciešama, lai neapgrūtināta mijiedarbība ar saimniekdatoru būtu iespējama. Tas tiek panākts, izmantojot sekojošos lietojumprogrammas saskarnes papildinājumus:

* [[GLX]] — [[X Window System|X11]] (ieskaitot [[tīkla caurspīdība|tīkla caurspīdību]])
* [[WiggleWin32|WGL]] — [[Microsoft Windows]]
* [[Core OpenGL|CGL]] — [[Mac OS X]]. Labāka integrācija ar [[Mac OS X]] programmu darbvidi tiek nodrošināta ar [[CGL]] slāņotu (layered) lietojumprogrammas saskarņu palīdzību: [[Apple GL|AGL]] priekš [[Carbon (lietojumprogrammas saskarne)|Carbon]] un [[NSOpenGL]] priekš [[Cocoa (lietojumprogrammas saskarne)|Cocoa]].

Jāmin arī [[OpenGL Utility Toolkit|GLUT]], [[Simple DirectMedia Layer|SDL]] un GLFW bibliotēkas, kas nodrošina pārnesamu (portable) vienkāršas logošanas funkcionalitāti.

== Vēsture ==
1980. gados tādas programmatūras izstrādes, kas spētu mijiedarboties ar plaša diapazonu grafisko aparatūru, bija īsts izaicinājums. Programmatūras izstrādātāji veidojas maināmas (custom) saskarnes un dziņus priekš katra aparatūras modeļa. Tas bija dārgi un dubulti darbietilpīgi.

90. gadu sākumā [[Silicon Graphics]] (SGI) bija vadošā kompānija, kas nodrošināja 3D grafiku darbstacijām. Tās veidotā [[IRIS GL]] lietojumprogrammas saskarne bija iecerēta kā "mākslas darbs" un kļuva par de facto industrijas standartu, aptumšojot atvērtos standartos bāzēto [[PHIGS]]. Tas izdevās pateicoties tam, ka IRIS GL bija vieglāk lietot, un arī tāpēc ka tā atbalstīja [[tūlītējs režīms|tūlītējā režīma]] (immediate mode) renderēšanu. Salīdzinājumam PHIGS bija grūti lietojams un no funkcionalitātes viedokļa novecojis.

SGI konkurenti (ieskaitot [[Sun Microsystems]], [[Hewlett-Packard]] un [[IBM]]) arī bija spējīgi tirgū piedāvāt 3D aparatūru, kurā bija atbalstīti ar [[PHIGS]] standartu savietojami standarti. Tas vājināja SGI tirgus daļu, kolīdz citi 3D aparatūras ražotāji ienāca tirgū. Cenšoties mainīt tirgu sev par labu, SGI pieņēma lēmumu IrisGL API izplatīt kā atvērto standartu.

SGI secināja, ka IrisGL API nav piemērots atklātības principiem dažādu licenču un īpašniektiesību dēļ. Tāpat IrisGL nebija pilnība apmierinošs 3D grafikas vajadzībām. Un, proti, tajā bija tikai daļēji realizētas logošanas, tastatūras un peles lietojumprogrammu saskarnes, jo tās bija izstrādātas pirms parādījās pirmās [[X Window System]] un Sun [[NeWS]] izstrādes šajā virzienā.

Piedevām, tā kā SGI bija ievērojams programmatūras klientu skaits, ar OpenGL lietojumprogrammatūras saskarnes piedāvāšanu tiem, bija iecerēts tos saglabāt kā SGI (un arī IBM) aparatūras lietotājus, līdz OpenGL lietojumprogrammatūras atbalsts nobriestu plašam tirgum. Un pa tam, SGI censtos noturēt savas aparatūras patērētājus, piedāvājot tiem modernās un patentētās [[Open Inventor|Iris Inventor]] un [[Iris Performer]] programmējamās lietojumprogrammatūras saskarnes.

Šo notikumu rezultātā, tapa SGI piedāvātais **OpenGL*' standarts.

OpenGL standartizēja piekļuvi pie aparatūras un aparatūras ražotāju, kā arī aizsāka aparatūras izstrādātāju vidū aparatūras saskarņu programmu izstrādes atbildības politiku, kā redzamākais ieguvums mūsdienās ir [[ierīces dzinis]] (device driver). Tāpat OpenGL deliģēja logošanas funkcijas operētājsistēmai. Spēja mijiedarboties ar tik plašu aparatūras klāstu, liekot tai visai "runāt vienā valodā", dāvāja programmatūras izstrādātājiem augstākā līmeņa platformu 3D programmatūras izstrādei.

1992. gadā, SGI nodibināja OpenGL architectural review board (OpenGL ARB) — kompāniju, kas nākamajos gados uzturēja un popularizēja OpenGL specifikācijas, grupas — izveides iniciators. OpenGL izveidojās (un būtībā bija ļoti tuvs) SGI agrākajai 3D saskarnei *IrisGL*. Viens no IrisGL ierobežojumiem bija, ka tas piedāvāji piekļuvi tikai pie tām iespējām, kas bija uzturētas aparatūrā. Ja grafikas aparatūra neatbalstīja iespēja, tad programma nespēja to izmantot. OpenGL atrisināja šo problēmu, piedāvājot iespējas, ko aparatūra neuzturēja, sniedzot iespēju programmai lietot modernas grafikas uz relatīvi zemas jaudas sistēmām.

1994 SGI nodevās iecerei par "[[OpenGL++]]", kurā bija iekļauti tādi elementi kā ainu grafu (scene-graph) saskarnes (jādomā veidotas uz viņu [[Performer (Computer Graphics API)|Performer]] tehnoloģijas bāzes). Specifikācijas tika prezentētas pāris izstrādātāju salidojumus, taču tā arī neguva plašāku popularitāti, tā arī nekļūstot par produktu.

[[Microsoft]] prezentēja [[Direct3D]] 1995. gadā, un tas kļuva par galveno OpenGL konkurentu. 1997. gada 17. decembrī Microsoft un SGI aizsāka [[Fahrenheit graphics API|Fahrenheit]] projektu, kura mērķis bija apvienot OpenGL un Direct3D saskarnes. 1998. gadā projektā iesaistījās Hewlett-Packard. Projekts sākotnēji radīja cerību, ka 3D datorgrafikas saskarņu pasaulē būs kārtība, bet sakarā ar SGI finansiālām grūtībām, Microsoft stratēģiju, un vispārēju industrijas ignoranci, šis projekts tikai pārtraukts 1999. gadā.

== OpenGL 2.0 ==
Salīdzinājumā ar DirectX, OpenGL tika kritizēts par apgrūtinošu Konsorcija darbību. Kritiķi uzsvēra, ka tajā ietilpstošais lielais uzņēmumu ar dažādām interesēm skaits noved pie ilgstoša jaunas versijas specifikācijas apstiprinājumu. OpenGL prezentēja [[3Dlabs]] kā atbilde uztraukumam par lēnu izstrādi un nenoteiktu OpenGL nākotni. 3Dlabs piedāvāja vairākus būtiskus papildinājumus standartam, no kuriem ievērojamākais bija [GLSL] (OpenGL Shading Language). Tas programmētājam ļāva aizvietot fiksēto OpenGL konveijeri ar nelielām GLSL valodā rakstītām programmām, un tas ļāva realizēt tādus efektus kā, piemēram, reljefās tekstūras (bump mapping), viļņus un ūdens ņirbēšanu. OpenGL 2 fināla versijas specifikācija ietvēra GLSL atbalstu.[http://www.opengl.org/documentation/specs/version2.0/glspec20.pdf]  Tomēr arī pirms GLSL iekļaušanas OpenGL standartā bija iespēja izveidot specifektus dažādās programmēšanas valodās: : assembler (paplašinājumi vertex_program, fragment_program) un Cg (NVidia C for Graphics). Diemžēl daudzi ierosinājumu aizvien nav realizēti OpenGL 2.0 versijā, lai gan daudzi no tiem ir pieejami kā paplašinājumi.

== OpenGL 2.1 ==
2006. gada 2. augustā tika prezentēta OpenGL 2.1 versija un tā bija atpakaļsavienojama ar iepriekšjiem OpenGL laidieniem. OpenGL 2.1 piedāvāja sekojošu funkcionaltāti:
* OpenGL Ēnošanas valodu (Shading Language) 1.20 ([[GLSL]])
* Komandas, kas specificēja un pieprasīja nekvadrātiskus matricu veidojumus (non-square matrix uniforms) mijiedarbei ar OpenGL Shading Language
* Pikseļbufera objektus efektīvai attēlu pārraidi no un uz bufera objektiem ar šādu komandu palīdzību <tt>glTexImage2D</tt> un <tt>glReadPixels</tt>.
*: Šī funkcionalitāte ir atkarīga no <tt>ARB_pixel_buffer_object</tt> paplašinājuma.
* [[sRGB]] tekstūru formāts.
*: Šī funkcionalitāte ir atkarīga no <tt>EXT_texture_sRGB</tt> paplašinājuma.

== OpenGL 3.0 ==

Jaunā OpenGL lietojumprogrammas saskarnes versija ir OpenGL 3.0, kurai ir piešķirts [[koda vārds]] [[Longs Peak]]. Sākotnēji to bija iecerēts pabeigt 2007. gada septembrī, taču Khronos group 30. oktobrī izplatīja ziņu, ka tās iekšienē ir pāris domstarpības attiecībā uz OpenGL funkcionalitāti un ka tā vēlas tās atrisināt pirms galīgā laidiena un ka šobrīd tā pārvērtē specifikāciju. Šo iemeslu dēļ laidiens tika atlikts uz 2008. gadu. Pēc šī paziņojuma publiskajā telpā nav bijis tālāko ziņu attiecībā uz laidiena datumu vai progresu (2008-05-09), kas kopienā izsauca neapmierinātību un liekas spekulācijas. Neskatoties uz visu iepriekšminēto, Nvidia pārstāvis un ilggadējs OpenGL atbalstītājs, Maikls Golds, pavēstīja, ka BoF at SIGGRAPH 2008 interešu grupas salidojumā, kas notiks no 11. līdz 15. augustam [[Losandželosa|Losandželosā]], BoF interešu grupā tiks prezentēta OpenGL 3.0 specifikācija. Šī specifikācijas prezentācija ļoti iespējams arī būs OpenGL jaunās versijas laidiens. 2008. gada 11. augustā visubeidzot tika prezentēta OpenGL 3 specifikācija tiesa, ar komentāru, ka nedz [[Intel]], nedz [[Advanced Micro Devices|AMD]] vai [[Nvidia]] grafisko karšu risinājumi vēl neatbalsta jauno specifikāciju un nav zināms, kad tā pilnvērtīgi tiks nodrošināta.

OpenGL 3.0 ir pirmais būtiskais lietojumprogrammas saskarnes pārskats OpenGL dzīves ciklā. Šis laidiens sastāv no pilnībā pārskatīta OpenGL darbības modeļa — sākot no modeļu izveides principiem un beidzot ar ēnošanu (shader). Atpakaļsavienojamību nodrošina visu iepriekšējo lietojumuprogrammas saskarņu pieejamība jaunajā risinājumā. Nekāda jauna funkcionalitāte vecajām lietojumprogrammu saskarnēm vairs nav pievienota.

OpenGL 3.0 lietojumprogrammas saskarne ir fundamentāli citādāka nekā iepriekšējiem laidieniem raksturīgā. Jebkura fiksētā funkcionalitāte, kurai OpenGL 2.1 nodrošināja ēnošanas saskarni, tagad ir aizstāta ar ēnošanas pieeju(shader-only approach). Lietojumprogrammas saskarne ir racionalizēta: tagad tā ir vienlīdz ērta programmu un implementāciju izstrādē.

Būtiskākā atšķirība no lietojumprogrammas saskarnes viedokļa ir objektorientācija (reliance on objects). OpenGL 2.1 objektu modelis bija atkarīgs no OpenGL stāvokļorientētā (state-based) dizaina. Tādējādi, lai modificētu objektu vai lai to lietotu, bija nepieciešams to sasaistīt ar stāvokļu sistēmu (the state system), tad veikt modifikācijas stāvoklim vai izpildīt tos funkciju izsaukumus, kas nodrošina objekta sasaisti. Šāds darbības mehānisms apgrūtināja OpenGL implementāciju darbību, jo bija nepieciešams zināt, vai objekts ir saistīts lietošanai (object was being bound for use) vai modifikācijai.

Tāpat, tāpēc ka vēsturiski OpenGL pamatā bija objektu modelis, objektiem bija jābūt mainīgiem. Un proti, objektu pamatstruktūra varēja mainīties jebkurā laikā, pat ja renderēšanas konveijers (rendering pipeline) asinhroni lietoja šo objektu. Tekstūrmodeli varēja pārdefinēt no 2D uz 3D. Tas paģērēja implementāciju spēju bāreņot (to orphan) iekšējos objektus, un šis process lieki sarežģīja iekšējo objektu pārvaldību.

Jaunais, 3.0 objektu modelis likvidē abas šīs problēmas. Objekti, kas ir radīti, ir un paliek nemainīgi. 2D tekstūra ir 2D tekstūras objekts noteiktajā paplašinājumā un formātā uz mūžiem, lai arī, protams, tā var tikt iznīcināta vai arī tikta papildināta ar cita attēla datiem.

Tas paģēr būtiskas daļas OpenGL lietojumprogrammas saskarnes daļas mainīšanu. Savukārt šī objektu modelī bāzētā izmaiņa ir būtisks solis prom no stāvoklī bāzētas sistēmas uz objektorientētu sistēmu.

Objektu radīšana ir kļuvusi atomiska; viens funkcijas izsaukums rada pilnībā noformētu objektu. Objektu koplietošana renderēšanas kontekstu vidē (across rendering contexts) ir noteikta katra objekta līmenī (at the per-object level); tas implementācijai sniedz iespēju lietot virkņdrošus (thread-safe) funkcijas izsaukumus uz šiem objektiem. Atomiskā objekta radīšana ir iespējama pateicoties detalizēta tipa veidnes objekta radīšanai (a template object of a particular type). Veidnes objekti ir līdzīgi C valodā izmantotajiem heterogēnajiem apkopotajiem datu tipiem (structs), ar to atšķirību, ka tie var tikt paplašināti ar jauniem objektiem bez pārkompilācijas. Atribūti tiek uzstādīti veidnes objektā, kolīdz lauki heterogēnajiem apkopotajiem datu tipos var tikt uzstādīti. Pēc tam veidnes objekts tiek nodots atbilstošajai objekta radīšanas funkcijai kā detalizēts veidnes objekta tips.

Objektu radīšana vienlaicīgi ir arī [[asinhronā komunikācija|asinhrona]]. Implementācijai ir atļauts sākt objektu radīšanu citā virknē. Ar objektu saistītais lokālais identifikators (handle) paliek validēts arī tajā gadījumā, ja objekta radīšana nav pabeigta. Renderēšana var notikt ar objektiem, kas vēl nav radīti, pateicoties tam, ka OpenGL renderēšana ir asinhrons process.

Funkcijām, kas tiek lietotas mainīgu objektu mainīga daudzuma modificēšanai, piemēram, attēla satura izmainīšanai, ir iespējams objektu apstrādāt kā parametru. Tas ir pilnībā pretēji OpenGL 2.1 stilam, kur objektam bija jābūt saistītam kontekstā, ja to grasījās modificēt vai tikai tam piekļūt. Objekti aizvien ir saistīti kontekstā, lai tos varētu nodot renderēšanai.

Pirmais draiveris, kas atbalsta OpenGL 3.0 (tikai Windows videi) specifikācijas un izsaukumu vidi, ir Nvidia draiveris 177.89 galddatoriem ar GeForce 8000 sērijas vai jaunākās saimes kartēm: GeForce GTX 260, 280; Quadro FX 370, 570, 1700, 3700, 4600, 4700x2, 5600. Savukārt klēpjdatoriem tiek atbalstītas GeForce 8000 sērijas vai jaunākās saimes kartes: Quadro FX 360M, 370M, 570M, 770M, 1600M, 1700M, 2700M, 3600M, 3700M.

Šis draiveris nodrošina pilnu OpenGL 3.0 un GLSL 1.30 īstenojumu, izņemot:

* Vienkanāla (RED) un divkanāla (RG) tekstūras,
* Dažādizmēra kadru bufera objektu pievienojumus (dažādformāta pievienojumi ir atbalstīti),
* Notīrītājbufera lietojumprogrammu saskarni,
* Bezlogu renderēšanas atbalstu,
* Ar tālākadresiju savienojamu kontekstu,
* Atkļūdošanas kontekstu.

== Plāni pēc OpenGL 3.0 ==

Jau tagad tiek spriests, kādu jaunu papildusfunkcionalitāti varētu pievienot nākamajām pēc OpenGL 3.0 versijām.
Šis ir visticamākais scenārijs, jo tik ilgu laiku atliktajā OpenGL 3.0 laidienā visticamākais tiks iekļautas arī papildiespējas un atjauninājumi "Longs Peak reloaded" un "Mt Evans".

=== Longs Peak atjauninājumi ===

Šis atjauninājums, ko iecerēts prezentēt 2-3 mēnešus pēc OpenGL 3.0 laidiena, būs saistīts ar to nenozīmīgu iespēju pievienojumu, kuras nebija izšķirošas OpenGL 3.0 laidienam. Šīs iespējas galvenokārt fokusēsies uz lietošanas ērtumu, tādējādi padarot lietojumprogrammas saskarnes izmantošanu komfortablāku, lai arī galvenajā laidienā dažas veiktspēju uzlabojošās iespējas jau būs iekļautas.

=== Mt Evans (Ivansa kalns) ===

Šis atjauninājums, ko prezentēs 3-5 mēnešus pēc OpenGL 3.0 laidiena, primāri būs atjauninājums, kurā būs ietverts modernas aparatūras iespējas atbalsts. Un tas sevī iekļaus ģeometrijas šeiderus, veselos skaitļus šeideros (integers in shaders), tekstūru masīvus un tūlītēju renderēšanu (instanced rendering).

== Khronos Group biedri ==
2006. gadā nozīmīgākie OpenGL ARB Working Group biedri bija:
* *Advanced Micro Devices* (AMD)
* *Apple*
* *Creative Labs*
* *Graphic Remedy*
* *Intel Corporation*
* *id Software*
* *NVIDIA*
* *Sony Computer Entertainment*
* *Sun Microsystems*
* *Texas Instruments*
Iepazīties ar pilnu projektu biedru struktūru — [http://www.khronos.org/members/promoters/ sponsoriem], [http://www.khronos.org/members/contributors/ ziedotājiem] un [http://www.khronos.org/members/academic/ akadēmiķiem] — iespējams [http://www.khronos.org/ Khronos Group] mājaslapā.

== Renderējuma paraugi ==
<center>
<gallery>
Image:JOGL Refrection Demo Screenshot.png|Refrakcijas izmantojot programmējamos virsotņu šeiderus 
Image:Perl OpenGL fob2.jpg|[[Perl OpenGL]] animētās tekstūras izmantojot kadru bufera objektus un virsotņu/fragmentu programmas paplašinājumus
</gallery>
</center>

== OpenGL spēles ==

Nozīmīgākās spēles, kurās ir ietverts OpenGL renderētājs:

* [[America's Army]]
* [[Baldur's Gate 2]] — pēc noklusējuma D3D
* [[Call of Duty]]
* [[City of Heroes]]
* [[City of Villains]]
* 
* [[Counter-Strike]] (ne [[Counter-Strike: Source]])
* [[Darwinia (datorspēle)|Darwinia]] — pēc ielāpa uzstādīšanas pēc noklusējuma D3D
* [[Doom 3]]
* [[Dwarf Fortress]]
* [[Earth 2150]]
* [[Enemy Territory: Quake Wars]]
* [[Far Cry]] — pēc noklusējuma D3D
* [[Frets On Fire]]
* [[FlightGear]]
* [[Half-Life (datorspēle)|Half-Life]] (ne [[Half-Life 2]])
* [[Homeworld 2]]
* [[Neverwinter Nights]]
* 
* [[Prey (datorspēles)|Prey]]
* [[Quake (series)|Quake series]]
* [[Rage (datorspēle)|Rage]]
* [[Scorched3D]]
* [[Second Life]]
* [[Serious Sam]]
* [[Serious Sam II|Serious Sam 2]] — pēc noklusējuma D3D
* [[Spring (datorspēle)|Spring]]
* 
* [[Star Wars Jedi Knight: Jedi Academy]]
* [[The Chronicles of Riddick: Escape from Butcher Bay]]
* [[Tux Racer]]
* [[Ultima IX: Ascension]]
* [[Unreal (series)|Unreal series]]
* [[Warcraft 3]] — pēc noklusējuma D3D Windows vidē
* [[Wolfenstein: Enemy Territory]]
* [[World of Warcraft]] — pēc noklusējuma D3D Windows vidē
* [[Wurm Online]]
* [[X-Plane (simulators)|X-Plane]]

== Skatīt arī ==
* [[ARB (GPU asamblervaloda)]] — OpenGL zemākā līmeņa ēnošanas (shading) valoda
* [[GLSL]] — OpenGL augstākā līmeņa ēnošanas (shading) valoda
* [[Cg (programming language)|Cg]] — Nvidia's ēnošanas (shading) valoda, kas darbojas ar OpenGL
* [[OpenGL ES]] — OpenGL [[iegultā sistēma|iegultajām sistēmām]] (for embedded systems)
* [[OpenAL]] — The Open Audio Library — ar OpenGL savietojama bibliotēka
* [[OpenSL ES]] — Cita audio bibliotēka
* [[grafiskais konveijers]]

=== OpenGL atbalsta bibliotēkas ===
* [[OpenGL Utility Toolkit|GLUT]] — OpenGL utilītprogrammu rīkkopa.
* [[Simple DirectMedia Layer|SDL]] — The Simple DirectMedia Layer.
* [[OpenGL Utility Library|GLU]] — Papildus funkcijas OpenGL programmām.
* [[OpenGL Easy Extension library|GLee]] — The OpenGL Easy Extension library.
* [[OpenGL Extension Wrangler Library|GLEW]] — The OpenGL Extension Wrangler Library.
* [[OpenGL User Interface Library|GLUI]] — [[darbvirsmas vide]]s rīku kopa, kas veidota ar GLUT.
* [[OpenGL FrameWork|GLFW]] — pārnesama struktūra (portable framework) OpenGL lietotņu izstrādei.
* [[Framebuffer Object]] — bezekrāna (off-screen) renderēšanas paplašinājums.
* [[OpenGL Mathematics|GLM]] — GLSL specifikācijās bāzēta C++ matemātisko rīku kopa priekš OpenGL.

=== Citas grafiskās lietojumprogrammu saskarnes ===
* [[Mesa 3D]] — OpenGL atklātā pirmkoda implementācija.
* [[Direct3D]] — OpenGL konkurents.
* [[VirtualGL]]

== Atsauces ==


== Turpmākā lasāmviela ==
* Richard S. Wright, Benjamin Lipchak, Nicholas Haemel: *OpenGL SuperBible: Comprehensive Tutorial and Reference, 4th Edition*, Addison-Wesley, June 18 2007
* Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis: *OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 2.1, 6th Edition*, Addison-Wesley, July 30 2007
* Fosner, Ron: *OpenGL Programming for Windows 95 and Windows NT*, Addison Wesley
* Mark Kilgard: *OpenGL for the X Window System*, Addison-Wesley
* Eric Lengyel: *The OpenGL Extensions Guide*, Charles River Media
* [[OpenGL Architecture Review Board]], et al: *OpenGL Reference Manual: The Official Reference Document to OpenGL, Version 1.4*, Addison-Wesley
* [[OpenGL Architecture Review Board]], et al: *OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 2, Fifth Edition*, Addison-Wesley
* Rost, Randi J.: *OpenGL Shading Language'', Addison-Wesley

## Ārējās saites
* Latvijas spēļu izstrādātāju kopienas gameZ development network foruma sadaļa par OpenGL
* Indago Gamez pamācība darbā ar OpenGL
* OpenGL resurspunkts 
* Resurspunkts OpenGL spēļu izstrādātājiem 
* OpenGL vispārējais apraksts 
* OpenGL grafiskā bibliotēka (metodisks mācību līdzeklis) 
* OpenGL pamācību no NeHe tulkojums krieviski 
* OpenGL pamācība 
* Ievads iekš OpenGL 
* OpenGL vs. Direct3D 
* OpenGL grafiskā saskarne 
* Oficiālā mājaslapa  
* SGI OpenGL tīmekļa vietne 
* Khronos Group 
* NeHe pamācības, OpenGL pamācības 
* CodeSampler.com, OpenGL koda paraugi 
* myOS — Miniatūra OpenGL izstrādes sistēma & OpenGL demonstrācijas datnes 
* OpenGL vikipēdija 
* Fahrenheit in Microsoft 
* OpenGL programmēšanas rokasgrāmata tīmeklī 
* gDEBugger — OpenGL atkļūdotājs un profilētājs Windows un Linux 
* OpenGL un Glut pamācības 
* Kāpēc OpenGL 3 ir tik nozīmīgs?  
* OpenGL 3.0 rēgs 
* OpenGL pamācības un izstrādes rīki