Zadání

OpenGL. Základní charakteristiky, primitiva, druhy transformací, práce se zobrazovacími seznamy. Paměťové vrstvy, použití při tvorbě obrazů.

OpenGL

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:

  • 1992 - 1.0
  • 2004 - 2.0, přidány vertex a fragment shadery (GLSL - OpenGL Shading Language)
  • 2008 - 3.0, deprecation mechanismus (byly zakázány některé staré funkce), 3.1 zcela odstranila funkce označené jako deprecated, 3.2 - zavedení profilů (compatibility profil: kompletní, vč. deprecated funkcí, core profil: bez deprecated funkcí)
  • 3.3 a 4.0 vypouštěna společně - 3.3 pro knihovnu Direct3D 10, 4.0 pro Direct3D 11
  • 4.3 - podporuje GPU paralelismus v rámci kontextu grafické pipeline

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.

Vlastní datové typy:

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.

  • Evaluators - efektivní prostředek pro aproximaci geometrie křivek a povrchů
  • Per-vertex operations and primitive assembly - OpenGL zpracovává geometrická primitiva. V části „Per-vertex operations“ jsou souřadnice každého vrcholu a jeho normály transformovány pomocí GL_MODELVIEW matice (z lokálních souřadnic objektu do souřadnic pozorovatele (eye coordinates)). Pokud je povoleno osvětlení, je v této fázi spočteno pro každý vrchol. V části „Primitive assembly“ dochází k transformaci grafických primitiv (bod, čára, polygon) pomocí projekční matice a dále mohou být vertexy ořezány některou předem zadanou ořezávací rovinou.
  • Pixel operations - na vstupních pixelech je proveden příslušný scaling, bias (posunutí), mapování atd.
  • Texture assembly (Texture memory) - zpracované pixely jsou buď uloženy v tzv. Texture assembly (Texture memory) jako rastr textury nebo jsou rovnou poslány do rasterizační jednotky. Texture memory uchovává texturové obrázky.
  • Rasterization - proces převodu geometrických a pixelových dat na takzvané fragmenty, tj. dvoudimenzionální obdélníkové oblasti obsahující barvu, hloubku, šířku čáry, velikost bodu a výpočet antialiasingu (GL_POINT_SMOOTH, GL_LINE_SMOOTH, GL_POLYGON_SMOOTH). Každý fragment odpovídá pixelu ve framebufferu.
  • Per-fragment operations - fragmenty jsou převedeny na pixel ve framebufferu. První část této fáze je generování tzv. texelů (texture elements). Dále se vypočítává mlha. Následuje sada testů na fragmentech: Scissor test ⇒ Alpha test ⇒ Stencil test ⇒ Depth test. Nakonec je proveden blending (míchání), dithering, logické operace, aplikace bitové masky a výsledné pixely jsou uloženy do framebufferu.
  • Framebuffer - může se skládat z následujících bufferů:

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

Primitiva

Všechny objekty v OpenGL obsahují jako základní prvek vrchol. Rozlišujeme 10 druhů grafických primitiv:

  • Bod - GL_POINTS
  • Úsečka (zadaná dvěma koncovými body) - GL_LINES
  • Řetězec úseček (line strip) - GL_LINE_STRIP
  • Smyčka vytvořená z úseček (line loop) - GL_LINE_LOOP
  • Trojúhelník - GL_TRIANGLES
  • Trs trojúhelníků (triangle fan) - GL_TRIANGLE_FAN
  • Pás trojúhelníků (triangle strip) - GL_TRIANGLE_STRIP
  • Rovinný čtyřúhelník (quad) - GL_QUADS
  • Pás rovinných čtyřúhelníků (quad strip) - GL_QUAD_STRIP
  • Rovinný konvexní polygon (polygon) - GL_POLYGON

Transformace

Homogenní souřadnice

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é).

Základní afinní transformace

Sekvence (zřetězení) afinních transformací:

Perspektivní projekce

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:

Transformační matice

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.

  • ModelView matrix - používá se pro nastavení pozice kamery i pro manipulaci s objekty (modely) ve scéně
  • Projection matrix - používá se pro nastavení perspektivní projekce kamery (př. rybí oko)
  • Viewport matrix - používá se po provedení perspektivní projekce k mapování objektů z abstraktních souřadnic do souřadnic okna
  • Texture matrix - používá se při mapování textur na povrch objektů

Typy projekce jsou následující:
- Ortografická (rovnoběžná) projekce (obr. vlevo)
- Perspektivní projekce (obr. vpravo)
- Projekce definovaná uživatelem

Zásobník matic

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.

Zobrazovací seznamy (Display lists)

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:

  • zvýšená rychlost vykreslování
  • zjednodušení kódu pro vykreslování komplikovaných scén

Paměťové vrstvy

Množství volání funkcí glVertex(), glColor(), glNormal() a glMaterial() lze redukovat několika způsoby:

  • využití blokového schématu OpenGL, tedy možnost nastavení daného stavu celému bloku místo jednotlivým příkazům
  • využití grafických primitiv redukujících počet přenesených vrcholů, jako například triangle fan, triangle strip, quad strip
  • využití display listů
  • vytvoření pole vrcholů

Vertex Arrays (pole vrcholů)

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.

Vertex Buffer Objects

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.

Vertex arrays vs. VBO:

Vertex Array Objects

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.

Zdroje

Barbora Kozlíková. PV112 - Programování grafických aplikací. 2013. Fakulta informatiky, Masarykova Univerzita, Brno.

mgr-szz/in-gra/12-gra.txt · Poslední úprava: 2020/04/12 16:56 (upraveno mimo DokuWiki)
Nahoru
CC Attribution-Noncommercial-Share Alike 4.0 International
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0