OpenGL

**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:ää.

```c
#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

## Kirjallisuutta
* 

## Aiheesta muualla

* OpenGL Registry, rajapinnan, GLSL-kielen ja laajennuksien määrittelyt 
* The OpenGL WebPage
* The SGI OpenGL Page
* DelphiGL, Delphin OpenGL-yhteisö.
* Delphi3D  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) 
* GLFW (GL FrameWork) 
* SDL (Simple Direct Media Layer)