Corso di Programmazione Grafica per il Tempo Reale
Ombre e riflessioni in
tempo reale
Daniele Marini
Parzialmente tratte de: Haines-Möller
Perchè
• Dare maggiore realismo
• Creare ”un’atmosfera”
Neverwinter Nights
Blade of Darkness
2
Cosa si ottiene
• Più indizi per comprendere la profondità e la forma
• Più facile l’orientamento
3
Definizioni
Sorgenti di luce
 Creatori d’ombra, ricevitori d’ombra

Sorgente
Creatore e
ricevitore
Creatore
Ricevitore
4
Tipologie

Tipi di sorgenti
Point light
ombra
area light
penombra
ombra
5
Ombre nette, ombre sfumate
(penombre)
6
Come considerare le ombre
Come oggetti separati (l’ombra di Peter
Pan)
 Come volumi di spazio buio
 Come posizioni da cui la luce di una
sorgente non è visibile
 Notare che sono in ombra facce rivolte in
senso opposto alla sorgente

7
Ombre 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
8
Proiezione dell’ombra
l
px  lx
 y
v x  lx ly  v y
l
y
v
px 
ly v x  lx v y
ly  v y
pz 
ly v z  lzv y
ly  v y
py  0
p
ombra
y=0

Matrice di proiezione:
ly

0

M
0

0
lx
0
lz
0
0
ly
1
0
0 

0 
0 

ly 
9
Proiezione su un piano qualsiasi
l
Equazione del piano:
 : n.x  d  0
Equazione del punto proiettato
v
pl

n
d  n.l
v  l
n.(v  l)
p

Matrice di proiezione

n.l  d  lx n x

ly n x

M
 lz n x

 n x
lx n y
n.l  d  ly n y
lz n y
lx n z
ly n z
n.l  d  lz n z
n y
n z
lx d

ly d
lz d

n.l 
10
Memorizzare ombre precomputate in texture
11
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)
12
Shadow 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.
shadow
depth map
Per ogni pixel compara
distanza da luce di con
Profondità di memorizzata
In shadow map
13
Risultato
14
Shadow volumes



Crea porzioni di volume in ombra da ciasun
poligono illuminato (triangolo)
Ciascun traingolo crea 3 quadrilateri semiinfiniti proiettati
Quelli rivolti verso l’ossrvatore sono frontfacing,
gli altri backfacing
15
Come 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
backfacing
frontfacing
16
Shadow volume usa stencil
buffer
Stencil
Buffer
Mask
Rendered
image
result
• È 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
17
Come si implementa shadow
volumes 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.
18
Esempio
Image courtesy of NVIDIA Inc.
19
Unire più volumi ombra

Uno spigolo condiviso da due poligoni
che ostacolano la luce crea quadrilateri
che sono simultaneamente front e
backfacing
Questo spigolo interno genera
2 quadrilateri che si annullano
20
Cercare gli spigoli di bordo
(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.
21
Screen 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
Screen space Ambient
Occlusion
• 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
Screen space Ambient
Occlusion
• E’ molto efficace per generare self
shadows
• La complessità dipende solo dalla
dimensione dell’immagine generata
24
Z-buffer Ambient Occlusion
• Una copia dello z-buffer viene
clampata, sfumata e sottratta dallo zbuffer
• 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
Z-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
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
27
Riflessioni piane
• Poniamo il piano in z=0
• Applichiamo la trasformazione
glScalef(1,1,-1);
• Il risultato:
z
28
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:
29
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
30
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
31
Scarica

Riflessioni piane