Clase de Reflexión y Refracción

Anuncio
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
Descargar