Základní techniky zobrazování © 2005 Josef Pelikán, MFF UK Praha
Obsah výpočet viditelnosti („depth-buffer“) obrazové buffery („frame buffers“) „double-buffering“, „triple-buffering“ jednoduché ořezávání („scissor test“) šablona („stencil buffer“) poloprůhlednost („alpha blending“) anti-aliasing, akumulační buffer výpočet osvětlení na GPU (fixed pipeline)
Výpočet viditelnosti používá se buffer hloubky („depth-buffer“) Z-buffer nebo W-buffer Z-buffer bitů, typicky 24 bitů na pixel pozor na neuniformní zobrazení hloubky do rozsahu hodnot z (záleží na poměru „far / near“) vzdálenější partie zorného pole mají hloubku méně přesnou! W-buffer nemá problém s nelinearitou hloubky
Obrazové buffery podle grafického režimu 8- až 32-bitové (C, RGB[A]) dnes nejčastěji „true-color“ bitů na pixel „double-buffering“ do jednoho bufferu se kreslí („front“), jiný se zobrazuje („back“) výměna bufferů: „flipping“ nebo „blitting“ flipping: rychlé přepnutí v HW (preferované) blitting: bit-blt operace „triple-buffering“ další buffer („pending“) pro lepší balancování výkonu a plynulejší snímkovou frekvenci
Obrazové buffery, triple buffering zobrazuje se → left front left back left pending right front right back right pending hotový, čeká → kreslí se → VS ↕ async ↕
všechny buffery lze používat selektivně povolení / zákaz zápisu (i do jednotlivých bitových rovin) povolení depth-testu (též nastavení porovnávací operace) pro kreslení jsou k dispozici i další buffery – „rendering targets” OpenGL: GL_AUXi „pixel buffer“ (pbuffer) – kreslení přímo do texturové paměti (rychlejší než glCopyTexImage*()) rozšíření WGL_ARB_pbuffer Práce s buffery
závěrečná fáze „Upotřebení fragmentu“ („Per- Fragment Operations”), za fragmentovým procesorem pořadí fragmentových operací: 1. scissor test 2. alpha test 3. stencil test 4. depth test 5. blending 6. dithering 7. logická operace Fragmentové operace
„scissor test”: rychlý a jednoduchý test obdélníková oblast na obrazovce (HW implementace) „alpha test”: rychlý test porovnání α-složky daného fragmentu s referenční hodnotou mohu zadat porovnávací operaci ( GL_NEVER, GL_LEQUAL,...) Jednoduché testy
další buffer velikosti obrazovky typicky 1 až 8 bitů na pixel může omezovat kreslení do obrazového bufferu (ruší celé další zpracování fragmentu) uživatelské nastavení zápisu do stencil-bufferu uživatelské nastavení stencil-testu OpenGL: různé režimy zápisu pro tři možné stavy: 1.fragment neprošel stencil-testem 2.fragment prošel stencil-testem, ale ne depth-testem 3.fragment prošel oběma testy Šablona = „stencil buffer“
modifikace šablony (pro každý z předchozích režimů): GL_KEEP, GL_ZERO, GL_REPLACE, GL_INVERT GL_INCR, GL_INCR_WRAP, GL_DECR, GL_DECR_WRAP nastavení stencil testu: porovnávání se zadanou referenční hodnotou GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, … použití šablony: víceprůchodové algoritmy vrhání stínů, zobrazování CSG, odraz ve vodě, průhled skrz portál, výhled z kokpitu,... Operace s šablonou
kombinace několika pixelů s různým „stupněm pokrytí” – průhledností („transparency”) poloprůhledné objekty (např. i billboards, imposters) vyhlazování – „anti-aliasing” (okrajové pixely jsou pokryté jen částečně) buffer může držet neprůhlednost („opacity“) α nebo A („alpha“): velikost – jako ostatní složky (formát pixelu RGBA) s průhledností se může pracovat i při bufferu RGB: kreslení odzadu dopředu se zapnutým depth-bufferem Poloprůhlednost – „alpha blending“
skládání (kompozice) poloprůhledných pixelů: v praxi se používají jen binární operace (sériové zprac.) lineární kombinace složek RGB[A] koeficienty této kombinace lze zadávat podle potřeby např. v OpenGL lze zadat zvláštní koeficienty pro zdroj i cíl, pro barvu i α-kanál viz α-operace ( OVER, ATOP, HELD_OUT_BY,... ) přednáška PGR007 (Pokročilá 2D grafika) Poloprůhlednost - skládání
záleží na pořadí vykreslování! při neuspořádaném kreslení není možné správně spočítat výslednou barvu (ale průhlednost ano..) obyčejně se praktikuje kreslení odzadu dopředu univerzální postup pro kombinaci neprůhledných a poloprůhledných objektů ve 3D scéně: nepotřebuji obrazový buffer RGBA, stačí RGB: 1. nakreslím v libovolném pořadí neprůhledné objekty 2. vypnu zápis do depth-bufferu (zůstanou staré hodnoty) 3. kreslím poloprůhledné objekty odzadu dopředu, jako α-operaci nastavím „ OVER ” (viditelnost se testuje) Kombinace s průhlednými objekty
HW implementace anti-aliasingu základní primitiva (body, úsečky, trojúhelníky) mohou mít analytický výpočet měkkých okrajů někdy je pro anti-aliasing potřeba používat RGBA buffery uživatelský anti-aliasing: „multisampling” - kreslení několika obrázků přes sebe (s vzájemným malým – subpixelovým – posunutím) OpenGL: stavová proměnná GL_SAMPLE_BUFFERS okénko se schopností vícenásobného kreslení (přes akumulační buffer) někdy se musí zapnout korektní výpočet pokrytí poloprůhledných fragmentů v multisamplingu Anti-aliasing
musí být pro něj HW podpora (další buffer navíc) použití: anti-aliasing (přes „multisampling“ – viz výše) rozmazání pohybem („motion blur”) simulace hloubky ostrosti objektivu měkké vržené stíny technika: nastavení akumulačního bufferu vícenásobné kreslení scény (celé/části, podle potřeby) po každém kreslení: přenos do akumulač. bufferu (příp. nastavení multiplikativního a aditivního faktoru) Akumulační buffer
jednoduchý světelný model (Phong) „ambient” – okolní složka světla „diffuse” – difusní odraz (dokonale matné těleso, Lambertův, cosinový zářič) „specular” – lesklý odraz světla (Phong) ve vrcholech musí být zadány normálové vektory možnost počítat je automaticky na GPU? primární (difusní) a sekundární (lesklá) barvy a další materiálové konstanty zadání polohy a parametrů světelných zdrojů někdy jen omezený počet zdrojů světla (kvůli HW) Výpočet osvětlení na GPU
bodový zdroj všesměrový, v konečné vzdálenosti směrový zdroj rovnoběžné paprsky = v nekonečnu reflektor („spotlight”) směrové světlo v konečné vzdálenosti intenzita ubývá při odklonu od osy mezní úhel GL_SPOT_CUTOFF Světelné zdroje SPOT_CUTOFF L
všechny zdroje jsou zeslabovány podle vzdálenosti kvadratický polynom reflektor je navíc tlumen úhlem odklonu od osy: L … osa reflektoru V … směrový vektor od zdroje k objektu SE … GL_SPOT_EXPONENT Útlum zdroje
Celkový výpočet osvětlení primární barva (difusní světlo): sekundární barva (odlesk): nemusí být implementována aplikuje se až po texturování
Literatura Tomas Akenine-Möller, Eric Haines: Real-time rendering, 2 nd edition, A K Peters, 2002, ISBN: OpenGL ARB: OpenGL Programming Guide, 4 th edition, Addison-Wesley, 2004, ISBN: J. Žára, B. Beneš, J. Sochor, P. Felkel: Moderní počítačová grafika, 2. vydání, Computer Press, 2005, ISBN: