Hlavní navigace

OpenGL a nadstavbová knihovna GLU

Pavel Tišnovský

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

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.

Našli jste v článku chybu?

30. 7. 2004 1:24

Kania (neregistrovaný)

Překvapuje mě zatím nulový ohlas, na to, že článek má už přes tisíc shlédnutí.

Takže tedy, jen tak dál - programátorské seriály o OpenGL jsou jedny z nemnoha, co na root.cz stojí za to.



Root.cz: Nová třída SD karet A1 s vysokým výkonem

Nová třída SD karet A1 s vysokým výkonem

Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

Vitalia.cz: 7 originálních adventních kalendářů pro mlsné

7 originálních adventních kalendářů pro mlsné

Měšec.cz: Za palivo zaplatíte mobilem (TEST)

Za palivo zaplatíte mobilem (TEST)

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Lupa.cz: Obchod budoucnosti je bez front, košíků i pokladen

Obchod budoucnosti je bez front, košíků i pokladen

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu