OpenGL

**OpenGL** (*Open Graphics Library*) je priemyselný štandard špecifikujúci viacplatformové rozhranie (API) k akcelerovaným grafickým kartám respektíve celým grafickým subsystémom. Slúži na tvorbu aplikácií pracujúcich predovšetkým s trojrozmernou počítačovou grafikou prekresľovanou v reálnom čase. Používa sa pri tvorbe počítačových hier, CAD programov, aplikácií virtuálnej reality alebo pre vedecko-technické vizualizácie.

## História
V osemdesiatych rokoch dvadsiateho storočia sa objavujú prvé priemyselne vyrábané grafické adaptéry pre osobné počítače s podporou grafických režimov. Vývojári grafického softvéru boli nútení písať pre každý typ zariadenia osobitné rozhranie a ovládače. Pri rozvíjajúcom sa trhu s grafickými kartami bolo čoraz ťažšie zabezpečiť, aby softvér korektne pracoval na ľubovoľnej dostupnej konfigurácii počítača. Preto vznikajú viaceré štandardy, ktoré majú zabezpečiť približne rovnaký grafický výstup pri volaní rovnakých programových rutín na rôznych hardvérových prípadne softvérových konfiguráciách.

Na začiatku deväťdesiatych rokov bola firma **Silicon Graphics Inc.** (**SGI**) lídrom na trhu s pracovnými stanicami s podporou trojrozmernej grafiky. Ich API IRIS GL (***I'''ntegrated '''R'''aster '''I'''maging '''S'''ystem '''G'''raphic '''L'''ibrary'') sa stalo de facto priemyselným štandardom napriek existencii otvoreného štandardu [[PHIGS]] (***P**rogrammer's **H**ierarchical **I**nteractive **G**raphic **S**ystem''), ktorý bol považovaný za ťažšie implementovateľný a pomalší pri prekresľovaní v reálnom čase.

S príchodom prvých grafických kariet s 3D akceleráciou sa ''SGI'' rozhodla konkurovať otvoreným štandardom. Otvorenie špecifikácie [[IRIS GL]] nebolo možné kvôli licenčnej a patentovej zaviazanosti. ''Silicon Graphics'' sa rozhodli vyvinúť nový štandard odvodením od staršieho rozhrania knižnice ''IRIS GL''. Hlavným rozdielom bolo vyriešenie obmedzenia ''IRIS GL'', keď aplikácia mohla využívať len programové rutiny priamo podporované hardvérom. Nové riešenie umožňovalo riešiť prípadnú hardvérovú nekompatibilitu softvérovou emuláciou.

Autormi novej špecifikácie boli [[Mark Segal]] a [[Kurt Akeley]] a ako ''OpenGL'' ho v roku [[1992]] revidovalo konzorcium [[OpenGL Architecture Review Board]] (**ARB**). Jej členmi v tom období boli [[3Dlabs]], [[Apple Computers]], [[ATI]], [[Dell]], [[IBM]], [[Intel]], [[Microsoft]], [[nVidia]], [[SGI]] a [[Sun Microsystems]]. V roku [[1993]] ''Microsoft'' projekt opustil.

[[September 7]], [[2004]] sa najmä spoločnosť [[3Dlabs]] zaslúžila o vydanie novej verzie štandardu ''OpenGL 2.0''. Tá vo svojej špecifikácii obsahuje podporu pre [[GLSL]] (''Open**GL** **S**hading **L**anguage'').

V roku [[1995]] vydal ''Microsoft'' svoju prvú verziu API [[Direct3D]], ktorá sa stáva hlavným konkurentom ''OpenGL''. Dňa [[December 17]], [[1997]] ''Microsoft'' a ''SGI'' prijali projekt [[Fahrenheit]], ktorého hlavným cieľom bolo zjednotenie rozhraní ''OpenGL'' a ''Direct3D''. V roku [[1998]] sa k projektu pridáva spoločnosť [[Hewlett-Packard]]. Napriek sľubnej iniciatíve projekt stroskotal na finančných obmedzeniach ''Silicon Graphics'' a nedostatočného záujmu zo strany výrobcov hardvéru.

Medzitým [[June 31]], [[2006]] ''ARB'' oznámilo, že voľbou presúvajú kontrolu nad špecifikáciou ''OpenGL'' konzorciu [[Khronos Group]] a to dňa [[September 21]], [[2006]] kontrolu prevzalo. Skupina v rámci konzorcia, ktorá sa mala venovať štandardu ''OpenGL'', bola z historických dôvodov pomenovaná [[OpenGL ARB Working Group]]. Jedným z hlavných cieľov nového konzorcia bolo zabezpečenie koordinovaného vývoja štandardov ''OpenGL'' a [[OpenGL ES]] (***OpenGL*' for **E**mbedded **S**ystems*).

V Auguste 2008 bola vydaná verzia 3.0, ktorá priniesla mechanizmus na vyradenie niektorých funkcií z špecifikácie. Označené na vyradenie boli všetky funkcie spojené s fixnou funkčnosťou (vrátanie funkcií maticových transformácií). Vo verzii 3.1 vydanej v Marci 2009 boli tieto funkcie odstránené, avšak je stále možné k nim pristupovať ak je kontext vytvorený v režime kompatibility. Vo verzii 3.2 z Augusta 2009 pribudol nový druh shaderu - *geometry shader*, ktorý umožňuje vytvárať nové vrcholy na grafickej karte, zatiaľ čo dovtedy bolo možné vrcholy len upravovať.

V Marci 2010 Khronos vydal OpenGL 4.0, ktorej hlavným prínosom boli ďalšie dva programovateľné shadere, umožňujúce teseláciu na grafickej karte.

[[Obrázok:Pipeline OpenGL.svg|right|thumb|Grafický pipeline diagram]]

== Programovanie v OpenGL ==

Práca v *'OpenGL*' je pomerne jednoduchá. Vyššie [[Programovací jazyk|programovacie jazyky]] ([[Delphi (Embarcadero)|Delphi]], [[C++]]) majú vytvorené špeciálne knižnice, ktoré umožňujú jednoduchý prístup k API funkciám pre OpenGL a navyše poskytujú aj určitú nadstavbu. Niektoré sú dostupné hneď po inštalácii vývojového prostredia, iné sú dostupné na internete.

=== Základné príkazy ===
Všetky príklady sú zapísané v jazyku [[Delphi]]. [[Syntax]] iných jazykov pre uvádzané príkazy je identická, alebo podobná.
Prvý príklad naznačuje ako vyprázdniť obsah grafických zásobníkov.
<source lang="delphi">
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Vymazanie zásobníka zobrazenia a hĺbkového zásobníka
</source>

Nasledujúce príklady nie sú kompatibilné s *core'' profilom pre OpenGL verzie 3.1 a vyššie!

Príkaz umožní nazeranie na trojrozmerný priestor pomocou projekcie.

```delphi
glMatrixMode( GL_PROJECTION ); 	// Definuje spôsob nazerania na vykreslované objekty.
```


Ďalšie príkazy sú používané často pred umiestnením nových objektov do trojrozmerného priestoru.

```delphi
glLoadIdentity();		// Reštartne pozíciu v grafickej matici.
glTranslatef(0.0, -1.0, -5.0);	// Príkaz nastaví pozíciu pre vykreslenie v priestore.
				// Pozícia je uvádzaná v poradí pre os X,Y,Z.
```


Obľúbená je funkcia, ktorá umožní rotáciu objektu. Rotácia môže prebiehať v ľubobolnom smere a o ľubovolný uhol.

```delphi
glRotatef(12 ,0,-1,0);	// Prvá hodnota uvádza aktuálny uhol pre zobrazenie.
				// Ďalej sú hodnoty pre pootočenie na vybranej osi.
```


### Mapovanie textúr
Skôr ako je textúra zobrazená je potrebné ju uložiť do pamäti. Ľahko to dosiahneme kombináciou príkazov


```delphi
var 
  TextureImage: array [0..0] of PTAUX_RGBImageRec;
  TextureImage: GLuint;
begin
  TextureImage := LoadBMP(auxDIBImageLoadA(FileName));            // Načítanie textúry zo súboru FileName
  glGenTextures(1, TextureImage);                                 // Generuje textúru
  glBindTexture(GL_TEXTURE_2D,TextureImage);                      // Vytvorenie textúry z bitmapy.     
  glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage.sizeX,TextureImage.sizeY,0,
               GL_RGB,GL_UNSIGNED_BYTE,TextureImage.data);     
  // Nastavenie parametrov textúry.
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Filtrovanie textúry pri zväčšení
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Filtrovanie textúry pri zmenšení
```


### Ilustračný príklad
Za animáciou je ilustračný príklad rotácie telesa okolo osi y. Podobný príklad je možné nasimulovať s využitím príkazov v prostredí Delphi.

thumb|Animácia znázorňuje výsledok príkladu rotácie telesa s textúrou


```delphi
procedure TFormOpenGL.Kreslit(var Msg: TWMPaint); // Procedúra prekreslenia
var
  qObj: GLUquadricObj; 
  // premenná pre nový grafický objekt
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
  // zmazanie príslušných zásobníkov
  glMatrixMode( GL_MODELVIEW  ); 
  // model rozmiestnenia objektov
  glLoadIdentity; // reštartne pozíciu v grafickej matici

  glBindTexture(GL_TEXTURE_2D, TextureList.GetTextureID(0)); 
  //výber textúry
  glColor3f(1.0, 1.0, 1.0);        // nastavenie farieb
  glTranslatef(2.5,0.0,-6);        
  // posun vykreslovaniea na novú pozíciu
  glRotatef(rotaciaGula,0,-1,0);   // rotácia o vybraný uhol
  glRotatef(270,1,0,0);            // rotácia o vybraný uhol
  qobj := gluNewQuadric();         // založenie nového telesa
  gluQuadricTexture(qobj, true);  
  // povolí textúrovanie pre vybrané teleso s poslednou textúrou
  gluSphere(qobj, 1.5, 40, 40);    
  // zobrazí guľu s polomerom 1.5 a presnosťou zobrazenia 40.
  rotaciaGula:= rotaciaGula -0.5;  
  // Pri prekreslovaní sa premenná rotaciaGula musí meniť, aby
  // vznikol efekt rotácie telesa. 
  // Je zadefinovaná ako globálna premenná
end;
```


## Pozri aj

### Podporné knižnice pre OpenGL
* GLU - OpenGL Utility Library
* GLUT - OpenGL Utility Toolkit
* GLFW - knižnica pre vytváranie OpenGL kontextu a spracovanie vstupov
* GLEW - OpenGL Extension Wrangler Library
* GLM - OpenGL Mathematics obsahuje funkcie pre prácu s maticami, ktoré boli vyradené od OpenGL 3.x, a mnohé ďalšie

### .Net wrappery pre OpenGL
* OpenTK - Open Toolkit
* Tao - TaoFramework

### Ďalšie API pre trojrozmernú grafiku
* Direct3D - časť rozhrania DirectX od spoločnosti Microsoft
* Mesa 3D - grafická knižnica vyvíjaná ako slobodný softvér

## Referencie

## Iné projekty

## Externé odkazy
* www.opengl.org - oficiálna stránka OpenGL 
* SGI OpenGL stránka - stránka vývojára štandardu 
* nehe.ceske-hry.cz - stránka s množstvom manuálov 
* www.sulaco.co.za - stránka s množstvom príkladov pre Delphi