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 (Integrated Raster Imaging System Graphic Library) sa stalo de facto priemyselným štandardom napriek existencii otvoreného štandardu PHIGS (Programmer's Hierarchical Interactive Graphic System), 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.
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 (OpenGLShading Language).
V roku 1995 vydal Microsoft svoju prvú verziu API Direct3D, ktorá sa stáva hlavným konkurentom OpenGL. Dňa December 17, 1997[2]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[3]. 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, 2006ARB oznámilo, že voľbou presúvajú kontrolu nad špecifikáciou OpenGL konzorciu Khronos Group a to dňa September 21, 2006 kontrolu prevzalo[4]. Skupina v rámci konzorcia, ktorá sa mala venovať štandardu OpenGL, bola z historických dôvodov pomenovaná OpenGL ARB Working Group[5]. Jedným z hlavných cieľov nového konzorcia bolo zabezpečenie koordinovaného vývoja štandardov OpenGL a OpenGL ES (OpenGL for Embedded Systems).
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.
Programovanie v OpenGL
Práca v OpenGL je pomerne jednoduchá. Vyššie programovacie jazyky (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.
glClear(GL_COLOR_BUFFER_BITorGL_DEPTH_BUFFER_BIT);// Vymazanie zásobníka zobrazenia a hĺbkového zásobníka
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.
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.
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.
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
varTextureImage:array[0..0]ofPTAUX_RGBImageRec;TextureImage:GLuint;beginTextureImage:=LoadBMP(auxDIBImageLoadA(FileName));// Načítanie textúry zo súboru FileNameglGenTextures(1,TextureImage);// Generuje textúruglBindTexture(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.
procedureTFormOpenGL.Kreslit(varMsg:TWMPaint);// Procedúra prekresleniavarqObj:GLUquadricObj;// premenná pre nový grafický objektbeginglClear(GL_COLOR_BUFFER_BITorGL_DEPTH_BUFFER_BIT);// zmazanie príslušných zásobníkovglMatrixMode(GL_MODELVIEW);// model rozmiestnenia objektovglLoadIdentity;// reštartne pozíciu v grafickej maticiglBindTexture(GL_TEXTURE_2D,TextureList.GetTextureID(0));//výber textúryglColor3f(1.0,1.0,1.0);// nastavenie fariebglTranslatef(2.5,0.0,-6);// posun vykreslovaniea na novú pozíciuglRotatef(rotaciaGula,0,-1,0);// rotácia o vybraný uholglRotatef(270,1,0,0);// rotácia o vybraný uholqobj:=gluNewQuadric();// založenie nového telesagluQuadricTexture(qobj,true);// povolí textúrovanie pre vybrané teleso s poslednou textúrougluSphere(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
Projekt Wikiknihy ponúka knihu v angličtine na tému:
↑Licencia pre používanie API a loga OpenGL [online]. . Dostupné online.
↑Článok o podpísaní dohody Fahrenheit (www.windowsitpro.com) [online]. . Dostupné online.
↑Článok o pripojení sa Hewlett-Packard k projektu Fahrenheit [online]. . Dostupné online. Archivované 2012-05-30 z originálu.
↑Oznam o presune kompetencií na Khronos Group (The OpenGL Pipeline Newsletter) [online]. [Cit. 2007-06-21]. Dostupné online. Archivované 2007-07-03 z originálu.
↑Oznam o vytvorení podskupiny v rámci Khronos Group, ktorá sa má venovať štandardu OpenGL [online]. [Cit. 2007-06-21]. Dostupné online. Archivované 2011-11-24 z originálu.