ombre e riflessioni in tempo reale daniele marini parzialmente tratte de: haines-möller corso di...

31
Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Upload: saveria-napoli

Post on 01-May-2015

219 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Ombre e riflessioni in tempo reale

Daniele Marini

Parzialmente tratte de: Haines-Möller

Corso di Programmazione Grafica per il Tempo Reale

Page 2: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

2

Perchè• Dare maggiore realismo• Creare ”un’atmosfera”

Neverwinter Nights Blade of Darkness

Page 3: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

3

Cosa si ottiene

• Più indizi per comprendere la profondità e la forma

• Più facile l’orientamento

Page 4: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

4

Ricevitore

Sorgenti di luceCreatori d’ombra, ricevitori d’ombra

Sorgente

CreatoreCreatore ericevitore

Definizioni

Page 5: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

5

Tipi di sorgenti

Point light

ombra

area light

ombrapenombra

Tipologie

Page 6: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

6

Ombre nette, ombre sfumate (penombre)

Page 7: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

7

Come considerare le ombreCome considerare le ombreCome oggetti separati (l’ombra di Peter

Pan)Come volumi di spazio buioCome posizioni da cui la luce di una

sorgente non è visibileNotare che sono in ombra facce rivolte in

senso opposto alla sorgente

Page 8: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

8

Ombre pianeOmbre piane

• Un oggetto proietta un’ombra su una superficie piana

• Il meccanismo è simile a una proiezione prospettica: si tratta di individuare la matrice di proiezione

Page 9: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

9

Proiezione dell’ombraProiezione dell’ombral

v

ombra

y=0

y

px − lxvx − lx

=ly

ly − vy

px =lyvx − lxvyly − vy

pz =lyvz − lzvyly − vy

py = 0

p

M =

ly −lx 0 0

0 0 0 0

0 −lz ly 0

0 −1 0 ly

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

Matrice di proiezione:

Page 10: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

10

Proiezione su un piano qualsiasiProiezione su un piano qualsiasi

v

p

n

l

Equazione del piano:

Equazione del punto proiettato

Matrice di proiezione

π :n.x + d = 0

p = l −d + n.l

n.(v− l)v− l( )

M =

n.l + d − lxnx −lxny −lxnz −lxd

−lynx n.l + d − lyny −lynz −lyd

−lznx −lzny n.l + d − lznz −lzd

−nx −ny −nz n.l

⎢ ⎢ ⎢ ⎢

⎥ ⎥ ⎥ ⎥

Page 11: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

11

Memorizzare ombre pre-computate in texture

Page 12: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

12

Due algoritmi principali per geometrie qualsiasi

• Shadow mapping e shadow volumes– Considera un volume buio, è il più

diffuso e implementato hardware

• Lavora in tempo reale…• Shadow mapping è usato dal

software renderman della Pixar• Calcola il rendering a partire dalla

sorgente (il bianco indica punti più lontani, il nero più vicini)

Page 13: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

13

Shadow MapShadow Map Quando si calcola il rendering, controlla il

punto osservato rispetto allo shadow buffer– Se la profondità del punto è maggiore (epsilon) del

valore di shadow buffer l’oggetto è in ombra.

shadowdepth map

Per ogni pixel comparadistanza da luce di con

Profondità di memorizzata In shadow map

Page 14: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

14

RisultatoRisultato

Page 15: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

15

Shadow volumes Crea porzioni di volume in ombra da ciasun

poligono illuminato (triangolo) Ciascun traingolo crea 3 quadrilateri semi-

infiniti proiettati Quelli rivolti verso l’ossrvatore sono frontfacing,

gli altri backfacing

Page 16: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

16

Come funzionaCome funziona

Per testare un punto incrementa un contatore ogni volta che attraversi un lato frontafcing della piramide ombra e decrementa quando atraversi un backfacing

Se il contatore è maggiore di zero allora il pixel è in ombra

frontfacing

backfacing

Page 17: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

17

Shadow volume usa stencil buffer

• È un altro buffer di OGL in genere 8 bit per pixel• Quando si calcola rendering con stencil buffer si

possono eseguire somme, sottrazioni etc.• L’immagine ottenuta si può usare come

maschera per le fasi successive di rendering

StencilBufferMask

resu

ltRenderedimage

Page 18: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

18

Come si implementa shadow Come si implementa shadow volumes con stencil buffervolumes con stencil buffer

4 passi [Heidmann91]:– 1st Passo: rendi la scena con solo la luce ambiente– Inibisci l’aggiornamento dello Z-buffer e la scrittura nel

color buffer (disegna solo nello stencil).– 2nd passo: rendi nello stencil buffer i poligoni frontfacing

rispetto allo shadow volume, incrementa il contatore.– 3rd passo: rendi nello stencil buffer i poligoni backfacing

rispetto allo shadow volume, decrementa il contatore.– 4th passo: rendi le luci diffusive e speculari con lo stencil

buffer a 0.

Page 19: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

19

EsempioEsempio

Image courtesy of NVIDIA Inc.

Page 20: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

20

Unire più volumi ombraUnire più volumi ombra

Uno spigolo condiviso da due poligoni che ostacolano la luce crea quadrilateri che sono simultaneamente front e backfacing

Questo spigolo interno genera2 quadrilateri che si annullano

Page 21: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

21

Cercare gli spigoli di bordo Cercare gli spigoli di bordo (silhouette)(silhouette)

Dalla sorgente le ombre proiettate da spigoli interni non contribuiscono allo shadow volume.

Trovare gli spigoli della silhouette elimina molti quadrilateri di shadow volume inutili.

Page 22: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Screen spaceScreen space

• Con la disponibilità di pixel shader sono nati algoritmi che operano sul piano immagine.

• Screen space ambient occlusion (SSAO) può essere eseguito nella GPU.

• Per ogni pixel si valuta il livello di occlusione interrogando il buffer di profondità

22

Page 23: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Screen space Ambient Screen space Ambient OcclusionOcclusion

• Il grado di occlusione viene valutato calcolando la differenza di profondità del pixel con un pixel scelto casualmente

• Si usa un kernel ruotato in modo casuale per scegliere il pixel di comparazione

• Gli artefatti vengono eliminati con un antialiasing

23

Page 24: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Screen space Ambient Screen space Ambient OcclusionOcclusion

• E’ molto efficace per generare self shadows

• La complessità dipende solo dalla dimensione dell’immagine generata

24

Page 25: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Z-buffer Ambient OcclusionZ-buffer Ambient Occlusion

• Una copia dello z-buffer viene clampata, sfumata e sottratta dallo z-buffer

• Si genera così una mappa di differenze

• La mappa di differenze può esser ulteriormente clampata e e scalata per controllare la intensità dell’ombra

25

Page 26: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

Z-buffer Ambient OcclusionZ-buffer Ambient Occlusion

• Nell’ultimo passo si sottrae la mappa così generata dalla immagine

• E’ indipendente dal numero di poligoni, molto veloce

• Adatto per self shadows

26

Page 27: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

27

Riflessioni piane

• Le riflessioni si possono simulare con environment mapping

• Non è adatto per superfici piane • Anche la riflessione piana (specchio piano)

aiuta a capire la scena e le forme, accresce il realismo

• Basato sulla legge della riflessione speculare:– L’angolo di incidenza è uguale all’angolo di

riflessione

Page 28: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

28

Riflessioni piane

• Poniamo il piano in z=0• Applichiamo la trasformazione glScalef(1,1,-1);

• Il risultato:z

Page 29: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

29

Riflessioni piane• Nel calcolo delle ombre il backfacing diventa

frontfacing!• Anche le luci devoono venire riflesse • È necessario applicare il clipping (si usa lo stencil

buffer)• Esempio di clipping:

Page 30: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

30

Planar reflections

• Come funziona il rendering?• 1) metti nello stencil buffer i poligoni del

piano di base• 2) calcola il modello scalato con (1,1,-1),

ma mascheralo con lo stencil buffer• 3) rendi il piano di base (semi-trasparente)• 4) rendi il modello non trasformato con la

scala

Page 31: Ombre e riflessioni in tempo reale Daniele Marini Parzialmente tratte de: Haines-Möller Corso di Programmazione Grafica per il Tempo Reale

31

Esempio

• Invece del trucco della trasformazione di scala si puà riflettere la posizione di camera e la direzione del piano

• Quindi rendere l’immagine riflessa da quella camera