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

Slides:



Advertisements
Podobné prezentace
Počítačová grafika Nám umožňuje:
Advertisements

Základy rovnoběžného promítání
Stručný přehled OpenGL Jiří Danihelka. Co je OpenGL?  Open Graphics Library  Knihovna pro počítačovou grafiku  Zhruba 120 funkcí  Představuje standard.
Počítačová grafika III Odraz světla, BRDF – Cvičení Jaroslav Křivánek, MFF UK
Světelné jevy a jejich využití
Rekonstrukce povrchu objektů z řezů Obhajoba rigorózní práce 25. června 2003 Radek Sviták
Davy v počítačové grafice
Analytické nástroje GIS
ZPG - Základy Počítačové Grafiky cvičení 11. Obsah cvičení  Prezentace  Opakování (Viditelnost,Stínování těles)  Robertsův algoritmus.
Modelování v AUTOCADU Křivky v prostoru, modelování z těles a povrchů,
směr kinematických veličin - rychlosti a zrychlení,
T.A. Edison Tajemství úspěchu v životě není v tom, že děláme, co se nám líbí, ale, že nacházíme zalíbení v tom, co děláme.
Křivočarý pohyb bodu. křivočarý pohyb bodu,
Světelné jevy Optika II..
Modelování v prostoru.
Odraz světla. Zákon odrazu světla
Když tři rozměry nestačí...
Počítačová podpora konstruování I 4. přednáška František Borůvka.
Strojírenství Technické kreslení Pravoúhlé promítání (ST16)
FYZIKA PRO IV. ROČNÍK GYMNÁZIA SPECIÁLNÍ TEORIE RELATIVITY
Digitální projektory. LCD (Liquid Crystal Display) DLP (Digital Light Processing)
Když na rozhraní dvou prostředí dopadají dva paprsky různých barev (např. červený a fialový) pod stejnými úhly dopadu, budou úhly lomu obou paprsků různé.
Autor:Jiří Gregor Předmět/vzdělávací oblast: Informační a komunikační technologie Tematická oblast:Práce se standardním aplikačním programovým vybavením.
Neuronové sítě na grafických akcelerátorech Ondřej Zicha, Jiří Formánek.
Informatika pro ekonomy II přednáška 10
Frenetův trojhran křivky
3D modelář – primitivní tělesa, vlastnosti a transformace VY_32_INOVACE_Design1r0115Mgr. Jiří Mlnařík.
3D CG. Základy geometrie Vertex A (x,z,y,(w)) Faceta(triangle) F(A,B,C) (polygon) F(A,B,C,D), konvexní, nekonvexní Objekt Většinou (0,1) rozměr.
Úvod do 3D geometrie První přednáška mi vyšla na 90 minut po slajd 31 (3D representace modelů). Ten zbytek jsem pak prolítnul tak za pět minut, ale myslím.
Zobrazování - základy..
Ovládání počítače laserovým ukazovátkem Tomáš PokornýZávěrečná maturitní práce.
Počítačová grafika Výpočetní technika.
Vektorová grafika.
Co dnes uslyšíte? Kosoúhlé průměty povrchů těles.
Počítačová grafika III – Path tracing Jaroslav Křivánek, MFF UK
Interactive Relighting of Dynamic Refractive Objects Tomáš Šváb & Adam Dominec.
Databázové systémy Informatika pro ekonomy, př. 18.
Způsoby uložení grafické informace
FYZIKA PRO IV. ROČNÍK GYMNÁZIA - OPTIKA
Barvení grafů Platónská tělesa
Vektorová grafika. Vektorové entity Úsečka Kružnice, elipsa, kruhový oblouk,… Složitější křivky, splajny, Bézierovy křivky, … Plochy Tělesa Modely.
POČÍTAČOVÉ HRY CVIČENÍ 9. Shadery Z „Shading“ = „stínování“ Logika vykreslování Vertex data >> obraz Implementováno na GPU PHA cvičení 9 2.
3D modelář – základy práce se scénou a zobrazením VY_32_INOVACE_Design1r0114Mgr. Jiří Mlnařík.
Anti – Aliasing Ondřej Burkert atrey.karlin.mff.cuni.cz/~ondra/stranka.
Pokročilé architektury počítačů (PAP_08.ppt) Karel Vlček, katedra Informatiky, FEI VŠB Technická Univerzita Ostrava.
Vytvoření dokumentu bylo financováno ze zdrojů Evropského sociálního fondu a státního rozpočtu ČR. Registrační číslo projektu: CZ.1.07/1.1.32/ Počítačová.
Zobrazování.
Způsoby uložení grafické informace
Geografické informační systémy pojetí, definice, součásti
Platónova tělesa.
Pokročilé osvětlovací techniky © 2005 Josef Pelikán, MFF UK Praha
CHRONOPHOBIA Autor: Bc. Michal Jirouš Vedoucí práce: Ing. Petr Felkel Ph.D. (3D akční hra)
REPREZENTACE 3D SCÉNY JANA ŠTANCLOVÁ Obrázky (popř. slajdy) převzaty od RNDr. Josef Pelikán, CSc., KSVI MFF UK.
ČVUT FEL Katedra počítačů Matematické a fyzikální výpočty na grafických kartách (DirectX 9 + DirectX 10) Bc. Jindřich Gottwald vedoucí: Ing. Ivan Šimeček,
BU51 CAD systémy RNDr. Helena Novotná. Obsah přednášek  Co potřebujeme z teorie  Ovládání a přizpůsobení AutoCADu (profily, šablony, pracovní prostory,
Hardware pro počítačovou grafiku © Josef Pelikán, MFF UK Praha PGR019
ŘEZ HRANOLU ROVINOU OB21-OP-STROJ-KOG-MAT-S
Základní techniky zobrazování © 2005 Josef Pelikán, MFF UK Praha
Zobrazování. Modelování a zobrazování Realita (sutečnost) model Obraz(y) modelu modelování Zobrazování (vizualizace)
Úvod do databázových systémů
směr kinematických veličin - rychlosti a zrychlení,
Moderní poznatky ve fyzice
Technické zobrazování
Geografické informační systémy
Informatika pro ekonomy přednáška 8
Třírozměrné modelování
Geografické informační systémy
Světlo Jan Rambousek jp7nz-JMInM.
Konstruktivní úlohy na rotačních plochách
Třída 3.B 3. hodina.
Transkript prezentace:

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

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, …

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])

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

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)

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”

„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

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

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  ”

Světelné směrové mapy N world space T R x y -z cos  cos h  cos e 

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

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

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

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)

Jedno rovinné zrcadlo stencil = 1

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é

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)

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ů

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)

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

shadow buffer Stínový depth-buffer („shadow map“) A B z = d A z = d B < d A (stín) z

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

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)

Stínové objemy I … světlo 1 … stín

Stínové objemy I - selhání 0 0 … světlo 1 … stín 0

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)

Stínové objemy II … světlo 1 … stín

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

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

projekce vlastního bodu (včetně vydělení homogenní složkou) : projekce nevlastního bodu: Průmět do nekonečna

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

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

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 ); …

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

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 ); …

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)

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

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

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

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

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

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í

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

Průnik - ukázka S1S1 S2S2 S3S

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

Odečítání - ukázka S1S1 X S2S2 I I II III X - S 1 - S 2 - S 1

Odečítání - výsledek S1S1 X S2S2 X - S 1 - S 2 - S 1 !

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

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

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: