Uživatelské nástroje

Nástroje pro tento web


pitel:msz:opengl

Grafická knihovna OpenGL

OpenGL, Seriál Grafická knihovna OpenGL – Root.cz

  • OpenGL – standard pro počítačovou 3D grafiku, knihovny pro různý HW a OS.
  • Grafická primitiva jsou bod, úsečka, polygon, pixmapa, bitmapa. Pomocí těchto se vše vykresluje.
  • Stavový stroj je základním principem vykreslování OpenGL, nastavení parametrů mění stav stroje a je dále používáno až do další změny.
  • Neobsahuje žádné funkce pro práci s okny ani GUI.

Vykreslovací řetězec

Vertex data

Jedním ze dvou typů dat, které vstupují do vykreslovacího řetězce OpenGL, jsou údaje o vrcholech grafických primitiv (vertexech). Pro každý vertex musíme zadat minimálně jeho souřadnice příkazem glVertex*() (sou­řadnice jsou zadány ve dvojici [x, y], trojici [x, y, z] nebo čtveřici [x, y, z, w]). Dále je možné u každého vertexu specifikovat následující parametry:

  • True-color barvu vertexu příkazem glColor*(), kde barva je zadána buď třemi složkami RGB (Red, Green, Blue), nebo čtyřmi složkami RGBA (Red, Green, Blue, Alpha). Pro každý vertex grafické primitivy lze zadat jinou barvu, barvy mezilehlých fragmentů se dopočítají lineární interpolací.
  • Barvu z předdefinované palety (pokud OpenGL pracuje v index-color režimu). Tato barva se zadává příkazem glIndex*() s jedním parametrem představujícím index do předem vytvořené palety. Index-color režim se v dnešní době již příliš nepoužívá, protože mnoho vlastností OpenGL v tomto režimu nelze aplikovat. Jedinou podstatnou výhodou index-color režimů je menší spotřeba paměti na color buffer.
  • Normálu vertexu pomocí příkazu glNormal*(). Normála se využije při výpočtu osvětlení a při odstraňování odvrácených plošek tělesa. Vzhledem k tomu, že normálu lze pro každý vertex zadat libovolně, je možné aplikovat různé grafické efekty, například bump mapping. Normály lze nechat vypočítat i automaticky, ale při opakovaném vykreslování rozsáhlých scén může opakovaný výpočet normál znamenat značné zatížení systému, proto je většinou výhodnější provést výpočet normál pouze jedenkrát v inicializační části programu.
  • Texturovací souřadnice pomocí příkazu glTexCoord*(). OpenGL podporuje rastrové textury ve třech formátech: jednorozměrné, dvourozměrné a třírozměrné. Při texturování je pro každý vertex zapotřebí zadat souřadnice do právě aktivní (vybrané) textury. Souřadnice v textuře se při vykreslování lineární, bilineární nebo trilineární interpolací automaticky dopočítávají (je možné provádět i perspektivní korekci). Texturováním se budeme podrobněji zabývat v dalších dílech tohoto seriálu.
  • Parametry pro vyhodnocení mapovací funkce pomocí příkazu glEvalCoord*(). Pomocí mapovací funkce lze vypočítat například souřadnice vertexu nebo jeho normálu. Pokud se pomocí mapovací funkce vyhodnocuje souřadnice vertexu, lze zapnutím automatického generování normál povolit výpočet normál přímo z mapovací funkce.
  • Bod v předem zadané mřížce pomocí příkazu glEvalPoint*(). Tento příkaz se používá při vyhodnocení hodnot zadaných do mřížky. Parametrem (resp. parametry) tohoto příkazu jsou indexy do této mřížky.
  • Parametry materiálu vertexu pomocí příkazu glMaterial*(). Tímto příkazem lze pro každý vertex zadat jiné optické vlastnosti materiálu, ze kterého se skládá výsledné těleso. Tyto vlastnosti (podobně jako například barva) jsou potom pro každý fragment automaticky dopočítány pomocí lineární interpolace.
  • Vlastnosti hrany, která začíná právě zadávaným vertexem pomocí příkazu glEdgeFlag*(). Pro každou hranu lze určit, zda je hraniční, či nikoliv. Tento příznak se potom použije například při vykreslování drátového modelu, kdy hrany, které nejsou hraniční, nemusí být vykresleny.

Pixel data

Druhým typem dat, která vstupují do vykreslovacího řetězce, jsou rastrová data. Ta se používají ve třech případech:

  • Vykreslování bitmap (jednobarevných rastrových obrázků). Bitmapy se používají zejména pro výpis řetězců. Vzhledem k tomu, že u bitmap je pro každý pixel rezervovaný pouze jeden bit, je nutné před vlastním vykreslováním příkazem glColor*() zadat barvu bitmapy.
  • Vykreslování rastrových obrázků s vyšší barevnou hloubkou. V terminologii OpenGL se tyto obrázky nazývají pixmapy. Pixmapy mohou být zadány v několika barevných modelech a jsou podporovány různé barevné hloubky, aby bylo možné použít různé typy rastrových obrázků bez nutnosti programové konverze.
  • Pokrytí povrchu těles texturou. Textury se obecně po jejich zadání nikam přímo nevykreslují, ale zůstávají v texturovací paměti. Odtud je lze použít při nanášení na povrch těles. V ideálním případě je texturovací paměť umístěna přímo na grafickém akcelerátoru, ale je možné, že při větším množství velkých textur se tyto umístí do hlavní paměti počítače.

Display list

Jak vertexy těles, tak rastrová data lze uložit do takzvaných display listů. Display listy si lze zjednodušeně představit jako část paměti na grafickém akcelerátoru nebo v hlavní paměti počítače, do níž se ukládá posloupnost příkazů OpenGL, kterou lze následně jedním příkazem vyvolat.

Evaluators

Evaluátory jsou použity zejména při vykreslování parametrických ploch nebo kvadrik. Pokud jsou evaluátory použity, jsou údaje na jejich vstupu brány jako vlastnosti řídících bodů parametrických ploch. Tyto plochy jsou následně vyhodnoceny a na výstupu tohoto bloku se objeví údaje o jednotlivých vrcholech (vertexech).

Per-vertex operation and primitive assembly

Na každý vertex (specifikovaný buď příkazem glVertex*(), uložený v display listu, nebo vyhodnocený pomocí evaluátorů) jsou aplikovány per-vertex operace. Jedná se zejména o transformaci souřadnic vertexu s použitím matice ModelView. Pokud jsou specifikovány i texturovací souřadnice, jsou transformovány s použitím Texture matice. Dále může být na základě údajů o materiálu vertexu a jeho normály vypočteno osvětlení.

Jednotlivé vertexy mohou být dále ořezány některou předem zadanou ořezávací rovinou. Pokud je vertex umístěn za ořezávací rovinou, je odstraněn z dalšího zpracování. V případě úseček nebo polygonů mohou být po ořezání další vertexy přidány, aby se vykreslil zbytek viditelné části primitiva.

Po ořezání jsou souřadnice vertexů transformovány pomocí transformační matice Projection, kde je u 3D scén většinou provedena perspektivní projekce. Po této transformaci je provedeno další ořezání, teď už však pro šest základních ořezávacích rovin (jsou paralelní s osami souřadného systému).

Pixel operations

Operace nad pixely spočívají v dekódování barev jednotlivých pixelů z formátu zadaného aplikací do interního formátu, který je na grafické kartě používán. Po tomto dekódování (které spočívá v rozložení (unpack) tří nebo čtyř barevných složek, jejich případném prohození (swap), posunutí (bias), změně kontrastu (scale) a přemapování (map)) se pixely buď uloží do texturovací paměti jako rastr textury, nebo jsou přímo poslány dále do rasterizační jednotky.

Rasterization

Grafická primitiva specifikovaná svými vrcholy jsou vykreslena tak, že se vygenerují ty fragmenty, které dané primitivum pokrývá. Toto vygenerování se nazývá rasterizace. Při rasterizaci je zapotřebí brát v úvahu jak transformované souřadnice jednotlivých vertexů, tak i případná rastrová data (textury nebo pixely bitmap a pixmap).

Texture assembly

V tomto bloku se provádí různé algoritmy nad daty uloženými v texturovací paměti a rastrovými daty, která posílá aplikace. Jedná se většinou o jednoduché (a tím i rychlé) algoritmy pro kombinování více textur, mipmaping apod. Textury jsou v ideálním případě uloženy přímo v paměti grafického akcelerátoru. V horším případě jsou uloženy v hlavní paměti počítače a v době, kdy jsou zapotřebí pro vykreslování, jsou postupně nahrávány do grafického akcelerátoru, což může znamenat značné zatížení sběrnice procesoru a portu AGP.

Per-fragment operations

Pokud je povoleno texturování, je pro každý fragment vygenerován jeden pixel z texturovací paměti nazývaný texel. Tento texel je potom na fragment aplikován. V nejjednodušším případě je barva fragmentu změněna přímo na barvu texelu, ve složitějších případech se mohou provést další operace nad daty fragmentu a texelu, například blending.

Dále je pro každý fragment proveden výpočet mlhy (fog) a antialias. Poté se provedou operace s jednotlivými buffery (pokud jsou povoleny), tedy test na hodnotu alfa složky fragmentu (alpha test), test s hodnotou ve stencil bufferu (stencil test) a test s hloubkou uloženou v Z-bufferu (depth test). Následně může být proveden dithering a v true-color režimu se může provést blending (smíchání barev více fragmentů, které obsazují stejné místo na obrazovce).

Všechny tyto operace se samozřejmě mohou buď povolit, nebo zakázat. Pokud všechny operace nad fragmenty zakážeme, vykreslí se grafická primitiva postupně tak, jak jsou posílána do vykreslovacího řetězce (mohou se tedy postupně překreslovat) a není nijak změněna jejich barva. Zapnutím texturování, mlhy, antialiasingu, ditheringu nebo operací s buffery lze zásadně ovlivnit výsledný vzhled jednotlivých fragmentů a tím i vzhled celé scény.

Framebuffer

Framebuffer, Grafická knihovna OpenGL (12): vlastnosti framebufferu – Root.cz

Výstup je uložen do takzvaného framebufferu, který se skládá z několika samostatných bufferů. Mezi nejdůležitější buffery patří barvový buffer (color buffer), paměť hloubky (Z-buffer), paměť šablony (stencil buffer) a akumulační buffer (accumulation buffer). Podobně, jako jsou v bitmapách uloženy jednotlivé pixely, jsou ve framebufferu uloženy takzvané fragmenty, které představují průřez všemi buffery. Pro uživatele je jistě nejdůležitější color buffer, neboť v něm jsou uloženy barvy všech fragmentů. Tento buffer je většinou přímo zobrazen na obrazovce, i když jsou možné i další (netypické) režimy zobrazení.

Stencil buffer

Stencil buffer, Grafická knihovna OpenGL (31): význam jednotlivých bufferů – Root.cz

Paměť šablony slouží k maskování vytvářených fragmentů, tj. k určení, které fragmenty se mají vykreslit a které se mají z vykreslovacího řetězce vyloučit. Do zamaskovaných částí framebufferu se vykreslování (tj. zápis) nebude provádět.

Paměť šablony má odlišnou funkci od nám již známého ořezávání. Při ořezávání se odstraňují vrcholy grafických primitiv, ale při použití paměti šablony se pracuje přímo s jednotlivými fragmenty (tj. obrazovými elementy).

Funkci, která je pro test fragmentů používaná, lze programově změnit, což se také často děje, například při vytváření těles pomocí CSG či používání stínových těles při vykreslování stínů.

Paměť šablony nachází své uplatnění také při tvorbě grafického uživatelského rozhraní nebo při vytváření speciálních efektů, jakým je například zrcadlení nebo simulace stereopohledů bez alokace stereo barvových bufferů.

Pro vytvoření paměti šablony ve framebufferu je zapotřebí při inicializaci volat funkci glutInitDispla­yMode() s nastaveným bitovým příznakem GLUT_STENCIL.

/var/www/wiki/data/pages/pitel/msz/opengl.txt · Poslední úprava: 30. 12. 2022, 13.43:01 autor: 127.0.0.1