270 likes | 363 Views
Tietokonegrafiikan jatkokurssi T-111.5300 4 op. Lauri Savioja 02/06. Luento 4: Näkyvyystarkastelut ja varjot. Sisältö. Näkyvyystarkastelu Solurenderöinti Portaalirenderöinti Quad-/Octtree Varjot Varjotekstuurit Projektiovarjot Varjotilavuudet. Näkyvyystarkastelu. Miksi?
E N D
Tietokonegrafiikan jatkokurssiT-111.5300 4 op Lauri Savioja 02/06 Luento 4: Näkyvyystarkastelut ja varjot Näkyvyystarkastelut ja varjot / 1
Sisältö • Näkyvyystarkastelu • Solurenderöinti • Portaalirenderöinti • Quad-/Octtree • Varjot • Varjotekstuurit • Projektiovarjot • Varjotilavuudet Näkyvyystarkastelut ja varjot / 2
Näkyvyystarkastelu • Miksi? • Maailmat liian suuria • Näytönohjaimet ja tietokoneet liian hitaita • Voidaan tarkastella vain pientä osaa maailmasta • Turha piirtää sellaista mikä ei ole näkyvissä • Vaatii yleensä oman tietorakenteen • Vaatii myös jonkin verran laskentaa Näkyvyystarkastelut ja varjot / 3
Näkyvyystarkastelu • Tarkoituksena löytää mahdollisimman pieni PVS (Potentially Visible Set) • PVS sisältää renderöitävät polygonit • Saattaa sisältää joitain näkymättömissä olevia polygoneja • Jotkin editykselliset algoritmit saattavat parantaa PVS:ää ajan kuluessa, vaikka mikään ei olisi liikkunutkaan • Tälläinen on mm. Hybrid Graphics:n dPVS Näkyvyystarkastelut ja varjot / 4
Solurenderöinti • Jaetaan maailma soluihin • Renderöidään nykyinen solu ja sen naapurit • Haluttaessa voidaan renderöintialuetta laajentaa • Helppo implementoida • Sopii parhaiten suljettuihin sisätiloihin • Ongelma, jos naapurisolun läpi voi nähdä Näkyvyystarkastelut ja varjot / 5
Solurenderöinti • Implementointi • Jaetaan maailma soluihin • Solujen ei tarvitse olla tasakokoisia, yleensä huonejako on sopiva • Määritetään soluille naapuruussuhteet • Renderöidään nykyinen solu ja tarvittava määrä muita soluja 1. Renderöi nykyinen solu 2. Renderöi naapurisolut (3. Renderöi naapureiden naapurisolut) Näkyvyystarkastelut ja varjot / 6
Portaalirenderöinti • Maailma soluissa kuten solurenderöinnissäkin • Solujen välillä portaalipolygonit • Portaalipolygonia ei piirretä näkyviin • Toiseen soluun voi nähdä vain portaalipolygonin läpi • eli yleensä ovet ja ikkunat ovat portaalipolygoneja • Riittää tarkistaa, onko yhtään portaalipolygonia näkyvissä 1. Renderöi nykyinen solu (huone) 2. Näkyykö portaalipolygoneja? 3. Jos näkyy, niin renderöi niiden takana oleva solu ja toista portaalitestaus Näkyvyystarkastelut ja varjot / 7
Portaalirenderöinti • Portaalin takana oleva solu voidaan leikata portaalipolygonin reunoihin • Tällä voidaan minimoida piirrettävä polygonimäärä • Toisaalta sen leikkaaminen aiheuttaa lisää laskentaa • Portaaleilla on helppoa tehdä peili • Laitetaan vain portaalipolygoni osoittamaan takaisin samaan soluun • Peilien kanssa kannattaa olla varovainen, ettei tule päättymätöntä heijastusketjua • Yleensä heijastusportaaleissa lisätään laskuria, jolla voidaan rajoittaa rekursiosyvyys johonkin järkevään • Remedy:n Max Payne käyttää portaalirenderöintiä Näkyvyystarkastelut ja varjot / 8
BSP • Binary Space Partitioning • Vapaat tai axis-aligned jakotasot Näkyvyystarkastelut ja varjot / 9
Quad-/Octtree • Maailma voidaan myös jakaa esim. Quadtree:llä osiin • Puurakenteesta voidaan piirtää riittävän suuri haara, jolloin voidaan olettaa melko suurella todennäköisyydellä, että piirrettävään näkymään ei jää aukkoja • Tämä ei kuitenkaan ole täysin varmaa • Mikäli quadtree:tä käytetään esim. törmäystarkistuksiin, niin tällöin on helppo käyttää sitä myös renderöinnin rajoittamiseen • Sisätiloissa Quadtree:tä ei kannata käyttää, mutta ulkoilmaan se sopii paremmin Näkyvyystarkastelut ja varjot / 10
Varjot • Varjoilla saadaan paljon realistisemman näköistä valaistusta • Varjot vaativat aika paljon laskentaa • Varjot voidaan laskea monella eri tavalla • Varjotekstuurit • Projisoidut varjot • Varjotilavuudet • Shadow Map Näkyvyystarkastelut ja varjot / 11
Varjotekstuurit • Varjotekstuurit usein staattisia • Voidaan myös animoida hahmon animaation mukana • Varjotekstuurit nopeita käyttää • Resoluutio ei riitä varjojen heittämiseen kauas • Jos varjotekstuurin resoluutio riittävän suuri, niin silloin tekstuuri vie liikaa muistia • Varjotekstuurit lasketaan yleensä etukäteen, cpu:ta säästämättä, esim. radiositeetilla Näkyvyystarkastelut ja varjot / 12
Projektiovarjot • Heittää objektin varjon tasolle • Projisoitu kuva blendataan tason väriin • Melko nopea • Objekti projisoidaan tasolle valon näkökulmasta • Objekti projisoidaan tasolle • Piirretään mustalla -> varjo Näkyvyystarkastelut ja varjot / 13
Projektiovarjot • Projisointiin tarvittava projisointimatriisi dot-light[0]*plane.a -light[1]*plane.a -light[2]*plane.a -light[3]*plane.a -light[0]*plane.b dot-light[1]*plane.b -light[2]*plane.b -light[3]*plane.b -light[0]*plane.c -light[1]*plane.c dot-light[2]*plane.c -light[3]*plane.c -light[0]*plane.d -light[1]*plane.d -light[2]*plane.d dot-light[3]*plane.d light = valon sijainti plane = tason yhtälön kertoimet dot = light:n ja plane:n pistetulo • Projisoidaan objektin kaikki vertexit Näkyvyystarkastelut ja varjot / 14
Projektiovarjot • Projisoinnissa otettava huomioon syvyystesti • 1. Varjon voi laittaa hieman erilleen tasosta • 2. Syvyystestin voi ottaa pois käytöstä varjojen piirron ajaksi • Stencil-puskurilla voidaan rajoittaa varjojen piirtoalue halutulle alueelle tasossa • Monta valonlähdettä -> monta projisointia • Ongelmia • Eivät toimi konkaaveilla objekteilla • Ei ole hyvää tapaa heittää varjoa toisen objektin päälle • Voidaan tehdä käsittelemällä jokaista polygonia projisoitavana tasona • Tasossa olevat heijastukset näkyvät varjon läpi Näkyvyystarkastelut ja varjot / 15
Fake Shadows using Projective Textures • Separate obstacle and receiver • Compute b/w image of obstacle from light • Use image as projective texture for each receiver Image from light source BW image of obstacle Final image Figure from Moller & Haines “Real Time Rendering” Näkyvyystarkastelut ja varjot / 16
Varjotilavuudet • Idea: Heitetään viivat valonlähteestä objektin reunojen kautta • Näistä luodaan varjotilavuus objektin taakse • Kun varjotilavuus on luotu, pitää vielä määritellä mitkä pisteet kuuluvat ko. tilavuuteen Näkyvyystarkastelut ja varjot / 17
Varjotilavuudet • Varjotilavuuden luontiin tarvitaan objektin siluetti • Siluetti löytyy esim. niin, että sen toisella puolella olevan polygonin normaali osoittaa kohti valoa ja toisella puolella poispäin valosta • Pisteen testaus: • Heitetään säde maailmasta kohti katsojaa ja lasketaan kuinka monta kertaa se menee tai poistuu varjotilavuudesta • Tähän voidaan käyttää stencil-puskuria Näkyvyystarkastelut ja varjot / 18
Shadow Volumes • Shoot a ray from the eye to the visible point • Increment/decrement a counter each time we intersect a shadow volume polygon (check z buffer) • If the counter ≠ 0,the point is in shadow Näkyvyystarkastelut ja varjot / 19
Varjotilavuudet • 1. Renderöi maailma normaalisti ambientilla ja emissiivisellä valaistuksella • 2. Renderöi varjotilavuudet, disabloi kirjoitus kuvapuskuriin ja syvyyspuskuriin ja kirjoita vain stencil-puskuriin, laske kuinka montaa kertaa mennään varjotilavuuteen sisään (piirrä siis vain etureunat varjoista) • 3. Renderöi kuten kohdassa 2., mutta nyt lasketaan poistumiset varjotilavuudesta, eli takareunat ja vähennetään ne stencilistä • 4. Renderöi maailma diffuusilla ja heijastusvalaistuksella vain sellaisista kohdista, joissa stencil-puskurissa on nollaa • Ongelmia: • Hidas, vaatii neljä rendausta • Kauempi leikkaustaso voi leikata varjotilavuuden takareunan pois, jolloin varjot saattavat muuttua “negatiiveiksi” tai ne voivat häipyä kokonaan Näkyvyystarkastelut ja varjot / 20
Varjotilavuudet • OpenGL-pseudo implementaatio Draw(ambient); // maailma ambientilla valolla glDepthMask(GL_FALSE); // disabloidaan z-testi glStencilOp(..GL_INCR); // lisätään stenciliä glCullFace(GL_BACK); // piirretään vain etureunat DrawShadowVolumes(); glStencilOp(..GL_DECR); // vähennetään stenciliä glCullFace(GL_FRONT); // piirretään takareunat DrawShadowVolumes(); glDepthMask(GL_TRUE); glStencilFunc(GL_EQUAL, 0, 1) // piirto, jos stencil = 0 Draw(other); // maailma diffuusilla ja speculaarilla Näkyvyystarkastelut ja varjot / 21
Shadow Maps • Laske ”Depth map” valosta katsottuna • Projisoi katseluavaruuteen • Päättele mitkä alueet on varjossa Näkyvyystarkastelut ja varjot / 22
Shadow maps • In Renderman • (High-end production software) Näkyvyystarkastelut ja varjot / 23
Shadow Mapping • Texture mapping with depth information • ≥ 2 passes through the pipeline • Compute shadow map (depth from light source) • Render final image(check shadow map to see if points are in shadow) Figure from Foley et al. “Computer Graphics Principles and Practice” Näkyvyystarkastelut ja varjot / 24
Pehmeät varjot • Reaalimaailman varjot lähes aina pehmeitä • Tietokoneella raskas tehdä pehmeitä varjoja • Säteen seuranta ja radiositeetti ei reaaliaikatekniikoita • Viime aikoina ilmaantunut muutamia eri tekniikoita tehdä pehmeitä varjoja yksinkertaisille maailmoille reaaliajassa • Objektien siluetteihin voidaan liittää pehmentävä reunus varjojen laskentaa varten Näkyvyystarkastelut ja varjot / 25
Säteen seuranta • Säteen seurannassa (path tracing) seurataan ruudusta maailmaan “heitettyjä” säteitä • Säteen osuessa pintaan se heijastuu ja siroaa, materiaalin mukaan • Lopullinen väri määräytyy, kun riittävä määrä heijastuksia on tullut tai kun säde on osunut valonlähteeseen • Tuloksena realistinen kuva ja pehmeät varjot Näkyvyystarkastelut ja varjot / 26
Radiositeetti • Radiositeettilaskennalla saavutetaan täydelliset varjot ideaalissa diffuusissa tapauksessa • Vaatii paljon laskenta-aikaa, ei reaaliaikatekniikkaa • Lasketaan pinnoilta toisille heijastuvia valoja • Saadaan pehmeät varjot ja muutenkin realistinen kuva Näkyvyystarkastelut ja varjot / 27