OpenGL a nadstavbová knihovna GLU

27. 7. 2004
Doba čtení: 8 minut

Sdílet

Na Rootu dnešním dnem začíná nový seriál o věnovaný knihovně GLU, která představuje aplikační nadstavbu nad grafickou knihovnou OpenGL. Jsou v ní implementovány zejména pokročilejší algoritmy, které při své práci volají funkce OpenGL. Pomocí funkcí dostupných z knihovny GLU se může značně zjednodušit velká část aplikací, které využívají možnosti knihovny OpenGL s tím, že veškeré algoritmy jsou odzkoušeny mnoha lety svého nasazení ve stovkách stávajících aplikací.

Obsah

1. Význam knihovny GLU
2. Vztah knihoven OpenGL a GLU
3. Analogie OpenGL a jejích nadstaveb s programovacími jazyky
4. Součásti knihovny GLU
5. Literatura
6. Odkazy na další zdroje na Internetu
7. Obsah dalšího pokračování
8. Zkomprimovaná verze článku i s obrázky
 

1. Význam knihovny GLU

Grafická knihovna OpenGL, kterou jsme si na Rootu podrobně popsali ve třech seriálech, obsahuje pouze základní sadu jednoduchých kreslících operací. Tato sada operací je sice pro vytváření obrazů dvourozměrných i trojrozměrných scén úplná (alespoň co se týče hraniční reprezentace těles), ale jedná se převážně o základní funkce, které mají v některých případech malou vyjadřovací sílu. Jedinou výjimkou jsou funkce umožňující práci s display-listy, které lze považovat za analogii maker či bezparametrických funkcí známých z některých vyšších programovacích jazyků.

Pokud budeme s pomocí grafické knihovny OpenGL vytvářet aplikace pracující s dvojrozměrnou či trojrozměrnou grafikou, brzy zjistíme, že v této knihovně citelně chybí zejména následující skupiny funkcí:

  • práce s hierarchickým modelem scény
  • funkce pro načítání a ukládání scény do externích souborů
  • funkce pro výpočet transformací i inverzních (zpětných) transformací bodů a vektorů s použitím transformačních matic OpenGL
  • funkce pro vytváření a vykreslování základních geometrických těles, zejména kvadrik (koulí, kuželů, válců, disků)
  • podpora pro vykreslování jednotlivých znaků nebo celých řetězců
  • práce s parametrickými křivkami a plochami mimo Bézierovy křivky a plochy (ty jsou podporovány pomocí evaluátorů)
  • funkce pro rozdělení složitých (i nekonvexních) polygonů na trojúhelníky
  • pokročilejší operace s bitmapami a pixmapami pro účely texturování
  • funkce pro načítání a ukládání bitmap a pixmap do externích souborů
  • podpora grafického uživatelského rozhraní (GUI)
  • podpora pro přehrávání videa buď přímo v okně aplikace, nebo pomocí překryvných oblastí – takzvaných overlayů

Některé z výše jmenovaných funkcí (například alespoň základní podporu pro grafické uživatelské rozhraní nebo funkce pro práci s písmy a kvadrikami) můžeme najít v již dříve popsané knihovně GLUT (viz odkazy na konci článku), některé jsou součástí zde popisované knihovny GLU, většina z nich však musí být řešena buď přímo v programované aplikaci, nebo pomocí jiných knihoven (GTK, Qt, Win32API apod.).

Mezi nepodporované funkce patří především sofistikované ovládání GUI, funkce pro vstup a výstup bitmap/pixmap do externích souborů a podpora pro dekompresi a zobrazení videa do overlayů. Tyto funkce jsou podporovány například v „konkurenčním“ souboru knihoven DirectX.

Knihovna GLU se snaží poskytovat funkce a postupy, které sice nejsou přímo součástí grafické knihovny OpenGL (tj. jsou natolik složité, že je většina grafických akcelerátorů přímo nepodporuje), ale jsou v mnoha aplikacích velmi často používány. To znamená, že v minulosti, tj. v době před vytvořením knihovny GLU, museli programátoři používající OpenGL stále znovu a znovu psát již několikrát vytvořené kusy kódu, například pro vykreslování NURBS ploch a kvadrik nebo tesselaci obecných polygonů.

Jelikož je však používání kvadrik a NURBS křivek/ploch v grafických aplikacích zcela běžné, je mnohem výhodnější, aby se funkce pro jejich vytváření napsaly pouze jednou. Poté je možné provést jejich důkladnou optimalizaci, otestování, dokumentaci a zabalení do programové knihovny. Tento známý a s mnoha přednostmi používaný postup vede k rychlejšímu vytváření nových aplikací, neboť se některé fáze kódování, testování a dokumentování provádějí pouze jednou, ale využití se najde pro mnoho dalších aplikací.

Poznámka: zkratka GLU značí v tomto seriálu OpenGL Utility Library a ne Gays/Lesbians United Inc. :-)

2. Vztah knihoven OpenGL a GLU

Jak již bylo stručně řečeno v předchozích odstavcích, jsou v knihovně GLU zapouzdřeny některé často používané a mnohdy velmi složité postupy, které se automaticky převádí na jednodušší příkazy (resp. funkční volání) grafické knihovny OpenGL. Mezi takové postupy patří například jednoduché nastavení ortogonální či perspektivní kamery, práce s kvadrikami, tesselátory, NURBS křivkami, NURBS plochami apod.

Vzájemný vztah mezi knihovnami OpenGL a GLU si můžeme naznačit na následujícím obrázku, který ukazuje, jakým způsobem může program (aplikace) komunikovat s grafickým rozhraním operačního systému i s případně připojeným grafickým akcelerátorem (nebo jeho programovou emulací).

Vzájemný vztah mezi knihovnami OpenGL, GLU a GLUT
Obrázek 1: Vzájemný vztah mezi knihovnami, OpenGL GLU a GLUT

Jak je z prvního obrázku patrné, může aplikace pro svůj běh přímo využívat funkce poskytované knihovnami OpenGL, GLU i GLUT. Z knihovny GLU se interně volají pouze funkce OpenGL, zatímco knihovna GLUT interně komunikuje jak s knihovnou OpenGL, tak i s operačním systémem a jeho grafickou nadstavbou (například X-serverem).

Při určitém zjednodušení skutečnosti je možné říci, že téměř všechny funkce, které jsou poskytovány grafickou knihovnou OpenGL, mohou být realizovány přímo na grafických akcelerátorech, samozřejmě pouze tehdy, když je grafický akcelerátor korektně nainstalovaný i se všemi potřebnými ovladači. V opačném případě se použije softwarová emulace, jejíž rychlost však v některých implementacích může být až neuvěřitelně malá. Z funkcí poskytovaných OpenGL představují výjimku pouze evaluátory (viz samostatný seriál), které jsou hardwarově podporovány pouze na nejvyšší třídě grafických akcelerátorů.

Funkce poskytované knihovnou GLU jsou většinou realizovány programově, neboť se jedná o funkce na poněkud vyšší úrovni, které se však, vzhledem ke své specifičnosti, nepoužívají v programech s takovou frekvencí jako funkce OpenGL – například vytvoření NURBS plochy je otázkou čtyř až šesti funkčních volání, ovšem pro její vykreslení pomocí trojúhelníků je zapotřebí specifikovat až několik set vrcholů spolu s jejich barvou a normálovým vektorem.

V dalším textu budu popisovat funkce, které jsou dostupné v knihovně GLU verze 1.2. Tato knihovna se dodává spolu s OpenGL verze 1.1, kterou lze v dnešní době považovat za naprostý základ při práci s OpenGL. Spíše se však setkáte s novějšími verzemi jak samotné OpenGL, tak i její nadstavby GLU. Softwarová emulace většiny funkcí je dostupná pomocí knihovny Mesa, kterou lze získat na stránce mesa3d.org.

3. Analogie OpenGL a jejích nadstaveb s programovací­mi jazyky

V následujících odstavcích si dovolím popsat analogii významu grafické knihovny OpenGL (i jejích nadstaveb) s hierarchií programovacích jazyků. Podobně jako u programovacích jazyků se i u mnoha aplikačních knihoven tvoří hierarchie funkcí či vrstvy abstrakce, které dovolují lépe řešit určitý problém bez nutnosti zabíhat do zbytečných detailů. Všeobecně lze říci, že na vyšší úrovni abstrakce se sice ztrácí obecnost použitého nástroje, na druhou stranu se ale získává jednoduchost a vyšší rychlost vývoje aplikací.

Z hlediska programování počítačové grafiky, v níž jsou tělesa reprezentována svojí hranicí (zdaleka se nejedná o jediný typ reprezentace těles!), je možné považovat funkce z knihovny OpenGL za jakýsi jazyk symbolických instrukcí, protože se v OpenGL přímo manipuluje s jednotlivými grafickými primitivy, jako je bod, úsečka, trojúhelník či plošný polygon, a se základními geometrickými a optickými vlastnostmi těchto primitiv – barvou, materiálem, texturou apod.

Funkce poskytované nadstavbovými knihovnami GLU a GLUT svým rozsahem odpovídají nízkoúrovňovému jazyku, jakým je například oblíbené C-čko, Pascal nebo Algol. Tyto programovací jazyky totiž, podobně jako funkce z knihoven GLU a GLUT, přímo programátorovi nabízejí některé často používané konstrukce (smyčky, výrazy, podmínky, strukturované datové typy), které by se v assembleru musely programovat ručně. Vždy však existuje možnost volat z vyšších programovacích jazyků podprogramy psané v assembleru, což zhruba odpovídá volání funkcí implementovaných v grafické knihovně OpenGL.

Prozatím na nejvyšším stupni hierarchie knihoven stojí Open Inventor, který, vzhledem k tomu, že se jedná o objektové rozšíření grafické knihovny OpenGL, odpovídá objektově orientovaným jazykům, jako je Java, Objective C či C++. Open Inventor je významný a zajímavý tím, že celé aplikační rozhraní OpenGL zapouzdřuje a umožňuje jednoduše budovat graf vytvářené scény, ve kterém se jednotlivé uzly chovají jako objekty (ve smyslu významu OOP i ve smyslu grafickém).

Je samozřejmé, že výše uvedená analogie trošku pokulhává, ostatně jako všechny ostatní analogie. Jedná se však o jakési přiblížení celé problematiky programátorům, kteří budou tento seriál číst.

4. Součásti knihovny GLU

Veškeré funkce poskytované knihovnou GLU můžeme rozdělit do sedmi skupin, přičemž každá skupina svým způsobem rozšiřuje schopnosti OpenGL v jiné oblasti počítačové grafiky:

  1. inicializační funkce
  2. funkce pro zjištění chyb při běhu aplikace a jejich příčin
  3. transformace a zpětná (inverzní) transformace souřadnic bodů (vrcholů plošek, vertexů), vektorů světel a normálových vektorů
  4. manipulace s rastrovými obrázky (bitmapami, pixmapami) pro potřeby texturování a zobrazování pixmap
  5. vytváření a zobrazování kvadrik – koulí, válců, kuželů a disků
  6. tesselace plošek (obecných plošných konvexních i nekonvexních polygonů) na trojúhelníky
  7. vytváření, editace a zobrazování NURBS křivek a ploch s možností jejich ořezávání (trim)

5. Literatura

[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.
(dostupné i na WWW ve formátu PDF)

[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.

6. Odkazy na další zdroje na Internetu

[8] První díl seriálu o knihovně GLUT:
www.root.cz/cla­nek/1612

[9] První díl seriálu o grafické knihovně OpenGL:
www.root.cz/cla­nek/1713

[10] První díl seriálu o OpenGL Imaging Subsetu:
www.root.cz/cla­nek/2068

[11] Článek popisující OpenGL evaluátory:
www.root.cz/cla­nek/2196

[12] SW implementace OpenGL – Mesa:
mesa3d.org

[13] Popis platforem podporovaných knihovnou Mesa:
mesa3d.org/sys­tems.html

[14] OpenGL pages:
www.opengl.org

bitcoin školení listopad 24

7. Obsah dalšího pokračování

V následujících dílech tohoto seriálu si postupně jednotlivé skupiny funkcí z knihovny GLU popíšeme, přičemž hned v dalším pokračování se zaměříme na inicializační funkce. V každém pokračování budou také uvedeny demonstrační příklady, na kterých je možné si popsané funkce a postupy prakticky odzkoušet.

8. Zkomprimovaná verze článku i s obrázky

Zkomprimovaná verze tohoto článku i se všemi obrázky je uložena zde.

Autor článku

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