Sombras y Reflejos en Tiempo Real

Slides:



Advertisements
Presentaciones similares
Capítulo 34B – Reflexión y espejos II (analítico)
Advertisements

Curvas y Superficies Referencia – capítulo 11 del Libro Rojo.
Sistemas de Graficación
Convertidores A/D y D/A
LA FORMA EN EL ESPACIO TEMA 5.
Sistemas de coordenadas de referencia
TAREA 6 Cálculo de campos eléctricos y magnéticos de diferentes distribuciones lineales MIGUEL HERNANDO RIVERA BECERRA Usuario : G2N23miguelrivera.
Java Binding for the OpenGL API Unidad III. ¿Qué es OpenGL? Open GL es un entorno de desarrollo portable de aplicaciones gráficas interactivas en 2D y.
Unidad 3 Gráfica de las funciones trigonométricas
ANÁLISIS Y VISUALIZACIÓN DE DATOS
Graficar Funciones Cuadráticas
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
ILUMINACIÓN Un modelo de iluminación sirve para asignar un valor de iluminación a los puntos de la imagen. Se define una ecuación de iluminación. Lighting.
5° MATEMÁTICA 1 NÚMEROS REALES.
Curso de Programación I Parte III
Tema 7 Colores y Sombras.
TEMA 6: DIVISIÓN DE POLINOMIOS
Eliminación de Superficies Ocultas
Real Time Global Illumination for Dynamic scenes Alejandro Drago Cesar Villasana
Sombras en OpenGL Informática Gráfica– Ingeniería Informática.
TFT-LCD Conceptos básicos.
Procesamiento digital de Imágenes
TEMA 5 ACOTACION.
Dibujar en 3D: puntos, líneas y polígonos.
Programación en Matlab
Transformaciones en OpenGL
J. Trinidad Guillen Bonilla, H. Guillen Bonilla, A. Guillen Bonilla,
Programación Lineal Unidad 1 Parte 3.
Tema 2: Los tipos de datos
Fórmula de Reducción y Teoría de perturbación
Modelos de iluminación
Informática Ingeniería en Electrónica y Automática Industrial
Visualización Computacional 2
Curso de OpenGL Verano de hrs. de adrenalina 3D M.C. Luis A. Zarza López.
Imagen Digital teoría taller Imagen Digital La imagen digital Por Gabriel Francés 2004.
>> Visibilidad <<
Ray Tracing. -La primera noción del Ray Tracing se remonta a Por René Descartes. -En 1980 se propone el Ray tracing a nivel Computacional, creando.
UNIDAD VI: CIRCUITOS LÓGICOS SECUENCIALES
Graficación II. Algoritmos.
COMPRESIÓN AUTORREGRESIVA Y CASI SIN PERDIDA Autores: Antonio Fernández Carpio Francisco José Lamela Rincón.

Mapeo de Texturas Capitulo 9 de Angel. Detalle de superficie Hasta ahora hemos visto como crear superficies uniformes planas o bicúbicas, y hemos animado.
Jose María Buades Rubio Visibilidad en Escenas Complejas Entorno de Habitaciones Carretera y Circuitos de carreras.
Problema de inclusión en una Curva Digital Por Orellana Muñoz, Alfonso Paz Vicente, Rafael Pérez Medina, Gerardo Rodríguez Naranjo.
Tema 3: Filtros.
Algoritmos de Ordenamiento y Complejidad
Computación Gráfica I – CI4321
ILUMINACIÓN Graficación FCC. Definición Los modelos de iluminación determinan el color de la superficie en un punto dado. También son conocidos como modelos.
Realizado por: Mercedes Sánchez Marcos Almudena Sardón García
Visualización Computacional 2
Rep.TexturasA. García-Alonso1 >> Representación
Sesión 11: - Comparador, Captura y PWM. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Sistemas Digitales.
LA UNIDAD ARITMÉTICA Y LÓGICA
Laboratorio de Computación Grafica Universidad Central de Venezuela
1 Practica 5 Transparencia en AE. Bibliografía José Luis Fernandez. “Postproducción digital”. Escuela de cine y vídeo Gonzalo Pajares. “Imágenes.
Prof: María Consuelo Cortés – Guiomar Mora de Reyes
Control Moderno de Motores Eléctricos
Lenguaje de Programación LISP
NÚMEROS REALES.
Jose María Buades Rubio Lens Flare and Bloom. Es un efecto optico creado por la interreflejo entre elementos de una lente cuando la camara apunta a una.
REPUBLICA BOLIVARIANA DE VENEZUELA UNIVERSIDAD ALONSO DE OJEDA FACULTAD DE INGENIERÍA ESCUELA DE COMPUTACIÓN ING. PROF. LEONEL SEQUERA MEMORIAS.
Informática Ingeniería en Electrónica y Automática Industrial
Jose María Buades Rubio Bump Mapping Efecto de relieve a los polígonos.
MEDIDAS DE DISPERSIÓN Pedro Godoy Gómez. Miden qué tanto se dispersan las observaciones alrededor de su media. MEDIDAS DE DISPERSIÓN.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
Rep.IluminaciónA. García-Alonso1 >> Representación
SISTEMAS ELECTRÓNICOS 3ºGIERM1 1. Introducción 2. Tipos de datos 3. Estructuras típicas de programación 4. Manejo de bits Tema 7. Programación de microcontroladores.
Fotografía. Cámara obscura La cámara oscura es un instrumento óptico capaz de “dibujar” con la luz, sobre un papel, no sólo los diferentes valores del.
Rep.A. García-Alonso1 >> Representación
Transcripción de la presentación:

Sombras y Reflejos en Tiempo Real Implementación mediante OpenGL Uso del stencil buffer Jose María Buades Rubio

Introducción Renderizar polígonos con texturas Z-Buffer mostrará la salida correcta La limitación de los efectos viene dada por el hardware Dos efectos que mejoran la calidad gráfica son las sombras y los reflejos

Stencil Test Mejoran la calidad de las sombras y reflejos Stenciling es un test extra por pixel y un conjunto de operaciones muy parecidas al z-buffer Añade planos de bits adicionales para cada pixel, ademas de los bits de color y profundidad

Stencil Test II Es una manera de “marcar” pixeles en una renderización para controlar su actualización en renderizaciones siguientes Algunas tarjetas gráficas como RivaTNT soporta stencil buffer de 8-bits Tanto DirectX y OpenGL soportan Stencil Buffer

Secuencia de operaciones Pixel Ownership Test Scissor Test Alpha Test Stencil Test Depth Test Blending Dithering Logic Op

Per-pixel Stencil Testing Inicialización mediante GLUT & OpenGL glutInitDisplayString(“stencil>=1 rgb depth double”) glutCreateWindow(“Stencil Buffer Example”) El valor stencil de un pixel es un entero sin signo (unsigned int)

Per-pixel Stencil Testing II Como borrar el stencil buffer glClearStencil(0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) Activar y desactivar el test glEnable(GL_STENCIL_TEST) glDisable(GL_STENCIL_TEST)

Per-pixel Stencil Testing III El stencil test compara el valor del pixel del stencil buffer con un valor de referencia Permite las siguientes comparaciones: never, always less than, less than or equal greater than, greater than or equal equal, not equal

Per-pixel Stencil Testing IV Es más potente que el buffer de profundidad, antes de comparar realiza una operación AND, tanto del valor de referencia como del valor del buffer, con un valor que sirve como máscara glStencilFunc( GL_EQUAL, // función de comparación 0x1, // valor de referencia 0xff); // máscara

Per-pixel Stencil Testing V Si el pixel no pasa el test de profundidad es rechazado, en cambio si pasa reemplaza el valor del z-buffer. El stencil test es más complicado: NO pasa el stencil test Pasa stencil test y NO el test de profundidad Pasa stencil test y el test de profundidad

Per-pixel Stencil Testing V Para cada caso tenemos seis operaciones posibles: GL_KEEP, GL_REPLACE, GL_INVERT, GL_INCREMENT, GL_DECREMENT, GL_ZERO Antes de escribir se aplica una máscara glStencilOp( GL_KEEP, // stencil fail GL_DECR, // stencil pass, depth fail GL_INCR); // stencil pass, depth pass glStencilMask(0xff);

Per-pixel Stencil Testing VI State Description Initial Value State Update State Query Token Command Stencilling enable GL_FALSE glEnable GL_STENCIL_TEST glDisable Stencil function GL_ALWAYS glStencilFunc GL_STENCIL_FUNC Stencil compare mask All 1’s glStencilFunc GL_STENCIL_VALUE_MASK Stencil reference value 0 glStencilFunc GL_STENCIL_REF Stencil fail operation GL_KEEP glStencilOp GL_STENCIL_FAIL Stencil depth fail operation GL_KEEP glStencilOp GL_STENCIL_PASS_DEPTH_PASS Stencil depth pass operation GL_KEEP glStencilOp GL_STENCIL_PASS_DEPTH_PASS Stencil write mask All 1’s glStencilMask GL_STENCIL_WRITEMASK Stencil buffer clear value 0 glClearStencil GL_STENCIL_CLEAR_VALUE

Reflejos Planos sin Stencil Tiene una serie de limitaciones: El objeto reflejado sale por fuera de la superficie reflectante Desde detrás del espejo se ve el objeto reflejado No permite reflejos infinitos, esta limitado a un número n de reflejos

Algoritmo 1. Cargar la matriz de modelización glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLookAt(eye[0], eye[1], eye[2], center[0], center[1], center[2], up[0], up[1], up[2]); 2. Introducir en la pila la matriz de modelización glPushMatrix(); 3. Aplicar la matriz de reflejo (plano z = 0) glScalef(1.0, 1.0, -1.0); 4. Si usamos recorte de caras traseras, debemos realizar el contrario, eliminación de caras delanteras glCullFace(GL_FRONT); 5. Renderizar la escena, pero solo los objetos que estan en el lado reflectante del espejo

Algoritmo (continuación) 6. Restaurar los valores antes del espejo glCullFace(GL_BACK); glPopMatrix(); 7. Renderizar el espejo (por ejemplo si es marmol) glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); // aditivo rederizarEspejoConTextura(); glDisble(GL_BLEND); Incluso si el espejo no esta renderizado como una superficie semitransparente es importante renderizarlo para actualizar el z-buffer y evitar que aparezcan objetos que estan detrás del objeto glColorMask(0, 0, 0, 0); renderizarEspejoConPoligonos() glColorMask(1, 1, 1, 1); 8. Finalmente renderizar la escena no reflejada

Resultados Stenciling

Reflejos Planos con Stencil Técnica más perfeccionada Permite tener espejos de tamaño limitado Podemos situar la cámara al otro lado del espejo

Algoritmo Renderizar la escena, excepto los espejos, con z-buffer pero sin stencil test glClearStencil(0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glDisable(GL_STENCIL_TEST); DrawScene(); Para cada espejo realizar los siguientes pasos: 1. Configurar para que escriba 1 en el stencil buffer cuando pasa el buffer de profundidad, deshabilitar escribir en el buffer de color. Entonces renderizar el espejo glEnable(GL_STENCIL_TEST); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilFunc(GL_ALWAYS, 1, ~0); glColorMask(0, 0, 0, 0); RenderizarPoligonoEspejo();

Algoritmo (continuación) 2. Con el buffer de color deshabilitado poner en el z-buffer el valor de profundidad máxima para los pixeles que corresponden al espejo glDepthRange(1, 1); glDepthFunv(GL_ALWAYS); glStencilFunc(GL_EQUAL, 1, ~0); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); RenderizarPoligonoEspejo(); 3. Restaurar el test de profundidad, la mascara de color y el rango de profundidad a los valores estándar glDepthFunc(GL_LESS); glColorMask(1, 1, 1, 1); glDepthRange(0, 1); Ahora tenemos marcados como 1 en el stencil buffer los pixeles que corresponden al espejo y con la máxima profundidad en el z-buffer

Algoritmo (continuación) 4. Para evitar renderizar polígonos ubicados detrás del espejo definiremos un plano de clipping GLfloat matrix[4][4]; GLdouble clipPlane[4]; glPushMatrix(); CalcularPlanoCorteEspejo(clipPlane); glClipPlane(GL_CLIP_PLANE0, clipPlane); CalcularMatrizEspejo(&matrix[0][0]); glMultMatrix(&matrix[0][0]); glCullFace(GL_FRONT); DrawScene(); DibujarOtrosEspejosComoSuperficiesGrises(); glCullFace(GL_BACK); glDisable(GL_CLIP_PLANE0); glPopMatrix(); Ahora esta correctamente rederizado el reflejo del espejo

Algoritmo (continuación) 5. Ahora reseteamos el valor del stencil buffer a 0 para que no se confundan con otros espejos, ademas actualizamos el z-buffer para que tenga como profundidad la del espejo y no la del objeto reflejado glColorMask(0, 0, 0, 0); glStencilop(GL_KEEP, GL_KEEP, GL_ZERO); glDepthFunc(GL_ALWAYS); RenderizarPoligonoEspejo(); glDepthFunc(GL_LESS); glColorMask(1, 1, 1, 1);

Sombras Planas sin Stencil Los modelos de iluminación locales soportados por OpenGL y Direct3D no provocan sombras Proyectando un polígono sombre el plano a sombrear es una técnica para provocar el efecto sombra

Algoritmo 1. Cargar la matriz de modelización glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLookAt(eye[0], eye[1], eye[2], center[0], center[1], center[2], up[0], up[1], up[2]); 2. Dada la luz y la ecuación del plano donde se proyecta, y asumiendo que el objeto esta entre la luz y el plano, habilitar la luz y renderizar el objeto y el plano GLfloat lightPosition[4] = {LX, LY, LZ, 1.0}; GLfloat groundPlaneEquation[4] = {A, B, C, D}; glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); DibujarObjeto(); DibujarPlano();

Algoritmo (continuación) 3. Meter en la pila la matriz de modelización glPushMatrix(); 4. Construir la matriz de proyección, multiplicar la matriz de modelización por la matriz de proyección de la sombra GLfloat matrix[4][4]; ShadowMatrix(&matrix[0][0], lightPosition, groundPlaneEquation); glMultMatrix(&matrix[0][0]); 5. A menos que lo remediemos la sombra y el plano donde se proyecta son coplanares. Esto causa problemas en el Z-Buffer, a veces la sombra esta más cerca, a veces igual y otras veces más alejado, esto es debido a imprecisiones en el cálculo numérico glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0, 2.0); Esto provoca que este dos unidades más cerca

Algoritmo (continuación) 6. Deshabilitar la iluminación, poner el color gris oscuro y dibujar el objeto de nuevo glDisable(GL_LIGHTING); glColor3f(0.25, 0.25, 0.25); DibujarObjeto(); 7. Volver al estado anterior glDisable(GL_POLYGON_OFFSET); glPopMatrix();

Resultados Polygon Offset Stenciling

Sombras Planas con Stencil Evita problema de doble transparencia Impide que la sombra salga del polígono sobre el cual se quiere calcular la sombra

Algoritmo 1. Cargar la matriz de modelización glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLookAt(eye[0], eye[1], eye[2], center[0], center[1], center[2], up[0], up[1], up[2]); 2. Dada la luz y la ecuación del plano donde se proyecta, y asumiendo que el objeto esta entre la luz y el plano, habilitar la luz y renderizar el objeto y el plano GLfloat lightPosition[4] = {LX, LY, LZ, 1.0}; GLfloat groundPlaneEquation[4] = {A, B, C, D}; glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); DibujarObjeto(); DibujarPlano();

Algoritmo (continuación) 3. Meter en la pila la matriz de modelización glPushMatrix(); 4. Construir la matriz de proyección, multiplicar la matriz de modelización por la matriz de proyección de la sombra GLfloat matrix[4][4]; ShadowMatrix(&matrix[0][0], lightPosition, groundPlaneEquation); glMultMatrix(&matrix[0][0]); 5. Asignar un valor distinto de cero al stencil buffer glEnable(GL_STENCIL_BUFFER); glStencilFunc(GL_ALWAYS, valor, ~0); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); DibujarPlanoASombrear(); glDisable(GL_STENCIL_TEST);

Algoritmo (continuación) 6. Deshabilitar la iluminación glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_DST_COLOR, GL_ZERO); glColor3f(0.5, 0.5, 0.5); glDisable(GL_DEPTH_TEST); Solo debemos actualizar los pixeles marcados con valor glEnable(GL_STENCIL_TEST); glStencilFunc(GL_EQUAL, valor, ~0); glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); DibujarObjeto(); 7. Restaurar los valores glDisable(GL_BLEND); glDisable(GL_STENCIL_TEST); glEnable(GL_DEPTH_TEST); glPopMatrix();

Programa Demo Dinoshade