Sombras en tiempo real - Un sitio web
Sombras en tiempo real - Un sitio web
Sombras en tiempo real - Un sitio web
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Sombras</strong> <strong>en</strong> <strong>tiempo</strong> <strong>real</strong><br />
Pres<strong>en</strong>tación por Marc Förster<br />
<strong>en</strong> el curso de Realidad virtual y animación<br />
<strong>Un</strong>iversidad Rey Juan Carlos, Abril 2004
» Motivación<br />
» Clasificación<br />
» Cuatro métodos actuales:<br />
Manera de proceder, v<strong>en</strong>tajas y desv<strong>en</strong>tajas<br />
Sinopsis<br />
2
» Donde hay luz, hay sombra...<br />
¿Por qué crear sombras?<br />
» <strong>Sombras</strong> indican posiciones relativas de objetos.<br />
» Las sombras del sol nos dan información sobre la posición<br />
geográfica y la hora del día.<br />
» <strong>Sombras</strong> crean ambi<strong>en</strong>te.<br />
3
¿Por qué crear sombras?<br />
4
Circle of Stone and Shadow, TTLG.com<br />
¿Por qué crear sombras?<br />
5
¿Dónde voy a aterrizar?<br />
¿Por qué crear sombras?<br />
6
» Modelos de iluminación globales:<br />
sombras (físicam<strong>en</strong>te) correctas<br />
» Modelos locales: trucos<br />
Creación de sombras<br />
7
» Repres<strong>en</strong>tación de esc<strong>en</strong>as de cualquier complejidad<br />
» Objetos de cualquier tipo<br />
» Autosombreado (correcto)<br />
Exig<strong>en</strong>cias<br />
» Rapidez, universalidad y corrección física (la mayor posible)<br />
8
Basado <strong>en</strong> objeto vs. basado <strong>en</strong> imag<strong>en</strong><br />
» Producción de sombras significa cálculo de visibilidad desde la<br />
posición de la fu<strong>en</strong>te luminosa.<br />
» Basado <strong>en</strong> objeto ⇔ basado <strong>en</strong> imag<strong>en</strong>, cf. visibilidad<br />
» V<strong>en</strong>tajas y desv<strong>en</strong>tajas típicas de métodos<br />
basados <strong>en</strong> objeto y <strong>en</strong> imag<strong>en</strong>:<br />
complejidad, Aliasing<br />
9
Fu<strong>en</strong>te luminosa puntual ⇒ sombra nítida<br />
Fu<strong>en</strong>te luminosa a<strong>real</strong> ⇒ sombra borrosa<br />
<strong>Sombras</strong> nítidas vs. borrosas<br />
10
» Trucos,<br />
o sampling de fu<strong>en</strong>tes luminosas a<strong>real</strong>es<br />
» Problemas:<br />
rapidez, corrección<br />
<strong>Sombras</strong> borrosas<br />
11
» I <strong>Sombras</strong> planares (basado <strong>en</strong> imag<strong>en</strong>)<br />
Métodos<br />
II <strong>Sombras</strong> como textura proyectiva (basado <strong>en</strong> imag<strong>en</strong>)<br />
III Shadow maps (basado <strong>en</strong> imag<strong>en</strong>, universal)<br />
IV Volúm<strong>en</strong>es de sombra (basado <strong>en</strong> objeto, universal)<br />
12
Caso s<strong>en</strong>cillo: proyección <strong>en</strong> plano XZ<br />
<strong>Sombras</strong> planares<br />
13
<strong>Sombras</strong> planares: valoración<br />
+ Rápido, implem<strong>en</strong>tación muy s<strong>en</strong>cilla<br />
– <strong>Sombras</strong> no limitadas al recipi<strong>en</strong>te. Solución: st<strong>en</strong>ciling<br />
– Sólo superficies planares como recipi<strong>en</strong>tes<br />
– Z fighting<br />
Solución: no Depth test antes del r<strong>en</strong>dering de sombras<br />
– Antisombras, sombras de objetos al otro lado del recipi<strong>en</strong>te<br />
Solución: Clipping volume<br />
14
1. Imag<strong>en</strong> del ocultador<br />
desde la fu<strong>en</strong>te luminosa<br />
<strong>Sombras</strong> como textura proyectiva<br />
2. Guardar <strong>en</strong> negro<br />
como textura.<br />
3. Proyectar<br />
sobre recipi<strong>en</strong>te.<br />
15
<strong>Sombras</strong> como textura proyectiva: valoración<br />
+ Recipi<strong>en</strong>tes de cualquier forma, no sólo planares<br />
– Todavía no autosombreado<br />
– Antisombras, cf. <strong>Sombras</strong> planares<br />
16
» Publicado por Lance Williams <strong>en</strong> 1978<br />
» Método two-pass, basado <strong>en</strong> imag<strong>en</strong><br />
» Apoyo hardware <strong>en</strong> tarjetas gráficas modernas<br />
(Projective texturing, Depth buffer)<br />
» Disponible <strong>en</strong> Op<strong>en</strong>GL por ext<strong>en</strong>siones<br />
Shadow mapping<br />
17
Luxo Jr., Pixar Studios 1986<br />
Shadow mapping<br />
18
Shadow mapping: algoritmo<br />
» 1º R<strong>en</strong>dering de la esc<strong>en</strong>a desde la posición de la luz (1 ª vuelta).<br />
2º Guardar los valores Z como textura (Depth map).<br />
3º R<strong>en</strong>dering de la esc<strong>en</strong>a desde la vista del observador (2 ª vuelta):<br />
* Transformar las coord<strong>en</strong>adas de fragm<strong>en</strong>tos <strong>en</strong> el espacio de la luz.<br />
* Comparar los valores Z:<br />
z(Depth map) < z(luz) ⇒ fragm<strong>en</strong>to sombreado<br />
z(Depth map) ≈ z(luz) ⇒ fragm<strong>en</strong>to alumbrado<br />
19
Shadow mapping: Depth map<br />
1 ª vuelta<br />
20
Shadow mapping: resultado<br />
2 ª vuelta<br />
21
Depth map<br />
Ocultador<br />
Shadow mapping: fragm<strong>en</strong>to sombreado<br />
Valor Z<br />
<strong>en</strong> Depth map<br />
Región sombreada<br />
Plano de imag<strong>en</strong><br />
22
Op<strong>en</strong>GL Transformation pipeline<br />
Shadow mapping: implem<strong>en</strong>tación<br />
23
Shadow mapping: implem<strong>en</strong>tación<br />
24
Shadow mapping: implem<strong>en</strong>tación<br />
» Primera vuelta (producción de la Depth map):<br />
glMatrixMode(GL_PROJECTION);<br />
gluPerspective(P light );<br />
glMatrixMode(GL_MODELVIEW);<br />
gluLookAt(L -1 );<br />
R<strong>en</strong>dering de la esc<strong>en</strong>a con matrix<br />
Model Transformation M;<br />
25
Shadow mapping: implem<strong>en</strong>tación<br />
» Segunda vuelta (proyección de la Depth map):<br />
glMatrixMode(GL_PROJECTION);<br />
gluPerspective(P eye );<br />
glMatrixMode(GL_MODELVIEW);<br />
gluLookAt(V -1 );<br />
glTexG<strong>en</strong>(GL_EYE_LINEAR);<br />
glMatrixMode(GL_TEXTURE);<br />
glTranslate(.5, .5, 0.); // [-1, 1]-><br />
glScalef(.5, .5, 1.); // TC [0, 1]<br />
gluPerspective(P light );<br />
gluLookAt(L -1 );<br />
glMatrixMode(GL_MODELVIEW);<br />
R<strong>en</strong>dering de la esc<strong>en</strong>a con matrix<br />
Model Transformation M;<br />
26
Shadow mapping: implem<strong>en</strong>tación<br />
» Comparación de profundidad <strong>en</strong> la Texture unit<br />
según la coord<strong>en</strong>ada R:<br />
(automatizado <strong>en</strong> Op<strong>en</strong>GL con la ext<strong>en</strong>sión SGIX_shadow)<br />
27
Shadow mapping: implem<strong>en</strong>tación<br />
» Último paso de la segunda vuelta:<br />
TRUE ⇒ int<strong>en</strong>sidad(fragm<strong>en</strong>to) = 1<br />
FALSE ⇒ int<strong>en</strong>sidad(fragm<strong>en</strong>to) = 0<br />
» Será incluido <strong>en</strong> el cálculo de iluminación.<br />
» Con parámetro de filtración GL_LINEAR:interpolación<br />
bilineal de los resultados de la comparación (¡no de<br />
las valores Z!) con los de los cuatro fragm<strong>en</strong>tos vecinos.<br />
28
Shadow mapping: filtración<br />
GL_NEAREST GL_LINEAR<br />
29
Shadow mapping: problemas<br />
» Aliasing, autosombreado incorrecto<br />
Solución: Bias/Polygon offset<br />
30
» Demasiado Bias<br />
Shadow mapping: problemas<br />
» Resolución insufici<strong>en</strong>te de la Depth map<br />
31
Shadow mapping: valoración<br />
+ No hace falta t<strong>en</strong>er conocimi<strong>en</strong>to de la geometría de la esc<strong>en</strong>a<br />
(se pued<strong>en</strong> usar superficies analíticas).<br />
+ Implem<strong>en</strong>tación s<strong>en</strong>cilla, apoyo hardware<br />
(p.ej. GeForce 3)<br />
– Las fu<strong>en</strong>tes luminosas deb<strong>en</strong> hallarse fuera de la esc<strong>en</strong>a.<br />
– Necesita un Bias/Polygon offset dep<strong>en</strong>di<strong>en</strong>te de la esc<strong>en</strong>a.<br />
32
» Propuesto 1977 por Franklin Crow<br />
Volúm<strong>en</strong>es de sombra<br />
» Empleo del St<strong>en</strong>cil buffer por Heidmann 1991<br />
» Perfeccionado por John Carmack para Quake/Doom 3<br />
» Método multipass, basado <strong>en</strong> objeto<br />
» Apoyo hardware (St<strong>en</strong>cil buffer)<br />
33
Fu<strong>en</strong>te luminosa<br />
Ocultador<br />
Volúm<strong>en</strong>es de sombra<br />
Volum<strong>en</strong> de sombra<br />
(semiespacio)<br />
34
» cálculo de regiones sombreados 3D<br />
Volúm<strong>en</strong>es de sombra<br />
» Seguir el rayo de vista hasta el objeto. En caso que el rayo <strong>en</strong>tre<br />
<strong>en</strong> más volúm<strong>en</strong>es de sombra que salga ⇒ sombra.<br />
» Método Brute force: un volum<strong>en</strong> de sombra para cada polígono<br />
Mejor: un volum<strong>en</strong> para cada silueta de objeto<br />
<br />
35
Volúm<strong>en</strong>es de sombra: construcción<br />
» Superficies laterales del volum<strong>en</strong> de sombra<br />
(arista AB pert<strong>en</strong>ece a la silueta, L posición de la fu<strong>en</strong>te<br />
luminosa o su dirección <strong>en</strong> caso de Distant light):<br />
1º vértice: (Bx, By, Bz, 1)<br />
2º vértice: (Ax, Ay, Az, 1)<br />
3º vértice: (Ax-Lx, Ay-Ly, Az-Lz, 0)<br />
4º vértice: (Bx-Lx, By-Ly, Bz-Lz, 0)<br />
36
Volúm<strong>en</strong>es de sombra: test de sombra<br />
» Enumerar <strong>en</strong>tradas y salidas <strong>en</strong>/de sombras con St<strong>en</strong>cil buffer.<br />
eye<br />
po<strong>sitio</strong>n<br />
zero<br />
+1 +2<br />
+1<br />
+3 +2<br />
shadowing object<br />
zero<br />
shadow volume count: +1+1+1-1 = 2<br />
shadowed object<br />
37
Volúm<strong>en</strong>es de sombra: algoritmo<br />
» 1º Apagar fu<strong>en</strong>tes luminosas<br />
y r<strong>en</strong>derizar la parte ambi<strong>en</strong>tal de la esc<strong>en</strong>a (1 ª vuelta).<br />
2º Susp<strong>en</strong>der escritura <strong>en</strong> Z buffer y Colour buffer.<br />
3º Z test: zPass, activar Back face culling.<br />
4º R<strong>en</strong>derizar volúm<strong>en</strong>es de sombra,<br />
increm<strong>en</strong>tando el St<strong>en</strong>cil buffer (2 ª vuelta).<br />
. . .<br />
38
Volúm<strong>en</strong>es de sombra: algoritmo<br />
» 5º Activar Front face culling.<br />
6º R<strong>en</strong>derizar volúm<strong>en</strong>es de sombras,<br />
decrem<strong>en</strong>tando el St<strong>en</strong>cil buffer (3 ª vuelta).<br />
7º Activar escritura <strong>en</strong> Colour buffer,<br />
activar Bl<strong>en</strong>ding aditivo, <strong>en</strong>c<strong>en</strong>der fu<strong>en</strong>tes luminosas.<br />
8º R<strong>en</strong>derizar la parte difuso/especular de la esc<strong>en</strong>a <strong>en</strong> las<br />
áreas con valor del St<strong>en</strong>cil buffer de 0 (4 ª vuelta).<br />
39
eye<br />
Volúm<strong>en</strong>es de sombra: Capping<br />
near plane<br />
volume clipped ⇒<br />
missing st<strong>en</strong>cil increm<strong>en</strong>t<br />
light<br />
correct st<strong>en</strong>cil<br />
in-out<br />
Volúm<strong>en</strong>es de sombra<br />
deb<strong>en</strong> ser completos.<br />
40
Volúm<strong>en</strong>es de sombra: valoración<br />
+ No Aliasing, ya que basado <strong>en</strong> objeto<br />
+ Fu<strong>en</strong>tes luminosas pued<strong>en</strong> <strong>en</strong>contrarse d<strong>en</strong>tro de la esc<strong>en</strong>a.<br />
+ St<strong>en</strong>ciling no requiere accesos a memoria adicionales.<br />
– Capping prop<strong>en</strong>so a fallos<br />
– Observador <strong>en</strong> sombra ⇒ valor incorrecto del St<strong>en</strong>cil buffer<br />
Solución: inicializar St<strong>en</strong>cil buffer con valores ≠ 0<br />
– ¿View plane medio sombreado?<br />
41
Volúm<strong>en</strong>es de sombra según Carmack<br />
» Far clip plane está <strong>en</strong> la infinidad.<br />
» zFail test <strong>en</strong> lugar de zPass test<br />
42
Volúm<strong>en</strong>es de sombra según Carmack<br />
» #(frontfacing polygons crossed) > #(backfacing p. c.) ≡<br />
#(backfacing polygons not se<strong>en</strong>) > #(frontfacing p. n. s.)<br />
Volum<strong>en</strong> de<br />
sombra<br />
Objeto<br />
r<strong>en</strong>derizado<br />
zPass↓<br />
↑zFail<br />
!<br />
-∞<br />
43
Volúm<strong>en</strong>es de sombra según Carmack<br />
» Matriz de proyección estándar para transformar<br />
las coord<strong>en</strong>adas del espacio de imag<strong>en</strong> <strong>en</strong> el espacio Clip:<br />
44
Volúm<strong>en</strong>es de sombra según Carmack<br />
» Valor límite de P con Far →∞:<br />
45
Volúm<strong>en</strong>es de sombra según Carmack:<br />
precisión del Depth buffer<br />
» Puntos <strong>en</strong> la infinidad:<br />
P = Far/(Far-Near)<br />
» Factor de escalación para repres<strong>en</strong>tar (-)∞<br />
<strong>en</strong> el Depth buffer: (Far-Near)/Far ≈ 1 (típicam<strong>en</strong>te)<br />
⇒ casi no hay pérdida.<br />
46
Volúm<strong>en</strong>es de sombra según Carmack: construcción<br />
» La unión de tres conjuntos de polígonos resulta <strong>en</strong><br />
volúm<strong>en</strong>es de sombra completos:<br />
1º Las aristas de silueta, proyectado <strong>en</strong> la infinidad<br />
2º Los polígonos del ocultador apartados de la luz, también<br />
proyectado <strong>en</strong> la infinidad<br />
3º Los polígonos del ocultador vuelto hacia la luz<br />
47
Volúm<strong>en</strong>es de sombra según Carmack: algoritmo<br />
» 0º Sustituir la matriz de proyección estándar.<br />
1º Apagar fu<strong>en</strong>tes luminosas<br />
y r<strong>en</strong>derizar la parte ambi<strong>en</strong>tal de la esc<strong>en</strong>a (1 ª vuelta).<br />
2º Susp<strong>en</strong>der escritura <strong>en</strong> Z buffer y Colour buffer.<br />
3º Z test: zFail, activar Front face culling.<br />
4º R<strong>en</strong>derizar volúm<strong>en</strong>es de sombra,<br />
increm<strong>en</strong>tando el St<strong>en</strong>cil buffer (2 ª vuelta).<br />
. . .<br />
48
Volúm<strong>en</strong>es de sombra según Carmack: algoritmo<br />
» 5º Activar Back face culling.<br />
6. R<strong>en</strong>derizar volúm<strong>en</strong>es de sombras,<br />
decrem<strong>en</strong>tando el St<strong>en</strong>cil buffer (3 ª vuelta).<br />
7º Activar escritura <strong>en</strong> Colour buffer,<br />
activar Bl<strong>en</strong>ding aditivo, <strong>en</strong>c<strong>en</strong>der fu<strong>en</strong>tes luminosas.<br />
8º R<strong>en</strong>derizar la parte difuso/especular de la esc<strong>en</strong>a <strong>en</strong> las<br />
áreas con valor del St<strong>en</strong>cil buffer de 0 (4 ª vuelta).<br />
49
Volúm<strong>en</strong>es de sombra según Carmack: valoración<br />
+ No hay ningún problema con la posición del observador:<br />
no hace falta Capping, valor inicial del St<strong>en</strong>cil buffer siempre 0<br />
+ Implem<strong>en</strong>tación s<strong>en</strong>cilla (p.ej. con Op<strong>en</strong>GL)<br />
– Esc<strong>en</strong>as pued<strong>en</strong> componerse solam<strong>en</strong>te de objetos poligonales<br />
(≡ volúm<strong>en</strong>es de sombras estándar).<br />
– Factible <strong>en</strong> <strong>tiempo</strong> <strong>real</strong> tal vez sólo con siluetas precomputadas<br />
(≡ volúm<strong>en</strong>es de sombras estándar)<br />
50
» No hay imág<strong>en</strong>es <strong>real</strong>istas sin sombras.<br />
» <strong>Sombras</strong> correctas son caras (efecto global).<br />
» <strong>Sombras</strong> borrosas: problemáticas<br />
» Todos los métodos son corri<strong>en</strong>tes.<br />
Elección del algoritmo dep<strong>en</strong>de de:<br />
* Aplicación/calidad<br />
* Complejidad y geometría de la esc<strong>en</strong>a<br />
* Hardware<br />
Conclusión<br />
51
» ¿Preguntas?<br />
<strong>Sombras</strong> de <strong>tiempo</strong> <strong>real</strong><br />
52
Refer<strong>en</strong>cias<br />
» Franklin C. Crow (1977). Shadow Algorithms for Computer Graphics.<br />
SIGGRAPH Proceedings 11/2: 242ff.<br />
» Lance Williams (1978). Casting Curved Shadows on Curved Surfaces.<br />
Computer Graphics 12/3: 270ff.<br />
» Tim Heidmann (1991). Real shadows, <strong>real</strong> time. Iris <strong>Un</strong>iverse 18: 23ff.<br />
Silicon Graphics Inc.<br />
» Yulan Wang & Stev<strong>en</strong> Molnar (1994). Second Depth Shadow<br />
Mapping. UNC-CS Technical Report TR94-019.<br />
. . .<br />
53
Refer<strong>en</strong>cias<br />
» Paul S. Heckbert & Michael Herf (1997). Simulating Soft Shadows<br />
with Graphics Hardware. Technical Report CMU-CS-97-104.<br />
Carnegie Mellon <strong>Un</strong>iversity.<br />
» Tomas Möller & Eric Haines (1999). Real-Time R<strong>en</strong>dering.<br />
Natick, MA: A. K. Peters.<br />
» Cass Everitt & Mark J. Kilgard (2002). Practical and Robust St<strong>en</strong>ciled<br />
Shadow Volumes for Hardware-Accelerated R<strong>en</strong>dering. NVIDIA<br />
White Paper.<br />
. . .<br />
54
Refer<strong>en</strong>cias<br />
» Stefan Brabec (2002). Pres<strong>en</strong>tación: Computer Graphics 2 – Graphics<br />
Hardware and Op<strong>en</strong>GL Shadows. Saarbrück<strong>en</strong>: Max-Planck-Institut<br />
für Informatik.<br />
» Cass Everitt, Ashu Rege & Cem Ceb<strong>en</strong>oyan. Hardware Shadow<br />
Mapping. NVIDIA White Paper.<br />
55