Základní techniky zobrazování 2005 Josef Pelikán, MFF UK Praha http://cgg.ms.mff.cuni.cz/~pepca/ Josef.Pelikan@mff.cuni.cz
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 16-32 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 24-32 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 right front hotový, čeká VS left back right back kreslí se async left pending right pending
Práce s buffery 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
Fragmentové operace 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
Jednoduché testy 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,...)
Šablona = stencil buffer 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
Operace s šablonou 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,...
Poloprůhlednost alpha blending 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 - skládání 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)
Kombinace s průhlednými objekty 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)
Anti-aliasing 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
Akumulační buffer 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)
Výpočet osvětlení na GPU 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)
Světelné zdroje 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 SPOT_CUTOFF L
Útlum zdroje všechny zdroje jsou zeslabovány podle vzdálenosti kvadratický polynom 1 Att d = k C k L d k Q d 2 reflektor je navíc tlumen úhlem odklonu od osy: Spot L, V = cos LV SE L osa reflektoru V směrový vektor od zdroje k objektu SE GL_SPOT_EXPONENT
Celkový výpočet osvětlení primární barva (difusní světlo): Pri = Emiss mat Amb lightmodel Amb mat N i=1 Att i [ Amb light Amb mat cos Diff light Diff mat ] i sekundární barva (odlesk): nemusí být implementována aplikuje se až po texturování N Sec = Spec mat i=1 [ Att cos shininess Spec light ] i
Literatura Tomas Akenine-Möller, Eric Haines: Real-time rendering, 2 nd edition, A K Peters, 2002, ISBN: 1568811829 OpenGL ARB: OpenGL Programming Guide, 4 th edition, Addison-Wesley, 2004, ISBN: 0321173481 J. Žára, B. Beneš, J. Sochor, P. Felkel: Moderní počítačová grafika, 2. vydání, Computer Press, 2005, ISBN: 8025104540