**OpenGL** (**Open** **G**raphics **L**ibrary) on laitteistoriippumaton ohjelmointirajapinta interaktiivisen tietokonegrafiikan tuottamiseen. Se koostuu muutamasta sadasta funktiosta, joita voidaan käyttää monimutkaisten kolmiulotteisten mallien tai yksinkertaisten muotojen piirtämiseen. OpenGL on yleinen tietokoneavusteisessa suunnittelussa (CAD) ja muissa visualisoinneissa. OpenGL on myös käytössä videopeliteollisuudessa, jossa se kilpailee Microsoftin Direct3D:n kanssa.

OpenGL on tilakone joka koostuu asiakkaasta (client) ja palvelimesta (server). Asiakas on rakennettu CPU:lla ajettavaan OpenGL-rajapintaan ja palvelin tarkoittaa näytönohjaimen ajurin ohjaamia GPU:n varsinaisia suoritusyksiköitä. Käyttöjärjestelmän OpenGL-pino voi olla näytönohjaimen valmistajan tarjoama (kuten Windowsissa), erillinen komponentti (esimerkiksi Mesa 3D Linuxissa) tai osa käyttöjärjestelmää (OS X).

OpenGL on pelkkä grafiikkakirjasto, eli siltä puuttuu kokonaan esimerkiksi kyky lukea käyttäjän syötettä, hallita ikkunoita, ladata kuvaformaatteja, jne. Näiden asioiden hoitamiseen on tehty useita erillisiä rajapintoja. Näitä ovat mm. GLUT, GLFW, SDL, GLM ja SFML.

Historia
--------

Silicon Graphics kehitti ja julkaisi OpenGL:n version 1.0 tammikuussa vuonna 1992 IRIS GL:n korvaajaksi. Tehokkaimmat laitteistotason OpenGL-toteutukset löytyivätkin pitkään SGI:n omista grafiikkatyöasemista. Myöhemmin 3Dlabs vaikutti merkittävästi OpenGL 2.0:aan (2004), joka toi kirjastoon mahdollisuuden käyttää shader-ohjelmia, joihin moderni grafiikkaohjelmointi laajalti perustuu (alkeellinen shader-tuki oli olemassa jo OpenGL 1.4:ssä laajennusten kautta). Syyskuussa 2006 OpenGL:n päävastuu siirtyi SGI:ltä Khronos Groupin alaisuuteen.

OpenGL:ää on pidetty hyvin suunniteltuna ja se on pysynyt pitkiä aikoja samanlaisena. Suurimmat muutokset ovat olleet 2.0:n tuoma uusi lähestymistapa ja 3.x-versioissa vanhojen toiminnallisuuksien karsiminen (deprekointi). OpenGL 4.5 julkaistiin 11. elokuuta 2014.
OpenGL 4.6 julkaistiin heinäkuussa 2017 ja sisälsi SPIR-V-tuen.
Uusien grafiikkakorttien ominaisuuksiin, joita ei vielä ole sisällytetty OpenGL:ään, pääsee käsiksi OpenGL:n laitteistokohtaisilla laajennuksilla (extensions). Niitä käyttämällä laitteistoriippumattomuus kuitenkin menetetään.

Apple on merkinnyt OpenGL ja OpenCL tuen vanhentuneeksi macOS Mojave- ja iOS 12-versioista lähtien tavoitteena siirtää ohjelmointi Applen omalle Metal-rajapinnalle. Mesa 3D:n Zink-kerroksen avulla OpenGL on mahdollinen Vulkan-rajapinnan päällä. Vulkan-tuki on mahdollinen macOS:llä MoltenVK-kirjaston avulla.

Varjostimet
-----------

Varjostimet ovat näytönohjaimessa ajettavia ohjelmia jotka mahdollistavat grafiikan manipuloinnin erittäin korkealla suorituskyvyllä. Varjostimia ajetaan useita rinnakkain ja niille voidaan kuljettaa erilaisia parametreja pääohjelmasta. Kulmapistevarjostin muokkaa kulmapisteitä halutuilla laskutoimituksilla ja pikselivarjostin muokkaa rasteroidun pikselin arvoa. OpenGL sisältää OpenGL Shading Language (GLSL) -kielen, joka syntaksiltaan muistuttaa C-ohjelmointikieltä, joskin yksinkertaisempana. Varjostimet kääntyvät "lennossa" OpenGL-ajurilla silloin, kun ne halutaan ottaa käyttöön.

OpenGL ES
---------

OpenGL ES (Embedded Systems) on sulautetuille järjestelmille räätälöity pelkistetty toteutus OpenGL:stä. Se mahdollistaa yksinkertaisemman näytönohjainpiirin suunnittelun, joka auttaa pienentämään virrankulutusta ja vähentämään laitteen hintaa. OpenGL ES:ää käytetään esimerkiksi älypuhelimissa, tableteissa, kannettavissa pelikoneissa ja monissa muissa kohteissa jossa täysveristä OpenGL-toteutusta ei tarvita. OpenGL ES:lle kirjoitettu koodi on yhteensopivaa tavallisen OpenGL:n kanssa.

OpenGL SC
---------

OpenGL SC (Safety Critical) on turvakriittisiin järjestelmiin suunnattu versio, joka pohjautuu OpenGL ES:ään. SC-versio sertifioi osan OpenGL ES:stä käytettäväksi DO178-B (ilmailu), ISO-26262 (autoteollisuus) ja ISO 61508 (teollisuusautomaatio) -standardoiduissa kohteissa. SC-versiosta on poistettu ES-version toimintoja, jotka eivät ole yhteensopivia deterministisien turvakriittisten järjestelmien tarpeiden kanssa.
Vulkan SC on Vulkaniin perustuva seuraaja.

Esimerkki
---------

OpenGL-esimerkki, joka piirtää polygonin näytölle. Huomaa, että ikkunointijärjestelmän käyttö on GLUT-kirjastoa apuna käyttäen eikä osa OpenGL:ää.

```
#include <GL/glut.h>
#include <stdlib.h>

/\* alustustoimintoja \*/
void init(void)
{
 glClearColor(0.0, 0.0, 0.0, 0.0); /\* tyhjennysväri (taustaväri) \*/
 glMatrixMode(GL\_PROJECTION);
 glLoadIdentity();
 glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

/\* piirtää valkoisen neliön \*/
void display(void)
{
 glClear(GL\_COLOR\_BUFFER\_BIT);
 glColor3f(1.0, 1.0, 1.0);
 glBegin(GL\_POLYGON);
 glVertex3f(0.25, 0.25, 0.0);
 glVertex3f(0.75, 0.25, 0.0);
 glVertex3f(0.75, 0.75, 0.0);
 glVertex3f(0.25, 0.75, 0.0);
 glEnd();
 glFlush();
}

int main(int argc, char \*\*argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT\_SINGLE | GLUT\_RGB);
 glutInitWindowSize(250, 250);
 glutInitWindowPosition(100, 100);
 glutCreateWindow("hello");
 init();
 glutDisplayFunc(display);
 glutMainLoop();
 return 0;
}

```

Katso myös
----------

* Metal
* Vulkan

Lähteet
-------

1. 1 2  Graham Singer: The History of the Modern Graphics Processor  27.3.2013. Techspot. Viitattu 8.6.2018.
2. ↑ . Tieto on haettu Wikidatasta.
3. ↑  What's New in OpenGL 4.5 *opengl.org*.  11.8.2014. OpenGL.  Arkistoitu 1.7.2017. Viitattu 17.2.2015. (englanniksi)
4. ↑  Khronos Releases OpenGL 4.6 with SPIR-V Support *khronos.org*.  31.7.2017. Viitattu 2.12.2020. (englanniksi)
5. ↑  The end of OpenGL support, plus other updates Apple didn’t share at the keynote *arstechnica.com*.  6.6.2018. Viitattu 2.12.2020. (englanniksi)
6. ↑  Zink seeing macOS support for OpenGL on Vulkan then MoltenVK on metal – Phoronix *oltnews.com*.  2020. Viitattu 2.12.2020. (englanniksi)
7. ↑  Vulkan is coming to macOS and iOS, but no thanks to Apple  26.2.2018. Ars Technica. Viitattu 27.2.2018.
8. 1 2  OpenGL SC (PDF)  19.4.2016. Khronos. Viitattu 14.8.2018.
9. ↑  OpenGL SC (PDF) *kdab.com*. Viitattu 14.8.2018.
10. ↑  Vulkan SC Overview *khronos.org*. Viitattu 2.12.2020. (englanniksi)
11. ↑  Woo, Mason & Neider, Jackie & Davis, Tom & Shreiner, Dave: *OpenGL Programming Guide*, s. 18–19. Third Edition. Addison-Wesley, 1999. ISBN 0201604582.

Kirjallisuutta
--------------

* Woo, Mason & Neider, Jackie & Davis, Tom & Shreiner, Dave: *OpenGL Programming Guide*. Third Edition. Addison-Wesley, 1999. ISBN 0201604582. (englanniksi)

Aiheesta muualla
----------------

CommonsCommons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta **OpenGL**.
* OpenGL Registry, rajapinnan, GLSL-kielen ja laajennuksien määrittelyt (englanniksi)
* The OpenGL WebPage
* The SGI OpenGL Page
* DelphiGL[vanhentunut linkki], Delphin OpenGL-yhteisö.
* Delphi3D (Arkistoitu – Internet Archive) Nopeaa OpenGL-kehittämistä.
* Basic4GL, helppo ohjelmointikieli OpenGL:n harjoitteluun (Windowsille)
* GLScene
* OpenGL & FreePascal Ohjeita OpenGL:n käytöstä Free Pascalin kanssa.
* GLScene for Lazarus
* GLUT (Graphics Library Utility Toolkit) (Arkistoitu – Internet Archive)
* GLFW (GL FrameWork)
* SDL (Simple Direct Media Layer)