Técnicas de Iluminación empleando shaders Prof. Esmitt Ramírez J. Septiembre 2010 Iluminación en GLSL • La idea es explotar al máximo los shaders para el cálculo de la iluminación 1. 2. 3. 4. 5. Iluminación en GLSL Luz direccional Luz direccional por píxel Luz Puntual Reflector Iluminación en GLSL Ambiental + Difuso + Especular • Luz direccional • Luz puntual (point light) • Reflector (spotlight) Iluminación GLSL • En OpenGL = GL_LIGHTi Luz direccional • Distancia infinita de los objetos • Todos los rayos son paralelos • Un vector puede ser utilizado para c/punto de la escena • Se ejecuta rapidamente comparado con otras luces • Imita efectos luminosos como el sol Luz direccional Reflexión de Lambert (1728-1777) “Brillo difuso de una superficie plana es proporcional al coseno del ángulo formado por la línea de visión y la normal de la superficie” • La dirección de la luz en coordenadas de ojo • Transformar la normal a coordenadas de ojo Luz direccional Luz direccional Luz direccional • El modelo empleado por OpenGL es el propuesto por Blinn-Phong (Phong simplificado) • Phong: “el componente especular es proporcional al coseno entre el vector reflexión de la luz y el vector del ojo” L= vector desde la luz hasta el vértice N= normal de la superficie Eye= vector desde el vértice al ojo/cámara R= vector reflejado de L con respecto a N Luz direccional • Eye vector = Reflection vector • Tasa de decaimiento = shininess [0,128] shininess = 8 shininess = 64 shininess = 128 Luz direccional • Modelo Blinn-Phong • Half-vector es un vector con una dirección intermedia entre el vector Eye y el vector luz Luz direccional Luz direccional por píxel • Normal en coordenadas de ojo y normalizar • Normalizar vector medio y dirección de la luz Luz direccional por píxel Luz puntual • Simulan luces cercanas a la escena o dentro de ellas (e.g. lámparas de techo, calle, etc.) • La dirección de la luz debe ser calculada para c/vértice • La luz recibida en la superficie decrementa a medida que se aleja del foco de luz (atenuación) • Atenuación constante, lineal y cuadrática • Direccional w = 0; Puntual w = 1 Luz puntual • Atenuación constante, lineal y cuadrática Luz puntual Luz puntual Luz puntual • Es posible realizarlo todo en un vertex program Sin Shader GLSL Shader GLSL Spotlight • Proyección de un fuerte haz de luz que ilumina un área definida (e.g. teatros y cines) • Se representa como un cono con: – Una dirección (spotDirection) que representa el eje del cono – Un ángulo del cono (spotCosCutoff) – Una tasa de decaimiento (spotExponent) para conocer como disminuye la intensidad de luz del centro a las paredes del cono Spotlight • Utilizaremos el mismo vertex shader que la Luz Puntual • Se calcula el coseno entre spotDirection y la posición de la luz sobre la superficie. El resultado es comparado con spotCosCutoff para determinar si se esta dentro o fuera del cono de iluminación Spotlight • Si esta fuera, la atenuación es 0 sino este valor se eleva al valor especificado en spotExponent • El componente ambiental, difuso y especular solo tienen efecto si está dentro • La atenuación se multiplica por el valor sporEffect: Spotlight Sin shader GLSL Shader GLSL Modelos de Reflexión • • • • • • • • Ashikhmin-Shirley Fresnel Lafortune BRDF Ward Oren Nayer Velvet Car paint Gooch Modelos de Reflexión • • • • • • • • Ashikhmin-Shirley Fresnel Lafortune BRDF Ward Oren Nayer Velvet Car paint Gooch Modelos de Reflexión • • • • • • • • Ashikhmin-Shirley Fresnel Lafortune BRDF Ward Oren Nayer Velvet Car paint Gooch Modelos de Reflexión • • • • • • • • Ashikhmin-Shirley Fresnel Lafortune BRDF Ward Oren Nayer Velvet Car paint Gooch Modelos de Reflexión • • • • • • • • Ashikhmin-Shirley Fresnel Lafortune BRDF Ward Oren Nayer Velvet Car paint Gooch Modelos de Reflexión • • • • • • • • Ashikhmin-Shirley Fresnel Lafortune BRDF Ward Oren Nayer Velvet Car paint Gooch Tips • Al utilizar la contribución de muchas luces en la escena: NumEnabledLights • Two-Sided Lighting = invertir la normal de la superficie y calcular • Fog = gl_FogCoord