Reflexión y refracción esmitt ramírez octubre 2010 Agenda • Motivación • Reflexión Planar • Refracción Motivación • Reflexión y refracción son ejemplo de efectos de la iluminación global • Realismo: reflexión, sombras, etc. • Environment mapping provee reflexión • Reflexión planar Reflexión • Reflejo de sobre una superficie, como un espejo • Implementación • Ejecución • Reflector ideal Reflexión • Idea: Crear una copia del objeto en su posición reflejada • Plano con n = (0,1,0), pasa a través del origen matriz de reflexión es S =(1,-1,1) • Matriz de reflexión general 1. Trasladar el plano para que pase por el origen T(-p). Donde p es un punto sobre el plano Reflexión 2. Rotar n hasta hacerla paralela al eje y 3. Concatenar las operaciones F = R(n, (0,1,0)) T (-p) 4. Ya el plano está alineado a y = 0, entonces: 5. M = F-1 S(1,-1,1)T F • El reflector debe tener cierta transparencia = factor de reflexión Reflexión Reflexión Reflexión • Para implementar una reflexión existen diversas técnicas: – Copiando la geometría – Empleando el Stencil Buffer – Utilizando ClipPlanes – Con Texture Mapping – Superficies curvas – Muchas más … Reflexión • Errores en la reflexión Reflexión • Empleando el Stencil Buffer Reflexión • Stencil Buffer: algoritmo de 2 pasadas • 1ra: la escena reflejada es renderizada • 2da: la escena no-reflejada • El Stencil se utiliza para “limpiar” las partes de la escena reflejada que esten fuera del polígono espejo Reflexión Reflexión • 1ra Pasada – Configurar la visualización inicial, y las matrices de proyección – Calcular y aplicar la transformación de la matriz de reflexión – Dibujar el resto de la escena – Deshacer la transformación de reflexión • glPushMatrix y glPopMatrix Reflexión • Se proyecta como si el plano completa fuera el “espejo” • La geometría delante del plano reflectivo NO debe ser desplegada (clipping planes) • El plano reflectivo (espejo) NO debe ser desplegado en la 1ra pasada • Imagen magnificada vs. minificada Reflexión • 2da Pasada – glClear(GL_ STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); – glStencilOp (GL_REPLACE, GL_REPLACE, GL_REPLACE); glStencilFunc (GL_ALWAYS, 1, 1); glEnable (GL_STENCIL_TEST); – glColorMask (0, 0, 0, 0); – Dibujar el polígono “espejo” (blending, opcional) – glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP); glStencilFunc (GL_NOTEQUAL); – Limpiar el color buffer del color de fondo – glDisable (GL_ STENCIL_TEST); – Dibujar la escena sin reflexión Reflexión REFRACCIÓN Refracción • Objetos transparentes • Rayos de luz son refractados, atravesando el borde entre materiales de diferentes índices de refracción • Ley de Snell: define la relación entre un vector in y un vector out cuando se mueven de un medio (e.g. aire) a otro (e.g. agua) Refracción Agua ≈ 1.33 Vidrio ≈ 1.50 Aire ≈ 1.00 n1 sin(θ) = n2 sin(θ2) El ángulo de incidencia del rayo entrante es mayor o igual al ángulo de refracción cuando viaje desde un índice bajo a uno alto Refracción • Cálculo del vector de refracción t = ri + (w - k)n • i • n • r • t : vector entrante : vector normal (normalizado) : índice relativo de refracción, r : vector resultante = n1/n2 w = -(i.n)r k = sqrt(1 + (w - r)(w + r)) aproximación t = -cn + i Refracción • Efecto Fresnel: En una escena real, cuando un rayo de luz cae en la frontera de 2 materiales, algunos rayos de luz se reflejan de la superficie y otros se refractan a través de la superficie Aproximación: reflectionCoeff = max(0, min(1, bias + scale*(1 + I.N) power)) Refracción • Tomando en cuenta el ojo, se tiene una versión simplificada de la ecuación de Fresnel: F = f + (1 - f)(1 – V.n)5 : vector normal V : dirección del ojo f : índice del material. 1/n2)2 f = (1.0 n Cuando θ = 0 • n • • / (1.0 + n1/n2)2 Refracción • Cuando el ángulo de incidencia es pequeño, la mayoría de la luz pasa a través del material • Cuando el ángulo de incidencia es mayor, la mayoría de la luz es reflejada Refracción uniform vec3 eyePos;// Position of the view eye in world space uniform float fresnelBias, fresnelScale, fresnelPower; //params uniform float etaRatio; // Ratio of indices of refraction varying vec3 reflectedVector, refractedVector; //vectors varying float refFactor; //Reflection factor void main() { // Create incident and normal vectors vec3 I = normalize(gl_Vertex.xyz - eyePos.xyz); vec3 N = normalize(gl_Normal); // Calculate reflected and refracted vectors reflectedVector = reflect(I, N); refractedVector = refract(I, N, etaRatio); refFactor = fresnelBias+fresnelScale*pow(1+dot(I,N),fresnelPower); gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); } Refracción // Cube map uniform samplerCube env; // Reflected and refracted vectors varying vec3 reflectedVector, refractedVector; // Reflection factor based on fresnel equation varying float refFactor; void main() { // Read cube map vec4 reflectedColor = textureCube(env, reflectedVector); vec4 refractedColor = textureCube(env, refractedVector); // Mix reflected and refracted colors gl_FragColor = mix (refractedColor, reflectedColor, refFactor); }: Refracción • Cuando un rayo de luz es refractado, su dirección no está basada solamente en los índices de refracción • También depende de la longitud de onda de la luz incidente. Este fenómeno se conoce como Chromatic Dispersion Refracción Refracción // Position of the view eye in world space uniform vec3 eyePos; // Ratio of indices of refraction for the 3 colors uniform vec3 etaRatioRGB; // Fresnel parameters uniform float fresnelBias, fresnelScale, fresnelPower; // Reflection vector; varying vec3 R; // Separate refraction vectors varying vec3 TRed, TGreen, TBlue; // Reflection factor based on fresnel equation varying float refFactor; Refracción void main() { // Create incident and normal vectors vec3 I = normalize(gl_Vertex.xyz - eyePos.xyz); vec3 N = normalize(gl_Normal); R = reflect(I, N); // Reflection vector // Separate refraction vectors TRed = refract(I, N, etaRatioRGB.r); TGreen = refract(I, N, etaRatioRGB.g); TBlue = refract(I, N, etaRatioRGB.b); // Aproximation of the fresnel equation refFactor=fresnelBias+fresnelScale*pow(1,0+dot(I,N),fresnelPower; // Transform vertex gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); } Refracción // Cube map uniform samplerCube env; // Reflected and refracted vectors varying vec3 R, TRed, TGreen, TBlue; // Reflection factor based on fresnel equation varying float refFactor; void main() { // Read cube map for reflected color vec4 reflectedColor = textureCube(env, R); // Read cube map for refracted color (3 times) vec4 refractedColor; refractedColor.r = textureCube(env, TRed).r; refractedColor.g = textureCube(env, TGreen).g; refractedColor.b = textureCube(env, TBlue).b; // Mix reflected and refracted colors gl_FragColor = mix(refractedColor, reflectedColor, refFactor); } Refracción Ideas Finales • Si combinamos reflexión + refracción con modelos de reflexión especular u otras técnicas de iluminación… el efecto visual es sorprendente! • Son técnicas costos computacionalmente • Hiperrealismo • High Dynamic Range