Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Pokročilé techniky © 2004-2005 Josef Pelikán, MFF UK Praha

Podobné prezentace


Prezentace na téma: "Pokročilé techniky © 2004-2005 Josef Pelikán, MFF UK Praha"— Transkript prezentace:

1 Pokročilé techniky © Josef Pelikán, MFF UK Praha

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 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 … 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 … světlo 1 … stín

28 Stínové objemy II – v pořádku +1 0 … světlo 1 … stín

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 S3S

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: Randima Fernando, Mark J. Kilgard: The Cg Tutorial, Addison-Wesley, 2003, ISBN: OpenGL ARB: OpenGL Programming Guide, 4 th edition, Addison-Wesley, 2004, ISBN: ed. Randima Fernando: GPU Gems, Addison-Wesley, 2004, ISBN:


Stáhnout ppt "Pokročilé techniky © 2004-2005 Josef Pelikán, MFF UK Praha"

Podobné prezentace


Reklamy Google