OpenGL

**OpenGL** (*Open Graphics Library*) er en API-spesifikasjon for utvikling av 2D- og 3D-datagrafikk. Formålet med OpenGL er, i likhet med Direct3D, å skjule kompleksiteten ved å kommunisere med ulike skjermkort. OpenGL er plattformuavhengig og fungerer på blant annet Apple Macintosh, Linux, Solaris, Windows og PlayStation.

OpenGL ble skapt av Silicon Graphics i 1992, står for Open Graphics Library, og er basert på et eldre grafikkbibliotek ved navn IRIS GL, laget av det samme selskapet. OpenGL er ikke en implementasjon, men en spesifikasjon, det vil si at OpenGL i seg selv, kun er en oppskrift på hvordan man skal lage et grafikk-API, uten vekt på om det skal være nødvendig med hardware akselerasjon, eller om det skal kjøre på ren software. I tillegg skal det være like egnet til 2D-grafikk, som 3D-grafikk, selv om dette ikke er tilfellet i praksis da OpenGL sjeldent blir brukt til ren 2D-grafikk.

## OpenGL i Windows
I Windows er OpenGL 1.1 implementert i software. Det vil si at hvis OpenGL hardware ikke er tilgjengelig, vil OpenGL kun bruke prosessoren til å tegne grafikk og kun OpenGL 1.1-funksjoner vil være tilgjengelig. Gjennom kompatibel maskinvare og drivere støttes opp til OpenGL 4.6 på Windows 7 og nyere. For eksempel, Intels Windows-drivere for Haswell-baserte grafikkort støtter versjoner opp til 4.3, mens Skylake-baserte støtter 4.6.

## OpenGL-utvidelser
OpenGL bruker et utvidelsessystem kalt extensions. Dette gjør at OpenGL lett kan utvides med funksjoner som implementasjonen støtter, uten at brukeren trenger å oppgradere OpenGL. OpenGL-utvidelser begynner med bokstavene GL, deretter fulgt av en understrek, og koden til utvikleren. For Nvidia er dette NV, for AMD er det AMD, og for Architecture Review Board, ARB. Generelt støttede utvidelser får navnet EXT.
Et eksempel på dette kan være utvidelsen
`GL_EXT_TEXTURE_3D`
Denne utvidelsen muliggjør teksturer med tre dimensjoner.
Utvidelser hentes på forskjellig måte i forskjellig operativsystemer. I Windows bruker man en funksjon ved nanv wglGetProcAddress som henter en peker til en funksjon gitt ved navn, for eksempel
`GLTEXIMAGE3DEXTPROC glTexImage3D = (GLTEXIMAGE3DEXTPROC)wglGetProcAddress("glTexImage3DEXT");`
Først må man sjekke om utvidelsen er støttet. Den eneste måten å gjøre det på, er å hente ut en streng med tekst som inneholder alle støttede utvidelser, adskilt med mellomrom ved hjelp av glGetString-funksjonen.
`char* supported_ext = glGetString(GL_EXTENSIONS);`
Deretter må man lete etter utvidelsen i denne teksten.

## OpenGL i bruk
OpenGL ble før mye brukt til CAD-programmer, spill og lignende. Dette gjelder også den dag i dag, selv om Direct3D har tatt over stadig mer av markedet. OpenGL er strengt prosedyrebasert, men en halvveis objektorientert form (gjennom vanlige prosedyrer) har blitt mer vanlig i det siste, blant annet med GL_ARB_shader_objects-utvidelsen som kom i OpenGL 1.5. OpenGL er et API som er forholdsvis lett å lære seg, men siden det er veldig grunnleggende krever det mye jobb for å lage en effektiv grafikkmotor. I motsetning til OpenGL, er Direct3D objektorientert, og alle klasser man trenger følger med. 

OpenGL krever at brukeren har tilgang til pekere, noe som kan gjøre bruken av teksturer eller Vertex Array utfordrende i enkelte språk, dog sjelden umulig. Fordelen med OpenGLs funksjon, er at alt den går ut ifra at implementasjonen er skrevet i C, som er støttet av nær sagt alle eksterne språk. Dette har gjort at såkalte wrappers, eller implementeringer av OpenGL, har skjedd i nærmest alle språk, i motsetning til Direct3D, som krever at programmet skrives enten i C++, eller et av .NET-språkene ved bruk av Managed DirectX.

## Versjoner
;OpenGL 1.x
Den første versjonen 1.0 ble lansert i januar 1992. OpenGL 1.1 ble offentliggjort 4. mars 1997. Siste utgave av 1-serien var 1.5 og ble utgitt den 29. juli 2003.

;OpenGL 2.x
OpenGL 2.0 ble gjort offentlig den 7. september 2004 og innførte OpenGL Shading Language (GLSL). Siste versjon i serien var 2.1 fra juli 2006.

;OpenGL 3.x
OpenGL 3.0 ble annonsert den 9. september 2007 og var ganske omstridt, siden den gjorde fundamentale endringer til hvordan arkitekturen fungerte. Den 30. oktober kunngjorde Khronos-gruppen at lanseringen var utsatt og den ble endelig lansert den 11. august 2008. Siste versjon var 3.3 fra 11. mars 2010 og hadde som mål å beholde så mye 4.0 funksjonalitet som mulig, samtidig til å beholde kompatibilitet for eldre hardware.

;OpenGL 4.x
OpenGL 4.0 ble offentlig den 11. mars 2011. Spesifikasjonen er designet for maskinvare som støtter Direct3D 11 og eksponerer funksjoner som tessellering. Den støttes av Nvidia GeForce 400-serien og nyere, og av AMD Radeon HD 5000-serien og nyere. I tillegg er versjon 4.1 den siste som er støttet på macOS.

Siste utgave er versjon 4.6, som ble lansert i juli 2017 og inneholder blant annet støtte for SPIR-V og performance forbedringer. Den støtter grafikkortene i Nvidia GeForce 400-serien og nyere, samt Tegra K1 og Tegra X1 fra samme produsent, AMD Radeon HD 7000-serien og nyere og Intel Skylake.

## Vulkan

Vulkan (tidligere kodenavn glNext) er etterfølgeren av OpenGL og et initiativ for å gjenforene OpenGL- og OpenGL ES-spesifikasjonene med et felles programmeringsgrensesnitt, samtidig til å skape en mer low-level API mer i tråd med DirectX 12 og Metal. Den første versjonen ble lansert den 16. februar 2016. Vulkan er ikke bakoverkompatibel med OpenGL.

## Referanser


## Eksterne lenker
*