14.04.2013 Views

Sombras en tiempo real - Un sitio web

Sombras en tiempo real - Un sitio web

Sombras en tiempo real - Un sitio web

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!