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 pl (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