Sombras - Centro de Computación Gráfica

Transcripción

Sombras - Centro de Computación Gráfica
Fundamentos y Técnicas en Computación Gráfica
INTRODUCCIÓN: SOMBRAS
Abril 2011
esmitt ramírez j.
Agenda
 Introducción
 Sombras
 Falsas (Fake Shadow)
 Planares (Planar Shadow)
 Mapas de sombra (Shadow Map)
 Mapas de Luz (Lightmaps)
 Volúmenes de Sombra (Volumetric Shadow)
 Ideas Finales
Introducción
Iluminación Local
Iluminación Global
Muy poco Realista
Muy Realista
Fácil de programar
No tan fácil de programar
Poco costo computacional
Altísimo costo computacional
Agregar fenómenos naturales en la
escena es una buena opción
Sombras, reflexión, partículas, etc.
Fenómenos Naturales
Sombras
 Indican la posición relativa de los objetos:




caster y receiver (ocludder)
Receiver – Objetos sombreados
Caster – Bloquean la luz de los Receiver
Umbra – Región en el Receiver que está
completamente sombreada
Penumbra – Región de transición entre la
Umbra y el área no sombreada
Sombras
Hard Shadow
Sombras
Sombras
Soft Shadow
Sombras
Sombras
Múltiples fuentes de luz
Sombras
Múltiples luces de colores
Sombras
Sombras
Sombras
Sombras
 Los algoritmos de sombras determinan que
partes del objeto son alcanzados por una(s)
fuente(s) de luz
 El costo computacional existe cuando las
luces se mueven dentro de una escena
 Existen métodos “fake”, analíticos, basado en
píxeles, etc.
Sombras Falsas
 Muy usados en videojuegos

Polígonos “hechos a mano”
Sombras Planares
 Las sombras son proyectadas sobre un plano
Sombras Planares
l
l: posición de la luz
N
v
v: posición del vértice que se desea
crearle sombra
p: punto sobre el plano
p
N: vector normal del plano
Veamos el caso donde P.y = 0 (perteneciente al plano
P)
Sombras Planares
l
v
y=0
p
proyección para z
pz 
l y vz  l z v y
ly  vy
proyección para x
ly
px  lx

vx  l x l y  v y
px 
l y vx  l x v y
ly  vy
coordenada y = 0
Sombras Planares
ly

0
M 
0

0

 lx
0
 lz
1
0
0
ly
0
0
 vx 
 

0
 vy 
V

v 
0
 z




ly 
1
Veamos el donde P.y <> 0, es decir, el plano se
representa por su ecuación
Sombras Planares
l
v
p
 n.l  d l x nx

  l y nx
M 
 l z nx


nx

d  n.l
pl
(v  l )
n.(v  l )
 : n.x  d  0
 lx ny
n.l  d l y n y
 lz ny
 ny
Generalizando:
 l x nz
 l y nz
n.l  d l z nz
 nz
 lx d 

 lyd 
 lz d 

n.l 
Sombras Planares
 M es una matriz de proyección sobre un plano
en el espacio de coordenadas de mundo
 ¿Dónde se debe insertar M dentro del stack
de transformaciones?
Sombras Planares
 M es una matriz de proyección sobre un plano
en el espacio de coordenadas de mundo
 ¿Dónde se debe insertar M dentro del stack
de transformaciones?
 Después de las transformaciones de objeto en
espacio de mundo (modelview) y antes de las
transformaciones en espacio de ojo (proyection)
Sombras Planares
void DrawShadow(..)
(un método de muchos)
1. Deshabilitar el depth buffer
glDepthMask(GL_FALSE);
2. Dibujar la sombra en el alpha buffer
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
3. Habilitar el depth buffer
4. Dibujar el objeto
5. Dibujar el piso y combinar el alpha
glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);
Sombras Planares
 No se determina cuáles parte del objeto son
alcanzados por la luz
 Las sombras producidas son duras, ¿es
posible hacer sombras suaves?
 Solo puede aplicarse a planos
Sombras Planares
A
 Z-fighting
 Sombras infinitas
B
Mapas de Sombra
También llamado Z-Buffer de Sombras
 La escena se despliega vista desde la luz y la
información de profundidad se almacena en
el depth buffer
 Se requiere un z-buffer para cada luz
existente
 Para N luces, el polígono se despliega N+1
veces

Mapas de Sombra

Mapas de sombra
A
B
Mapas de Sombra
Escena final
Shadow map
Mapas de Sombra
 Pasos:
1. Renderizar la escena desde el punto de vista
de la luz
2. Salvar el depth buffer (2D shadow map)
3. Renderizar la escena desde el punto de vista
de la cámara
Transformar las coordenadas de los píxeles al
espacio de la fuente de luz
2. Comparar z con el z del shadow map
1.
Mapas de Sombra
 Implementaciones de hardware
 Render del zbuffer de una escena en una
textura (render to texture, pbuffer)
 Múltiples fuentes de luz (additive blending)
 Texturas proyectivas
Mapas de Sombra
A
B
Mapas de Luz
 Lightmaps
 Textura estática, ¿ puede ser dinámica?
 Generalmente calculadas por Iluminación Global
Textura
Mapa de luz
Resultado
Volúmenes de Sombras
 La región de sombra en 3D (volumen)
 Trabaja en el espacio objeto ó imagen
 No importa la geometría del Receiver
Light Source
Occluder
Shadow Region
Para cada polígono se calcula su
volumen de sombra
Extiende los polígonos oclusores a un
volumen “finito”
Las fuentes de luz son los centros de
proyección
Verificar si los puntos están en alguna
región sombreada
Volúmenes de Sombras
Volúmenes de Sombras
Volúmenes de Sombras
Volumen de sombra (2D)
objeto
Caster
fuente de
luz
posición
del ojo
superficie fuera del
volumen de sombra
(illuminated)
volumen
de sombra
(infinite extent)
objeto
parcialmente
sombreado
superficie dentro del
volumen de sombra
(shadowed)
Volúmenes de Sombras
 Generación del volumen de sombra:
 Un volumen por cada polígono
 Enfoque basado en silueta (solo necesitamos un
volumen!)
 Seleccionar solo los Caster
Volúmenes de Sombras
 Arista Silueta: Si comparte a un polígono “front-
face” y un polígono “back-face”

n1
V0
Light
Light

n1
FF

n2
V1

n2
BF
Silhouette Edge (v0,v1) !
V1
FF
FF
V0
No Silhouette Edge !
Volúmenes de Sombras
 El cálculo de las siluetas resulta ser costosa
 El despliegue de los polígonos es más costoso
 Proporciona sombras precisas
 Es posible tener múltiples fuentes de luces;
pero incrementa los volúmenes de sombra de
la escena
Volúmenes de Sombras
Volúmenes de Sombras

glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE |
GLUT_STENCIL);

glEnable(GL_STENCIL_TEST);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT);

glStencilFunc(func, ref, mask);
 func indica a OGL como comparar el valor
almacenado en el stencil con ref
Volúmenes de Sombras
 Stencil Shadow Algorithms: Mecanismo de
enmascaramiento para los píxeles
sombreados durante el rendering (desde una
luz en particular)
Silueta del objeto con respecto
a una fuente de luz
El volumen de sombra es desplegado en el stencil buffer utilizando
operaciones que modifican el valor
del stencil en c/píxel dependiendo
si pasa el test o falla
Volúmenes de Sombras
 Heidmann (1991):
 3 técnicas básicas: Z-pass, Z-fail y Exclusive-or
 El volumen de sombra debe ser desplegado
como una geometría
 Las sombras son desplegadas empleando un
algoritmo de 2 etapas:
 Front faces del volumen de sombra
 Back faces del volumen de sombra
 En c/etapa se modifica el stencil buffer
Volúmenes de Sombras
Front faces
Se incrementa el valor en el stencil
cuando se pasa el depth test
Back Faces
Se decrementa el valor en el stencil
cuando se pasa el depth test
Valores distintos a cero donde la
sombra intersecta cualquier superficie
en la escena
Volúmenes de Sombras
 glStencilOp(sfail, dpfail, dppass)
 sfail: cuando el stencil test falla
 dpfail: cuando el stencil test pasa, pero el
depth test falla
 dppass: cuando el stencil y el depth pasan (y
otras combinaciones)
Volúmenes de Sombras
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glEnable(GL_CULL_FACE);
glEnable(GL_STENCIL_TEST);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0.0f, 100.0f);
Volúmenes de Sombras
glCullFace(GL_FRONT);
glStencilFunc(GL_ALWAYS, 0x0, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
render_surface_shadow_volume(surfaces[i], position, light_pos);
Volúmenes de Sombras
glCullFace(GL_BACK);
glStencilFunc(GL_ALWAYS, 0x0, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
render_surface_shadow_volume(surfaces[i], position, light_pos);
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_CULL_FACE);
glColorMask(GL_TRUE, GL_TRUE,GL_TRUE,
GL_TRUE);
glDepthMask(GL_TRUE);
glStencilFunc(GL_NOTEQUAL, 0x0, 0xff)
glStencilOp(GL_REPLACE, GL_REPLACE,
GL_REPLACE);
draw_shadow();
glDisable(GL_STENCIL_TEST);
Volúmenes de Sombras
 En el stencil, un valor de cero representa un




píxel iluminado
Un valor mayor que cero, un píxel sombreado
La contribución de diversas luces se puede
realizar en el accumulation buffer o con
additive blending
Near and far clip planes = clip the infinitive
shadow volumes
Capping (costosa computacionalmente)
Volúmenes de Sombras
 No funciona si la cámara está dentro del
volumen de sombra!!!
Volúmenes de Sombras
 Bilodeau (1999) propuso un enfoque distinto:
 Decrementar con los polígonos delanteros (front)
cuando el z-test falle
 Incrementar con los polígonos traseros (back)
cuando el z-test falle
 Front facing shadow volume

glStencilOp (GL_KEEP, GL_DECR, GL_KEEP);
 Back-facing

glStencilOp (GL_KEEP, GL_INCR, GL_KEEP);
Volúmenes de Sombras
 Otra solución más “elegante” fue propuesta
por Everitt y Kilgard (2002) basados en la idea
de Carmack (2000)
 En vez de contar los valores del stencil al
incrementar los front-facing y decrementar
los back-facing en el z-test, la idea es contar
desde el infinito en vez del viewpoint (z-fail)
 Z-pass y z-fail son equivalentes
 Everitt, C., and Kilgard, M. J. 2002. Practical and robust
stenciled shadow volumes for hardware-accelerated rendering
Volúmenes de Sombras
 Sección 3.2: Approach
Volúmenes de Sombras
 Sección 3.2: Approach
Ideas finales
 Z-pass y Z-fail producen sombras duras
(pointlight)
 Sin sombras, habrá poco realismo
 “Buenas” sombras son costosas
 La selección de la técnica depende de la
aplicación




¿ 100% CPU? ¿algún % de GPU?
Complejidad de los objetos dentro de la escena
Calidad de las sombras
Se requiere precisión en las mismas

Documentos relacionados