Obsah

Grafická knihovna OpenGL

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

Vykreslovací řetězec

Graphics pipeline, OpenGL Rendering Pipeline, Grafická knihovna OpenGL (11): vykreslovací řetězec – Root.cz

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:

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:

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.