Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Pokročilé techniky © 2004-2005 Josef Pelikán, MFF UK Praha http://cgg.ms.mff.cuni.cz/~pepca/ Josef.Pelikan@mff.cuni.cz
2
Obsah vylepšení osvětlovacího modelu dynamické mapy okolí („environment maps”) generování a používání světelných map („light maps”, „irradiance maps”), refrakce, bump-mapping, … víceprůchodové algoritmy práce s buffery (stencil buffer, hloubkový buffer, akumulační buffer) výpočet vržených stínů „shadow buffers“, promítané stíny objemové stíny („shadow volumes“) zobrazování CSG, …
3
Normálové mapy („bump-mapping“) „bump-mapping” modulace přesného normálového vektoru (z 3D modelu) napodobení drobných nerovností, hrbolatého povrchu, apod. data jsou obvykle uložena v obyčejné 2D textuře („R 2 R 3 “, „[ s, t ] [ N x, N y, N z ]“) – „normal map” tečný prostor („tangent space“): souřadné osy: tečna T, normála N, binormála B normálová textura obsahuje data z tečného prostoru [ N t, N n, N b ] (původní normála má směr [0,1,0])
4
Normálová mapa v tečném prostoru N world space tangent space [T,N,B] R T B x y -z N = B × T dN
5
Tečný prostor pokud nepotřebujeme světové souřadnice, transformujeme všechny relevantní vektory do tečného prostoru (už ve vrcholech) směr ke kameře, ke světelným zdrojům („half vector”),.. v tečném prostoru (v prostoru normálové textury) pak snadno spočítáme osvětlení nebo musíme zůstat ve světových souřadnicích: např. kvůli obrazu okolí („environment map”) interpolace matice „tangent world” do fragmentů (problém s ortogonalitou !?) výsledek přečtený z normálové mapy se musí transformovat do světových souřadnic (dál jako obvykle)
6
Mapy okolí („environment“) „Environment map” HW umí používat texturu uloženou jakou šest stěn krychle („cube-mapping”) adresování 3D vektorem (nemusí být normalizovaný) statická i dynamická („render target“) data nejčastější použití: dokonalý zrcadlový odraz („environment map“) měkký odraz, difusní složka světla – simulace reálného osvětlovacího modelu lom světla kombinace s „bump-mapping”
7
„Cube-map“ textura technické využití: normalizace 3D vektoru,.. uložení libovolné výpočetně náročné funkce R 3 R 3 pro použití v shaderech (fragment shader, vertex shader od verze 3 – NV40) „environment mapping“: pozor na souřadnou soustavu 3D vektoru obvykle se používají světové souřadnice navíc transformační matice „model svět“ (nebo méně často „clip svět“) pro odraz nebo lom světla existují v Cg knihovní fce
8
Souřadné systémy N world space tangent space [T,N,B] [ s, 1.0, t ] s = x/y, t = z/y R T B x y -z N = B × T
9
Dokonalejší osvětlení difusní složka: „cube-map“ se adresuje normálovým vektorem N dopředu spočítaný součet světla z okolí (integrál) pomocí faktoru „cos ” lesklá složka („specular“): přesně umíme reprezentovat jen modely, kde se jako kvalitativní člen vyskytuje „cos ” „cube-map“ se adresuje odraženým vektorem R („reflect()” v Cg) dopředu spočítané rozmazání okolí faktorem „cos h ”
10
Světelné směrové mapy N world space T R x y -z cos cos h cos e
11
Lom světla zjednodušený přístup: „cube-map“ se adresuje vektorem T obvykle se používá dokonalý (nerozmazaný) obraz okolí (zřídka okolí rozmazané faktorem „cos h ”) možnost simulovat rozklad světla různé indexy lomu pro jednotlivé barevné složky společný obraz okolí teoretická možnost započítat do „refraction map” i druhý lom při výstupu paprsku z tělesa
12
Víceprůchodové algoritmy 3D scéna (nebo její části) se prochází několikrát jiné nastavení GPU (použití různých bufferů, depth- test, stencil-test, apod.) jiné transformační matice, projekce jiné shadery předávání dat mezi jednotlivými průchody: buffery GPU (frame buffer, depth-buffer, stencil buffer, accumulation buffer) textury (shadow map, environment map,...)
13
Akumulační buffer, obraz okolí použití akumulačního bufferu: „anti-aliasing” rozmazání pohybem („motion blur”) hloubka ostrosti objektivu („depth of field“) opakovaný průchod scénou s odlišným nastavením transformační (projekční) matice dynamický výpočet obrazu okolí („environment“): chceme, aby se animace odrážela v lesklých objektech pro „cube-map“ musíme 3D scénu nakreslit 6 × nebo to nějak ošidit při znalosti animace
14
Odraz v rovinném zrcadle jeden průchod navíc pro každé rovinné zrcadlo pokud nechceme vícenásobné odrazy 1. kreslení normální scény zrcadlo se nekreslí (nebo jenom lehce – svojí barvou) zrcadlo zapisuje do šablony (pokud je zrcadel víc, každé má svoji speciální hodnotu), ostatní šablonu nulují k+1. kreslení scény odražené v k-tém zrcadle část scény před zrcadlem se kreslí s modifikovanou transformační maticí (příp. nastavím „alpha-blending“) je dovoleno kreslit jen přes nastavenou šablonu depth-test je povolen (depth-buffer inicializuji)
15
Jedno rovinné zrcadlo 1. 2. stencil = 1
16
Vržené stíny několik různých přístupů ostré hranice stínů („jeden průchod algoritmem“) měkké stíny (více „průchodů”, kombinace několika výsledků..) stíny vrhané do jediné roviny postup je jednoduchý, ale nepraktický „shadow mapping“ stínový „depth-buffer”, podpora HW objemové stíny (stínová tělesa, „shadow volumes“) nejpřesnější přístup, výpočetně náročné
17
Stíny promítnuté do roviny výpočet stínů, které vznikají při osvětlení scény ostrým zdrojem světla příklad použití šablony („stencil”) a více průchodů scénou šablona maskuje plochy, na které má stín dopadat, zařídí, aby se stíny neduplikovaly jednoduchý algoritmus: stíny se vrhají na jedinou rovinu („rovina příjemce”) obraz stínu může být neprůhledný (ve stínu zaniká původní barva/textura příjemce) nebo průhledný (stín jen snižuje množství světla)
18
Stíny vrhané do roviny jednoduchý algoritmus, stíny se vrhají do jediné roviny projekční matice z 3D světa do roviny příjemce plochá stínová tělesa šablona příjemce stínu (stencil = 1) vrhači stínů
19
Stíny vrhané do roviny postup vykreslování: 1. celá 3D scéna se vykreslí v běžném promítání příjemce nastavuje daný bit šablony všechny ostatní plochy tento bit nulují 2. s vypnutým testem hloubky se všichni potenciální vrhači stínu promítnou do roviny příjemce musí se nastavit speciální promítací matice stínové plošky se kreslí pouze na místa, kde je nastaven daný bit šablony (z prvního průchodu) používají-li se poloprůhledné stínové plošky, je nežádoucí, aby se dvě překreslily přes sebe – i tady pomůže šablona (první stínová ploška ji zpátky vynuluje)
20
1. scéna se nakreslí z pohledu světelného zdroje: není potřeba zapisovat do frame-bufferu, jen do depth- bufferu 2. depth-buffer se přesune do textury (“shadow map”) scéna se nakreslí v běžném promítání – podle kamery používají se projektivní texturové souřadnice GPU umí testovat skutečnou vzdálenost fragmentu od zdroje světla (světové souřadnice) proti hodnotě v hloubkové textuře: float4 shadow = tex2Dproj( shadowMap, texCoordProj ); Shadow mapping
21
shadow buffer Stínový depth-buffer („shadow map“) A B z = d A z = d B < d A (stín) z
22
Stínová tělesa („volume shadows“) každé osvětlené těleso vrhá nekonečný stín (množina zastíněných bodů = „stínové těleso“) boční stěny stínového tělesa uvažujeme jako neviditelné, virtuální čtyřúhelníky paprsek od kamery k zobrazovanému tělesu se proti takovým stěnám testuje GPU může virtuální stěny rasterizovat a „kreslit“ je do šablony (obraz při tom zůstává nezměněn) nakonec buffer šablony vyznačuje osvětlenou nebo zastíněnou část scény tento postup se musí opakovat pro každý světelný zdroj
23
Stínové objemy I společný první krok – kreslení celé skutečné scény zapisuje se do depth-bufferu, osvětlení: „ambient” boční stěny stínového tělesa se dělí na přivrácené a odvrácené při kreslení stínových těles se nezapisuje do depth- bufferu (ale k testování viditelnosti se používá) druhý krok kreslí pouze boční stěny stínových těles: přivrácené viditelné stěny inkrementují šablonu odvrácené viditelné stěny dekrementují šablonu třetí krok má v šabloně nulovou hodnotu pro osvětlené části (přidá se příspěvek světelného zdroje)
24
Stínové objemy I 1 +1 1 1 0 0 0 … světlo 1 … stín
25
Stínové objemy I - selhání 0 0 … světlo 1 … stín 0
26
Stínové objemy II kamera může být umístěna kdekoli stínová tělesa jsou dokonale uzavřená „čepičkami”: jedna je tvořena osvětlenou částí tělesa, druhá leží v nekonečnu druhý krok kreslí boční stěny stínových těles a obě „čepičky“: přivrácené neviditelné stěny dekrementují šablonu odvrácené neviditelné stěny inkrementují šablonu třetí krok má v šabloně nulovou hodnotu pro osvětlené části (přidá se příspěvek světelného zdroje)
27
Stínové objemy II 1 +1 1 1 0 0 0 … světlo 1 … stín
28
Stínové objemy II – v pořádku +1 0 … světlo 1 … stín 0 1 +1 1
29
boční stěny i zadní čepička potřebují mít vrcholy v nekonečnu vzdálenější od kamery než jakékoli jiné objekty průmět vrcholu [ x, y, z, 1 ] do nekonečna: [ x, y, z, 0 ] projekční matice s hodnotou „far = ∞“: Vrcholy v nekonečnu
30
projekce vlastního bodu (včetně vydělení homogenní složkou) : projekce nevlastního bodu: Průmět do nekonečna
31
z hlediska pozorovatele umí filtrovat GPU („face culling“) podle orientace vrcholů stěny v NDS: glEnable( GL_CULL_FACE ); glFrontFace( GL_CCW ); glCullFace( GL_BACK ); // draw front faces only … z hlediska světelného zdroje výpočet na CPU (podle normálových vektorů v prostoru) možnost použití programovatelných GPU (vertex pr.) eliminace nesprávných primitivů degenerací nevýhoda: mnohem větší počet vrcholů posílaný do GPU Přivrácené / odvrácené stěny
32
nelze vrcholy ani primitiva „zrušit“ (na běžných GPU) mohu nechat nepatřičné stěny ořezat nebo „zdegenerovat“ s každým vrcholem stěny se musí z CPU posílat data potřebná k rozhodování zde např.: normálový vektor plošky nemá-li být stěna nakreslena, všechny její vrcholy jsou ve vertex shaderu nastaveny např. na [ 2, 0, 0, 1 ] tj. mimo frustum (uplatní se ořezávání GPU), kromě toho by v rasterizéru nevzniknul ani jeden fragment sousední stěny nesmějí sdílet vrcholy (mnoho dat) ! Eliminace stěn ve vertex procesoru
33
Eliminace stěn - ukázka V2V2 přivrácené odvrácené N1N1 V1V1 N3N3 N2N2 V3V3 V4V4 V5V5 Data (normály posílám jako TEXCOORD0) : … glTexCoord3fv( N1 ); glVertex4fv( V1 ); glVertex4fv( V2 ); glVertex4fv( V3 ); glTexCoord3fv( N2 ); glVertex4fv( V1 ); glVertex4fv( V3 ); glVertex4fv( V4 ); glTexCoord3fv( N3 ); glVertex4fv( V1 ); glVertex4fv( V5 ); glVertex4fv( V2 ); …
34
tvoří ho nekonečné čtyřúhelníky promítané z obrysových hran stínícího tělesa „obrysové“ vzhledem ke světelnému zdroji jedna sousední stěna je přivrácená, druhá není je-li hrana [ x 1, y 1, z 1, 1 ] – [ x 2, y 2, z 2, 1 ] obrysová, vrhne nekonečný stínový čtyřúhelník: [ x 1, y 1, z 1, 1 ], [ x 2, y 2, z 2, 1 ], [ x 2, y 2, z 2, 0 ], [ x 1, y 1, z 1, 0 ] rozhodování o obrysových hranách stínu na GPU každá „hrana“ má své vlastní 4 vrcholy (plýtvání..) s každým vrcholem se posílají normály dvou sousedních stěn tělesa (míří-li jedna ke zdroji a druhá od něj obrys) Plášť stínového tělesa
35
Plášť stínového tělesa - ukázka V2V2 N1N1 V1V1 N3N3 ∞ ∞ V1iV1i V2iV2i Data (normály posílám jako TEXCOORD0 a TEXCOORD1) : … glMultiTexCoord3fv( GL_TEXTURE0, N1 ); glMultiTexCoord3fv( GL_TEXTURE1, N3 ); glVertex4fv( V1 ); glVertex4fv( V1i ); glVertex4fv( V2i ); glVertex4fv( V2 ); glMultiTexCoord3fv( GL_TEXTURE0, N4 ); glVertex4fv( V2 ); glVertex4fv( V2i ); …
36
speciální stínovací metoda pro statickou scénu a zdroj světla pohybující se po pevné křivce např.: statický exteriér a Slunce předem spočítané intervaly zákrytu pro každý bod ve scéně! charakteristická funkce osvětlení (jako funkce času) časově náročný výpočet (Ray-tracing – až hodiny CPU) uchování výsledků ve speciálních stínových mapách (vektorová reprezentace: začátky a konce světelnýh intervalů) interpolace měkkých stínů v reálném čase na GPU Statické měkké stíny (intervaly zákrytu)
37
světelný zdroj se pohybuje v čase po pevné křivce: Intervaly světla a stínu P t1t1 t2t2 t3t3 t4t4 t5t5 t6t6 t t1t1 t2t2 t3t3 t4t4 t5t5 t6t6
38
pro měkké okraje stínu se funkce viditelnosti rozmaže (fragment shader na GPU): Rozmazání funkce viditelnosti t t1t1 t2t2 t3t3 t4t4 t5t5 t6t6 t t1t1 t2t2 t3t3 t4t4 t5t5 t6t6 dt
39
zvlášť reprezentuji začátky („R i “ - „rise“) a konce („F i “ - „fall“) osvětlených intervalů: Efektivní výpočet interpolace t R1R1 F1F1 R2R2 F2F2 R3R3 F3F3
40
R i a F i se předávají dvěma texturami (je tam místo pro 4 světelné intervaly), „t-dt/2“, „t+dt/2“ a „1/dt“ pomocí uniform parametrů: half softShadow ( sampler2D riseTex, sampler2D fallTex, float2 texCoord, half intStart, // t-dt/2 half intEnd, // t+dt/2 half intInvWidth ) // 1/dt { half4 rise = h4tex2D( riseTex, texCoord ); half4 fall = h4tex2D( fallTex, texCoord ); half4 minT = min( fall, intEnd ); half4 maxT = max( rise, intStart ); return dot( intInvWidth, saturate( minT – maxT ) ); } Fragment shader pro interpolaci
41
převod elementárních těles na mnohostěny vyhodnocování množinových operací na GPU: sjednocení je triviální (nakreslí se vše přes sebe, s pomocí viditelnosti – „depth buffer“) průnik a rozdíl: pomocí šablony („stencil“), rozlišuji přivrácené a odvrácené stěny 1989: Goldfeather et al. normalizace CSG stromu – rozklad na sjednocení „součinů“ (součin obsahuje průniky a rozdíly) implementace potřebuje několik „depth-bufferů“ a šablonu (+ nutnost kopírovat mezi sebou depth-buffery) Zobrazování CSG scén na GPU
42
2000: Stewart et al. – Sequenced Convex Subtraction („SCS“) nepotřebuje kopírování depth-bufferů, složité depth-testy jednotlivá elementární tělesa musí být konvexní O(n) – průnik n konvexních těles O(n 2 ) – rozdíl n konvexních těles (O(kn) s omez. zákr.) tři fáze algoritmu: 1. předzpracování (normalizace CSG, setřídění odečítacích sekvencí zepředu dozadu) 2. zpracování depth-bufferu (pro každý součin + merge) 3. finální vykreslení výsledku do frame-bufferu Sekvenční konvexní odečítání
43
inicializace: depth = near; stencil = 0; průchod přivrácenými stěnami jednotlivých těles if ( front > depth ) depth = front; průchod odvrácenými stěnami (počítání zákrytů) if ( back > depth ) stencil++; odstranění pixelů s menším počtem překrytých objektů než n if ( stencil != n ) { stencil = 0; depth = far; } Průnik n těles
44
Průnik - ukázka S1S1 S2S2 S3S3 2 3 2 3
45
určení správné posloupnosti odečítání těles: odečítat se musí zepředu dozadu např. X – A – B se nahradí univerzální X – A – B – A A,B,A je korektní univerzální odečítací posloupnost viz „posloupnosti obsahující všechny zákryt. permutace“ odečítání odpředu: průchod všemi odečítanými tělesy if ( front < depth ) stencil = 1; else stencil = 0; pro každé těleso se hned projde i odvrácená část if ( back > depth && stencil == 1 ) depth = back; Odečítací sekvence
46
Odečítání - ukázka S1S1 X S2S2 I I II III X - S 1 - S 2 - S 1
47
Odečítání - výsledek S1S1 X S2S2 X - S 1 - S 2 - S 1 !
48
odstranění částí společného průniku, které byly odečtením zcela eliminovány: inicializace: stencil = 0; průchod všemi tělesy z průniku (jen jejich zadní stěny – nalezení prázdného výsledku) if ( back < depth ) stencil = 1; eliminace úplně odečtených partií if ( stencil == 1 ) depth = far; stencil = 0; Úplně odečtené části
49
výsledek výpočtu součinu = jeho „depth buffer“ slévání výsledku jednoho součinu (tj. sjednocení) if ( depth < depth total ) depth total = depth; finální vykreslení výsledku jiná logika pro pronikaná a jiná pro odečítaná tělesa pronikané těleso (pixel po pixelu): if ( front == depth total ) draw(front); odečítané těleso (pixel po pixelu): if ( back == depth total ) draw(back); Slévání součinů a vykreslení výsledku
50
Literatura Tomas Akenine-Möller, Eric Haines: Real-time rendering, 2 nd edition, A K Peters, 2002, ISBN: 1568811829 Randima Fernando, Mark J. Kilgard: The Cg Tutorial, Addison-Wesley, 2003, ISBN: 0321194969 OpenGL ARB: OpenGL Programming Guide, 4 th edition, Addison-Wesley, 2004, ISBN: 0321173481 ed. Randima Fernando: GPU Gems, Addison-Wesley, 2004, ISBN: 0321228324
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.