Hlavní navigace

Grafická knihovna OpenGL (1)

1. 7. 2003
Doba čtení: 5 minut

Sdílet

V této sérii článků popíšeme programovou grafickou knihovnu OpenGL, která dnes na většině platforem představuje standard pro tvorbu 2D a zejména 3D grafických aplikací. Každá vlastnost knihovny OpenGL bude popsána a předvenena na jednoduchém demonstračním programu. Pro tvorbu demonstračních příkladů byl zvolen programovací jazyk C, nicméně zde popsané vlastnosti a příkazy knihovny OpenGL lze použít v téměř jakémkoliv programovacím jazyce. Příklady byly odzkoušeny na platformách Linux/i386, SGI Irix a Windows XP, přičemž byl vždy použit překladač gcc.

Základní informace o OpenGL

Knihovna OpenGLTM[1] [2][3] (Open Graphics Library) byla navržena firmou SGI (Silicon Graphics Inc.) jako aplikační programové rozhraní (Application Programming Interface – API) k akcelerovaným grafickým kartám resp. celým grafickým subsystémům. Předchůdcem této knihovny byla programová knihovna IRIS GL (Silicon Graphics IRIS Graphics Library). OpenGL byla navržena s důrazem na to, aby byla použitelná na různých typech grafických akcelerátorů a aby ji bylo možno použít i v případě, že na určité platformě žádný grafický akcelerátor není nainstalován – v tom případě se použije softwarová simulace. V současné době lze knihovnu OpenGL použít na různých verzích unixových systémů (včetně Linuxu a samozřejmě IRIXu), OS/2 a na platformách Microsoft Windows.

Logo OpenGL a název OpenGLTM je registrovaná známka firmy Silicon Graphics Inc.

Na některých platformách je možné rozdělení aplikace na dvě relativně samostatné části – serverovou a klientskou. Při vykreslování se potom jednotlivé příkazy (což jsou většinou parametry funkcí OpenGL) přenášejí přes síťové rozhraní. Knihovna OpenGL (narozdíl od IRIS GL nebo Direct 3D) byla vytvořena tak, aby byla nezávislá na použitém operačním systému, grafických ovladačích a správcích oken (Window Managers). Proto také neobsahuje žádné funkce pro práci s okny (otevírání, zrušení, změnu velikosti), pro vytváření grafického uživatelského rozhraní (Graphical User Interface – GUI) ani pro zpracování událostí. Tyto funkce lze zajistit buď přímo voláním funkcí příslušného správce oken, nebo lze použít některou z nadstaveb, například již dříve na ROOTovi popsanou knihovnu GLUT [4][5] (OpenGL Utility Toolkit). Pro dosažení co největší nezávislosti na použité platformě zavádí knihovna OpenGL vlastní primitivní datové typy, například GLbyte, GLint nebo GLdouble. Tyto typy a jejich použití budou podrobněji popsány v dalších dílech seriálu.

Programátorské rozhraní knihovny OpenGL je vytvořeno tak, aby knihovna byla použitelná v téměř libovolném programovacím jazyce. Primárně je k dispozici hlavičkový soubor pro jazyky C a C++. V tomto souboru jsou deklarovány nové datové typy používané knihovnou, některé symbolické konstanty (např. GL_POINTS) a sada cca 120 funkcí tvořících vlastní rozhraní. Existují však i podobné soubory s deklaracemi pro další programovací jazyky, například Fortran, Object Pascal či Javu; tyto soubory jsou většinou automaticky vytvářeny z Cčkovských hlavičkových souborů.

Z programátorského hlediska se OpenGL chová jako stavový automat. To znamená, že během zadávání příkazů pro vykreslování lze průběžně měnit vlastnosti vykreslovaných primitiv (barva, průhlednost) nebo celé scény (volba způsobu vykreslování, transformace) a toto nastavení zůstane zachováno do té doby, než ho explicitně změníme. Výhoda tohoto přístupu spočívá především v tom, že funkce pro vykreslování mají menší počet parametrů a že jedním příkazem lze globálně změnit způsob vykreslení celé scény, například volbu drátového zobrazení modelu (wireframe model) nebo zobrazení pomocí vyplněných polygonů (filled model). Vykreslování scény se provádí procedurálně – voláním funkcí OpenGL se vykreslí výsledný rastrový obrázek. Výsledkem volání těchto funkcí je rastrový obrázek uložený v tzv. framebufferu, kde je každému pixelu přiřazena barva, hloubka, alfa složka popř. i další atributy. Z framebufferu lze získat pouze barevnou informaci a tu je možné následně zobrazit na obrazovce – viz následující obrázek.

Jakým způsobem OpenGL vykresluje


OpenGL nezaručuje, že při spuštění identického programu používajícího knihovnu OpenGL na různých platformách nebo různých grafických akcelerátorech dostaneme vždy přesně stejný výsledek. Pokud bychom oba výsledné rastrové obrázky porovnali pixel po pixelu, mohli bychom zjistit mírné rozdíly v barvách. Může to být způsobeno například odlišnou přesností reprezentace čísel na grafické kartě, odlišnými algoritmy pro interpolaci barvy, normály a texturových souřadnic nebo jinou bitovou hloubkou Z-bufferu. Celkové geometrické a barevné podání scény by však mělo být zachováno.

Pomocí funkcí poskytovaných knihovnou OpenGL lze vykreslovat obrazce a tělesa složená ze základních geometrických prvků, které nazýváme grafická primitiva. Mezi tato primitiva patří bod, úsečka, trojúhelník, čtyřúhelník, plošný konvexní polygon, bitmapa (jednobarevný rastrový obraz) a pixmapa (barevný rastrový obraz). Existují i funkce, které podporují proudové vykreslování některých primitiv – lze například vykreslit polyčáru (line loop), pruh trojúhelníků (triangle strip), pruh čtyřúhelníků (quad strip) nebo trs trojúhelníků (triangle fan). Na vrcholy tvořící jednotlivá grafická primitiva lze aplikovat různé transformace (otočení, změna měřítka, posun, perspektivní projekce), pomocí kterých lze poměrně jednoduše vytvořit animace. Vykreslovaná primitiva mohou být osvětlena nebo pokryta texturou. Dále je možné celou vykreslovanou scénu „skrýt“ v mlze.

Z hlediska datové reprezentace vykreslované scény poskytují funkce OpenGL, podobně jako Direct 3D Immediate Mode, pouze základní rozhraní pro přístup ke grafickým akcelerátorům. Existují však rozšiřující knihovny, které funkcionalitu dále zvyšují. Jednou ze základních knihoven používaných společně s OpenGL je knihovna GLU (OpenGL Utilities), která umožňuje využívat tesselátory (rozložení nekonvexních polygonů na trojúhelníky),e­valuátory (výpočet souřadnic bodů ležících na parametrických plochách) a vykreslovat kvadriky (koule, válce, kužely a disky). Další nadstavbovou knihovnou je Open Inventor, pomocí kterého lze konstruovat celé scény složené z hierarchicky navázaných objektů. V porovnání s Direct 3D Retained Mode, kde se také pracuje s hierarchií scény, je však Open Inventor knihovna mnohem mocnější a přitom má poměrně jednoduché rozhraní.

V dalším dílu tohoto seriálu si popíšeme syntaxi funkcí deklarovaných v OpenGL a uvedeme si příklad na vykreslení jednoduchého obrazce.

Reference

[1] Silicon Graphics: "OpenGLTM Reference Manual ",
Silicon Graphics, Inc., 1994. 

[2] Segal M., Akeley K.: „The OpenGLTM Graphics System: A Specification (Version 1.2.1)“,
Silicon Graphics, Inc., 1999. 

[3] Wright R. S.: „OpenGL SuperBible “,
Waite Group Press, 1999.

[4] Kilgard, Mark J.: „The OpenGL Utility Toolkit (GLUT) Programming Interface, API Version 3“,
Silicon Graphics, Inc., November 13, 1996. 

[5] Kolektiv autorů: „GLUT Page
www.opengl.or­g/developers/do­cumentation/glut­.html

[6] Neider Jackie, Davis Tom, Woo Mason and Shreiner David: „Open GLTM Programming Guide: The official guide to learning OpenGL (Third Edition)“,
Addison-Wesley Publishing Company, Silicon Graphics, Inc., ISBN 0–201–60458–2, 1999. 

[7] Hill, F. S. jr.: „Computer Graphics using Open GL “,
Prentice Hall, 2001. 

bitcoin_skoleni

[8] Kolektiv autorů: "Světový portál stránek o grafické knihovně OpenGLTM "
www.opengl.org

[9] Kolektiv autorů: "Český portál stránek o grafické knihovně OpenGLTM "
www.opengl.cz

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.