OpenGL. Základní charakteristiky, primitiva, druhy transformací, práce se zobrazovacími seznamy. Paměťové vrstvy, použití při tvorbě obrazů.
Softwarové rozhraní pro grafický hardware (Open Graphics Library), nezávislé na hardwaru. Standardní částí instalace je GLU (knihovna utilit OpenGL). Neobsahuje žádné funkce pro práci s okny, pro vytváření GUI, ani pro zpracování událostí.
Verze:
Specifikaci OpenGL vytváří ARB (OpenGL Architecture Review Board), který je nezávislé konsorcium. Od roku 2006 se o to stará Khronos Group, členskými institucemi jsou 3Dlabs, Apple, ATI, Dell, IBM, Intel, NVIDIA, SGI a Sun Microsystems. Microsoft opustil ARB v roce 2003.
OpenGL se chová jako stavový automat, tj. nastavení je zachováno, dokud jej nezměníme. Vykreslování scény se provádí procedurálně - voláním funkcí OpenGL vzniká výsledný rastrový obrázek, který je uložen do tzv. framebufferu.
Syntaxe:
Použití písmene „v“ na konci názvu funkce značí, že parametry funkce budou brány z pole.
Stavy se dají nastavovat pomocí příkazů glEnable(), glDisable(), glBegin(), glEnd(), … Dále je možné zjistit aktuální stav pomocí příkazu glGetSomething().
OpenGL rendering pipeline:
Moduly pracují relativně nezávisle, vše je řízeno pouze daty („data-flow“), každý modul provádí paralelně jednu instrukci. Vstupní data mohou být dvojího druhu – vertex data reprezentující geometrii a pixel data.
1. Color buffer – pro uložení barvy fragmentů
2. Z-buffer (nebo také Depth buffer) – paměť hloubky fragmentů, uspořádání fragmentů podle hodnoty v ose Z, je důležitá jeho bitová hloubka
3. Stencil buffer – pamět pro šablonu, slouží k tzv. maskování fragmentů, což znamená, že určuje, které fragmenty se mají vykreslit a které se mají z vykreslovacího řetězce vyloučit
4. Accumulation buffer – akumulační buffer, využívá se pro sloučení více scén nebo více pohledů do jedné scény nebo výsledného obrazu
Všechny objekty v OpenGL obsahují jako základní prvek vrchol. Rozlišujeme 10 druhů grafických primitiv:
Bod v kartézských souřadnicích (X,Y) odpovídá bodu (x,y,w) v homogenních souřadnicích. Převod: X = x/w, Y = y/w. Homogenní souřadnice jsou invariantní vůči scalingu (změně velikosti), př. (1a,2a,3a) = (1a/3a,2a/3a) = (1/3,2/3).
Definice:
Plücker (vpravo)
Möbius (vlevo) - Množina homogenních souřadnic pro bod p je definována jako hmotnosti přiřazené vrcholům trojúhelníka takové, že p se stane těžištěm trojúhelníka. Bod p je spočten jako (waa, wbb, wcc), kde wa, wb a wc se nazývají barycentrické souřadnice a platí wa + wb + wc = 1.
w=0 odpovídá bodu v normální rovině, který je nekonečně daleko. Normální rovina doplněná o body v nekonečnu se nazývá projektivní rovina. V projektivní rovině se libovolné dvě přímky protínají (tedy i ty rovnoběžné).
Slouží pro přirozeně vypadající promítnutí 3D objektu na 2D obrazovku.
Bod obrazu (x',y') je vypočten z bodu objektu (x,y,z) pomocí podobnosti trojúhelníků:
Matice perspektivní projekce vzniká násobením matice pro perspektivu a pro projekci:
Všechny lineární transformace lze vyjádřit maticí o rozměrech nxn, kde n je dimenze vektoru či bodu, který chceme transformovat. Složení dvou transformací se provádí pomocí maticového součinu, lze skládat libovolné množství transformací. Pořadí prováděných transformací je velmi důležité, protože násobení matic není obecně
komutativní. V OpenGL existují tři transformační matice, které jsou postupně aplikovány na body (vrcholy), případně i na jejich normály.
Typy projekce jsou následující:
- Ortografická (rovnoběžná) projekce (obr. vlevo)
- Perspektivní projekce (obr. vpravo)
- Projekce definovaná uživatelem
Transformační matice můžeme v OpenGL ukládat do tzv. zásobníku matic. Aktuálně vybranou matici lze uložit na vrchol zásobníku pomocí volání funkce glPushMatrix(), odstranění matice z vrcholu zásobníku pak obstará funkce glPopMatrix(). Matice uložená na vrcholu zásobníku je použita při transformacích.
Display listy si můžeme představit jako makra, do kterých se nahraje několik příkazů OpenGL a tato makra pak lze jedním příkazem spustit. Často se označují jako „odložený mód“ (retained mode).
Výhody:
Množství volání funkcí glVertex(), glColor(), glNormal() a glMaterial() lze redukovat několika způsoby:
Mezi jednotlivými snímky lze měnit data jednotlivých vrcholů (barva, poloha apod.), což v případě display listů nebylo možné. Při vykreslení vrcholů lze vybírat z pole po jednotlivých vrcholech, zadáním seznamu několika vrcholů, nebo zadáním seznamu několika po sobě jdoucích vrcholů. Velká nevýhoda: jsou uloženy na straně klienta a proto je použití pomalé - v každém snímku se musí celý obsah poslat přes sběrnici.
VBO je funkce OpenGL, která poskytuje metody pro nahrávání dat (vrcholů, normálových vektorů, barvy) do výkonné paměti na straně serveru za účelem renderování v odloženém módu. Rozdílem mezi vertex arrays a VBO je to, že VBO nahrává data do vysoce výkonné paměti grafické karty, čímž se výrazně snižuje čas potřebný pro rendering. VBO mohou být kdykoliv čteny a upravovány. Výhodou je i sdílení bufferů s více klienty.
Se zvyšováním počtu modelů nastává přepínání mezi velkým počtem VBO při vykreslování jednoho obrázku. VAO spojují dohromady několik různých atributů vázaných k jednomu VBO a přepínají do stavu určených těmito atributy pomocí jediného volání funkce.
Barbora Kozlíková. PV112 - Programování grafických aplikací. 2013. Fakulta informatiky, Masarykova Univerzita, Brno.