




OpenGL - Glut - C/C++
• El mapeo de texturas permite cubrir objetos (polígonos) con imágenes (texturas).
• Esto entrega una visualización más real en objetos de “menor” complejidad.
• Por ejemplo, se puede construir una muralla de ladrillo utilizando un simple polígono recubierto por una textura de un ladrillo.
• Una textura puede ser unidimensional, bidimensional o tridimensional.
• Puede ser aplicada sobre una superficie de diferentes formas:
– Cubrir directamente una superficie (modo DECAL).
– Modular el color de la superficie pintada.
– Mezclar (blend) el color de la textura con el color de la superficie.
• Una textura es un arreglo rectangular de datos: color y valor alpha. Cada elemento se denomina texel.
• En el proceso de mapping una textura es asociada a un polígono.
1. Crear un objeto de textura y especificar una textura para el objeto.
2. Indicar cómo la textura se aplicará a cada píxel.
3. Habilitar mapeo de texturas.
4. Dibujar la escena, suministrando coordenadas geométricas y de texturas.
• Para especificar una textura 2D se utiliza el comando glTexImage2D.
void glTexImage2D( GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
– target: GL_TEXTURE_2D or GL_PROXY_TEXTURE_2D.
– level: define múltiples niveles de resoluciones de texturas (para mip mapping).
– internalFormat: formato en que se almacena internamente la textura:
• GL_ALPHA, GL_RGB, GL_RGB8, GL_RGBA8, etc.
– width: ancho de la textura.
– height: alto de la textura.
– border: ancho del borde la textura (0 = sin borde).
– format: formato de los datos de la imagen:
GL_COLOR_INDEX, GL_RGB, GL_RGBA, GL_RED, GL_GREEN, GL_BLUE,
GL_ALPHA, GL_LUMINANCE, or GL_LUMINANCE_ALPHA.
– type: tipo de datos de la imagen:
GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT,
GL_UNSIGNED_INT, GL_FLOAT, or GL_BITMAP.
– pixels: puntero a los datos de la imagen.
• Para escalar el tamaño de una imagen:
– intgluScaleImage( ... );
• Se puede usar información del framebuffer para generar una textura:
– voidglCopyTexImage2D( ... );
• Para reemplazar parte o completamente la actual textura:
– voidglTexSubImage2D( ... );
• Para reemplazar parte o completamente la actual textura utilizando datos de la imagen del framebuffer:
– voidglCopyTexSubImage2D( ... );
• Objetos texturizados pueden estar en movimiento, alejándose y/o acercándose hacia observador. Esto implica que el mapeo de la textura en el objeto debe cambiar de tamaño.
• Especialmente cuando un objeto se aleja, las texturas tienen que ser filtrada para reducir el tamaño y no producir actifacts visuales.
• Para evitar actifacts se pueden generar una serie de mapas de texturas prefiltradas en tamaño decreciente, llamada mipmaps.
• Con mipmapping, OpenGL automáticamente determina qué mapa usar basado el tamaño del objeto que está siendo mapeado (ver ejemplo mipmap.c).
Filtros
• Si bien las texturas son rectangulares, es improbable que exista una correspondencia 1:1 entre texels y píxeles.
• Dependiendo de las transformaciones un píxel puede ser una porción de un texel (magnificación) o puede ser un conjunto de varias texels (minificación).
• void glTexParameteri(GLenum target, GLenum pname, GLint param);
• target: GL_TEXTURE_2D or GL_TEXTURE_1D.
• pname: especifica el nombre del parámetro:
GL_TEXTURE_MIN_FILTER,
GL_TEXTURE_MAG_FILTER,
GL_TEXTURE_WRAP_S,
GL_TEXTURE_WRAP_T.
• param: especifica el valor de pname (ver tabla).
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
• A partir de OpenGL 1.1 es posible almacenar un conjunto de objetos de texturas y reutilizarlos cuando sea necesario.
• Pasos a seguir:
1. Generar nombres de texturas.
2. Vincular (crear) objetos de texturas a datos de texturas, incluyendo arreglo de imágenes y propiedades.
3. Si la implementación lo permite, definir un conjunto de texturas de alto-desempeño.
4. Vincular o revincular objetos de texturas, dejándolas disponibles para el rendering de modelos.
• Para generar uno mas nombre de texturas se utiliza:
void glGenTextures(GLsizei N, GLuint *textureNames);
N : cantidad de nombres solicitados.
textureNames : puntero a los valores entregados.
• Ejemplo:
static GLuint texName[2];
glGenTextures(2, texName);
Creación y Uso de Objetos de Texturas
• Para crear o seleccionar un objeto de textura se utiliza:
void glBindTexture(GLenum target, GLuint textureName);
target: GL_TEXTURE_1D or GL_TEXTURE_2D.
textureName: identificador de la textura.
• Ejemplo (ver texbind.c):
glGenTextures(2, texName);
glBindTexture(GL_TEXTURE_2D, texName[0]);
...
glBindTexture(GL_TEXTURE_2D, texName[0]);
• Para liberar recursos de objetos de texturas se utiliza:
void glDeleteTextures(GLsizei n, const GLuint
n : cantidad de objetos de texturas.
textureNames: puntero a los nombres de texturas.
• Ejemplo:
glDeleteTextures( 2, texName );
• Para definir las propiedades de cómo interactúa una textura en el proceso de rendering se utiliza la siguiente función:
void glTexEnv{if}(GLenum target, GLenum pname, TYPE param);
void glTexEnv{if}v(GLenum target, GLenum pname, TYPE *param);
target: GL_TEXTURE_ENV
pname:
Si es igual a GL_TEXTURE_ENV_MODE:
param: GL_DECAL, GL_REPLACE, GL_MODULATE or
Si es igual a GL_TEXTURE_ENV_COLOR:
param: es un arreglo de 4 flotantes R,G,B,A. Estos valores se usan si también se ha especificado la función de textura GL_BLEND.
Asignación de Coordenadas de Texturas
• Es el proceso en el que se asignan coordenadas de texturas a los vértices de un objeto.
• Las coordenadas de texturas pueden comprometer 1, 2, 3 o 4 componentes ( s, t, r, q ).
• Usualmente estos valores van entre
• Para definir las coordenadas de texturas se utiliza:
void glTexCoord{1234}{sifd}(TYPEcoords);
void glTexCoord{1234}{sifd}v(TYPE *coords);
• Para un rectángulo 2D las C.T. son (0,0), (1,0), (1,1), (0,1).
• Ejemplo:
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(5.0, 0.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(5.0, 5.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(0.0, 5.0, 0.0);
glEnd();
• Es posible repetir una textura cambiando el rango de las coordenadas de texturas y definiendo las propiedades adecuadas.
• Por ejemplo:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
....
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
glTexCoord2f(0.0, 3.0); glVertex3f(1.0, 1.0, 0.0);
glTexCoord2f(3.0, 3.0); glVertex3f(2.41421, 1.0, -1.41421);
glTexCoord2f(3.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
glEnd();
• También es posible fijar una textura cambiando en la propiedades e GL_REPEAT por GL_CLAMP.
• Blending: se utiliza para crear efectos de transparencia. Esto se hace por medio de la especificación de un función de mezcla que combina valores de colores entre un fuente y un destino.
• Antialiasing: es una técnica que altera los colores de objetos (puntos, líneas y polígonos) para que los bordes se vean más suaves (o menos dentados).
• Fog: corresponde al efecto de niebla en que los objetos más lejanos desaparecen. Esta ilusión de profundidad se crea calculando los colores de un objeto basado en la distancia que existe entre el objeto y el punto de vista.
• Polygon Offset: permite eliminar imperfecciones que se producen cuando un objeto sombreado y su wireframe utilizan los mismos vértices.
Blending
• Cuando el blending es activado, el valor alpha puede ser utilizado para combinar el valor del color del fragmento que está siendo procesado, con el pixel que ya está almacenado en el framebuffer.
• Con blending se puede controlar cuanto del color del actual pixel puede ser combinado con el nuevo fragmento.
• Blending ocurre después que la escena ha sido renderizada y convertida a fragmentos, pero antes que el pixel sea almacenado en el framebuffer.
• El valor alpha también puede ser usado para aceptar a rechazar un fragmento basado en su valor alpha (ver capítulo 10 del redbook).
• Blending no funciona en modo color index.
• Las operaciones blending se puede pensar en términos de que la componentes RGB son el color de un fragmento, y el alpha representa el nivel de opacidad de ese fragmento.
• Fuente (source): valor del color del fragmento que está siendo procesado.
• Destino (destination): valor del color del píxel almacenado.
• Durante el blending fuente y destino son combinados en 2 etapas:
– Primero se especifica cómo los factores fuente y destino van a ser calculados. Estos factores (R,G,B,A) multiplican a cada componente R, G, B, A del fuente y destino respectivamente.
– Luego se suman fuente y destino, y se obtiene el resultado.
• Factor Fuente: (Sr, Sg, Sb, Sa).
• Factor Destino: (Dr, Dg, Db, Da)
• Valor Final: (RsSr+RdDr, GsSg+GdDg, BsSb+BdDb, AsSa+AdDa)
• El valor final de cada componente es limitado a: 0-1.
Blending en OpenGL
• Habilitar blending: glEnable(GL_BLEND);
• Definir cómo se calcularán factores Fuente y Destino:
glBlendFunc(GLenum sfactor, Glenum dfactor);
sfactor: factor fuente.
dfactor: factor destino.
Factores de Blending Fuente y Destino
• No todas las combinaciones tienen sentido.
– Primera Imagen:
• Factor Fuente: GL_ONE (1,1,1,1)
• Factor Destino: GL_ZERO (0,0,0,0)
• (Rs*1 + Rd*0, Gs*1 + Gd*0, Bs*1 + Bd*0) = (Rs,Gs,Bs)
– Segunda Imagen:
• Factor Fuente: GL_SRC_ALPHA (As,As,As,As)
• Factor Destino: GL_ONE_MINUS_SRC_ALPHA
(1-As, 1-As,1-As,1-As)
• ( RsAs + Rd(1-As), GsAs + Gd(1-As), BsAs + Bd(1-As) )
– Factor Fuente: GL_SRC_ALPHA
– Factor Destino: GL_ONE
– Dibujar cada imagen con Factor Alpha: 0.333333
– (Rs*0.3 + (Rd=0)*1,
– (Rs*0.3 + (Rs*0.3)*1,
– (Rs*0.3 + (Rs*0.3 + Rs*0.3)*1,
– Factor Fuente: GL_SRC_ALPHA
– Factor Destino: GL_ONE_MINUS_SRC_ALPHA
– Dibujar cada imagen con Factor Alpha = % (0.1)
– ( RsAs + Rd(1-As), …
– ( RsAs + ( RsAs + Rd(1-A) )*(1-As), …
– ( RsAs + ( ...)* ( 1-As), …
– Factor Fuente: GL_DST_COLOR (Rd, Gd, Bd, Ad)
– Factor Destino: GL_SRC_COLOR (Rs, Gs, Bs, As)
– ( RsRd + RdRs,…
– Es una especie de filtro.
– Objeto 1 (más lejano): Transp: 80%
– Objeto 2 (intermedio: Transp: 40%
– Objeto 3 (más cercano): Transp: 90%
• Dibujar Fondo:
– Factor Fuente: GL_ONE
– Factor Destino: GL_ZERO
• Cambiar Factores blending:
– Factor Fuente: GL_SRC_ALPHA
– Factor Destino: GL_ONE_MINUS_SRC_ALPHA
• Dibujar objeto 1, Alpha = 0.2.
• Dibujar objeto 2, Alpha = 0.6.
• Dibujar objeto 3, Alpha = 0.1.
/* Initialize alpha blending function. */
static void init(void){
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel (GL_FLAT);
glClearColor (0.0, 0.0, 0.0, 0.0);
}
glClear(GL_COLOR_BUFFER_BIT);
if (leftFirst) {
drawLeftTriangle();
drawRightTriangle();
}
else {
drawRightTriangle();
drawLeftTriangle();
}
glFlush();
}
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix ();
glCallList (sphereList);
glPopMatrix ();
glPushMatrix ();
glEnable (GL_BLEND);
glDepthMask (GL_FALSE);
glBlendFunc (GL_SRC_ALPHA, GL_ONE);
glCallList (cubeList);
glDepthMask (GL_TRUE);
glDisable (GL_BLEND);
glPopMatrix ();
Antialiasing (o graduación)
void glHint(GLenum target, GLenum hint);
target: comportamiento a controlar (ver tabla)
hint: GL_FASTEST, GL_NICEST, GL_DONT_CARE
Antialiasing Puntos, Lineas
Puntos:
• glEnable( GL_POINT_SMOOTH )
• glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
Líneas:
• glEnable( GL_LINE_SMOOTH );
• glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
• En modo RGBA, antialiasing debe tener blending habilitado.
Ejemplo aarbg.c
void init(void){
GLfloat values[2];
glGetFloatv (GL_LINE_WIDTH_GRANULARITY, values);
printf ("GL_LINE_WIDTH_GRANULARITY value is %3.1f\n",
values[0]);
glGetFloatv (GL_LINE_WIDTH_RANGE, values);
printf ("GL_LINE_WIDTH_RANGE values are %3.1f %3.1f\n",
values[0], values[1]);
glEnable (GL_LINE_SMOOTH);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth (1.5);
glClearColor(0.0, 0.0, 0.0, 0.0);
}
• Es un Término general que describe formas similares de efectos atmosféricos: niebla, humo, polución.
• Limita la visibilidad.
• Para habilitar Fog:
– glEnable(GL_FOG);
– Elegir el color de fog.
– Determinar la función de densidad de fog con: glFog*();.
void glFog{if}v(GLenum pname, TYPE *params);
entonces param = GL_EXP, GL_EXP2 o GL_LINEAR.
Si pname = GL_FOG_DENSITY, GL_FOG_START o GL_FOG_END,
entonces param es el valor correspondiente.
entonces param = valor RGBA.
El color de final C = f Ci + (1 – f) Cf
Ci: color del fragmento.
Cf : color de fog.
GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1.0};
glEnable(GL_FOG);
fogMode = GL_EXP;
glFogi (GL_FOG_MODE, fogMode);
glFogfv (GL_FOG_COLOR, fogColor);
glFogf (GL_FOG_DENSITY, 0.35);
glHint (GL_FOG_HINT, GL_DONT_CARE);
glFogf (GL_FOG_START, 1.0);
glFogf (GL_FOG_END, 5.0);
glClearColor(0.5, 0.5, 0.5, 1.0); /* fog color */
• 6.1 Luz y Materia
• 6.2 Fuentes de Luces
• 6.3 Modelo de Reflexión Phong
• 6.5 Shading Poligonal
• 6.10 Rendering Global
• Objetos reales aparecen iluminados con diferentes tonos de colores.
• Esta graduación le da a las imágenes la apariencia dimensionalidad.
• Desde el punto de vista físico, una superficie puede emitir o reflejar luz.
• El color de un punto en un objeto, está dado por la interacción múltiple entre fuentes de luces y superficies reflectantes.
• La reflexión es un proceso recursivo complejo.
• Deriva en una ecuación integral: Ecuación de Rendering.
• Aproximaciones: radiosity, ray tracing (costosas).
• Un modelo simple basado en: Phong shading.
• Fuentes de luz = Emisores de luz.
• Se modela la interacción de los rayos con las superficies reflectantes.
• Interacción simple: una interacción única entre luces y superficies.
• 2 problemas:
– Modelamiento de las fuentes de luz en la escena.
– Modelamiento de la reflexión en las superficies.
• Sólo una parte de los rayos contribuye a la creación de la imagen.
Clasificación de Superficies según
(a) Superficie Especular (reluciente)
(b) Superficie Difusa
(c) Superficie Translúcida
6.2 Fuentes de Luz
• En una fuente de luz, cada punto emisor de la superficie puede ser caracterizada por:
– Posición: coordenadas x, y, z
– Dirección: ángulos θy φ
– Intensidad de longitud de onda: λ
• Función de Iluminación: n: I( x, y, z, I( x, y, z, θ, φ, λ)
• Contribución total: Integración sobre la superficie para considerando ángulos incidentes y la distancia entre la superficie y la fuente de luz.
• El color de una fuente de luz se puede modelar usando la teoría de tres colores.
• Una fuente puede tener tres componentes:
– rojo, verde, azul (RGB).
• Cada componente de color se puede usar para obtener la correspondiente componente de color que verá el observador.
• Intensidad o función luminancia de Fuente de luz:
– I = [ I I = [ Ir, I , Ig, I , Ib ]
• Corresponde a una iluminación uniforme.
• Se produce por grandes fuentes de luz, con difusores que esparcen los rayos de luz en todas direcciones.
• La iluminación en el ambiente se caracteriza por una intensidad igual en cada punto:
– Ia = [ = [ Iar ar, Iag ag, Iab ab ]
• Un punto fuente emite luz en todas las direcciones.
• Un punto fuente p0 se caracteriza por:
– I(p0) = [ Ir(p0), Ig(p0), Ib(p0) ]
• La intensidad recibida es inversamente proporcional al cuadrado de la distancia entre la fuente y la superficie:
– I(p, p0) = ( 1/ | p - p0 |2 ) * I(p0)
• En la realidad las sombras generan escenas más suaves.
• Existen áreas complemente iluminadas, completamente sombreadas y área intermedias (penumbra).
• Fuente con un ángulo reducido de emisión.
• La intensidad no es pareja en el cono; es más fuerte en el centro.
• Si la luz está lo suficientemente lejos a la superficie, el vector de incidencia no cambia.
• Es equivalente a una fuente de luz con rayos paralelos.
• Modelo desarrollado por Phong.
• Buena aproximación computacional del modelo físico.
• El modelo usa 4 vectores para calcular el color de un punto P:
– n: n: normal en P,
– v: v: dirección de P hacia el observador (COP),
– l: l: dirección de P hacia fuente de luz,
– r: r: dirección de un rayo perfectamente reflejado
• El modelo de Phong utiliza 3 tipos de reflexión:
– ambiental
– difusa
– especular
• Cada fuente de luz tiene estas 3 componentes para cada color primario (RGB).
• Matriz de Iluminación de fuente i:
• El modelo busca calcular el porcentaje de luz reflejada en un punto.
• Esto depende de las propiedades de reflexión del punto.
• Matriz de reflexión para el punto i:
• La intensidad de una fuente de luz en el punto i:
• Contribución de varias fuentes:
• La intensidad de
• Parte de la luz se refleja y parte se absorbe.
• Coeficiente de reflexión de la superficie:
– Ra = ka, 0 ≤ ka ≤ 1
• Intensidad:
– Ia = kaLa
• La luz reflejada se esparce en todas las direcciones.
• No depende del punto de vista del observador.
• Depende de la posición de la luz y la superficie del material.
• Superficies ásperas proveen reflexión difusa.
• Superficies difusas también se les llama Superficies de Lambert.
• Pueden ser modeladas por las leyes de Lambert:
– Reflexión difusa: Rd α cos θ
– cos θ = l • n
• Considerando coeficiente de reflexión kd, y vectores normalizados:
• Considerando atenuación cuadrática de la luz por la distancia d que viaja desde la fuente a la superficie:
• La reflexión especular le agrega brillo a los objetos.
• Usualmente es de un color diferente que el de la luz ambiente y difusa reflejada.
• Una superficie especular es lisa.
• Se considera que la luz que ve el observador depende de:
– ángulo φ entre r y v,
– r: la dirección de reflexión, y
– v: la dirección del observador.
• El modelo Phong usa la siguiente ecuación:
– α: coeficiente de brillantes (shininess)
• Considerando vectores r y v normalizados:
• Para cada fuente de luz y color primario:
• El modelo Phong puede ser aplicado a superficies compuestas de polígonos.
• En estos objetos se pueden reducir la cantidad de trabajo requerido para shading.
• Cada polígono debe ser tratado aparte, a través de uno de los siguiente algoritmos:
– Flat shading
– Interpolative or Gouraud shading
– Phong shading
• En cada polígono el vector n es constante.
• Los vectores l, n y v pueden variar entre polígonos.
• En OpenGL:
– glShadeModel( GL_FLAT);
Interpolativo o Gouraud Shading
• En gouraud shading se considera la normal en cada vértice para el cálculo del color del pixel.
• El color de cada pixel se obtiene como la interpolación de las intensidades obtenidas entre vértices.
• En OpenGL:
– glShadeModel( GL_SMOOTH );
• Cálculo de las normales:
Phong Shading
• Phong propone que en vez de interpolar la intensidad del color, se interpolen las normales entre polígonos.
• Cálculo de normales de los bordes:
• Existen limitaciones en el modelo de lighting local.
• La iluminación se realiza independientemente en cada objeto.
• Métodos de iluminación global:
– Ray Tracing
– Radiosity
• Es una extensión del modelo visto.
• Es ideal para objetos altamente reflexivos y transparentes.
• Los rayos pueden entrar a la cámara:
– Directamente de la fuente.
– Después de una interacción con una superficie visible.
– Después de múltiples reflexiones de superficies.
– Después de transmisión a través de una o más superficies.
• Se considera sólo los rayos que parten desde el centro de proyección.
• Los rayos lanzados son los que contribuyen a la imagen.
• Se inicia un proceso de trazado de rayos.
Radiosity
• Es ideal para superficies difusas.
• Considera un balance de energía global que determina el color de cada superficie poligonal.
• Incluye interacción difusa-difusa.
• El método básico de radiosidad divide una escena en pequeños polígonos planos (patches), cada uno se asume perfectamente difuso.
• El cálculo de sombreado se realiza en dos pasos:
– Primero se considera la interacción entre parejas de patches, para determinar los “factores de forma” que describen cómo la energía que sale de un patch, afecta a otro.
– Luego, la ecuación de rendering (integral), se reduce a un conjunto lineal de ecuaciones de radiosidad.
– La solución entrega la radiosidad de cada path, lo que se utiliza en el rendering de la escena.
• El realismo de una escena depende de la iluminación.
• El color de una fuente de luz se caracteriza por la cantidad de rojo, verde y azul que puede emitir.
• Las propiedades de los materiales se caracterizan por la cantidad de luz roja, verde y azul que pueden reflejar en distintas direcciones.
• OpenGL utiliza una aproximación “liviana” para realizar el proceso en tiempo real.
• El modelo de lighting está dividido en cuatro componentes:
– Ambiente
– Difusa
– Especular
– Emisivo
• Componente Ambiente:
– Es luz que a sido esparcida por todo el ambiente y es imposible de determinar su origen.
– Cuando golpea una superficie se esparce igualmente en todas direcciones.
– Una sala iluminada tiene una gran componente ambiente.
• Componente Difusa:
– La luz viene de una dirección, pero cuando golpea una superficie se esparce igualmente en todas las direcciones.
– Una luz que proviene de una posición particular tiene una componente difusa.
• Componente Especular:
– La luz viene de una dirección, y cuando golpea una superficie se refleja en una dirección en particular.
– Un láser bien enfocado que choca con un espejo produce casi un 100% de reflexión especular.
– Ejemplos de materiales: metales pulidos y plásticos.
• El color de los materiales depende de luz RGB que llega y de la cantidad que se refleja.
• A un material se le asignan diferentes valores de reflexión para cada componente: ambiente, difusa y especular.
• Además dispone de una propiedad de color de emisión, la cual crea la sensación de que un objeto emite luz.
Cálculo de Valores RGB
• Para una fuente de luz y materiales se definen valores RGB.
• Para una fuente de luz corresponden a la intensidad emitida de cada componente.
• Para los materiales corresponde a la capacidad de reflexión del de cada componente.
• Si una luz tiene componentes (LR, LG, LB), y un material (MR, MG, MB), sin considerar los efectos de reflectividad, el color resultante es:
– (LR*MR, LG*MG, LB*MB)
• Definición de normales para cada vértice.
• Creación, posicionamiento y habilitación de una o más luces.
• Selección del modelo de lighting.
• Definición de las propiedades de los materiales.
void glLight{if}(GLenum light, GLenum pname, TYPEparam);
void glLight{if}v(GLenum light, GLenum pname, TYPE *param);
• Crea una fuente de luz: GL_LIGHT0, ... , GL_LIGHT7.
• Las características se definen por pname (ver tabla).
• param indica los valores asignados, dada la característica pname.
Valores por defecto para pname
Ejemplo de Definición y Posicionamiento de una Fuente de Luz
GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Posición de
• OpenGL permite ubicar una luz en el infinito o localmente:
– Direccional: está en el infinito, los rayos son paralelos. Se puede variar la dirección (x,y,z).
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
– Posicional: tiene en un posición (x,y,z) que especifica su posición en coordenadas del objeto. Luego es transformada por la matriz ModelView y almacenada en coordenadas del observador.
GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Atenuación de la Luz
• Para luz posicional OpenGL permite atenuación de la luz:
• Ejemplo:
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 2.0);
• OpenGL trata la posición y dirección de una fuente de luz tal cual como lo hace para la posición de una primitiva geométrica.
• Cuando se llama a glLight*(), la posición y dirección es transformada por la actual matriz de ModelView y se almacena en coordenadas del observador.
• Ejemplos:
– Luz en una posición fija.
– Luz en movimiento en torno a un objeto estacionario.
– Luz moviéndose junto con el punto de vista.
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho (-1.5, 1.5, -1.5*h/w, 1.5*h/w, -10.0, 10.0);
else
glOrtho (-1.5*w/h, 1.5*w/h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity();
/* later in init() */
GLfloat light_position[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, position);
static GLdouble spin;
void display() {
GLfloat light_position[] = { 0.0, 0.0, 1.5, 1.0 };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glPushMatrix();
glRotated(spin, 1.0, 0.0, 0.0);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glPopMatrix();
glutSolidTorus (0.275, 0.85, 8, 15);
glPopMatrix();
glFlush();
}
GLfloat light_position() = { 0.0, 0.0, 0.0, 1.0 };
glViewport(0, 0, (GLint) w, (GLint) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
static GLdouble ex, ey, ez, upx, upy, upz;
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
gluLookAt (ex, ey, ez, 0.0, 0.0, 0.0, upx, upy, upz);
glutSolidTorus (0.275, 0.85, 8, 15);
glPopMatrix();
glFlush();
}
Seleccionando un Modelo de Lighting
• Para seleccionar las propiedades del modelo:
void glLightModel{if}(GLenum pname, TYPEparam);
void glLightModel{if}v(GLenum pname, TYPE *param);
– pname define la característica (ver tabla).
– param especifica el valor.
Parámetros del Modelo de Lighting
• Luz Ambiente Global:
– Adicionalmente, se puede definir una luz ambiente que no viene de ningún lado:
GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,
– OpenGL permite definir un punto de vista local o infinito.
– Es importante en el cálculo de la reflexión especular.
– Para habilitar modelo local:
– glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
– OpenGL permite activar cálculo de lighting para la cara Front y Back de cada polígono:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
• voidglMaterial{if}(GLenum face, GLenum pname, TYPEparam);
• voidglMaterial{if}v(GLenum face, GLenum pname, TYPE *param);
– face: GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK.
– pname: propiedad (ver tabla).
– Param: valor.
Contenido
5.1 Clasificación de Proyecciones.
5.2 Posicionamiento de
5.3 Proyecciones Simples.
5.4 Eliminación de Superficies Ocultas.
• En el modelo de la cámara sintética se distinguen 2 partes:
– definición de los objetos a observar.
– definición de la cámara para observar.
• Se debe considerar:
– posición de la cámara.
– tipo de proyección.
– volumen de visión (window 3D, clipping volume).
• COP = Center of Projection (posición de cámara)
• Si se mueve el COP al infinito se obtiene una proyección paralela con DOP (direction of projection).
• Proyecciones Geométricas Planas
Proyección Ortográfica
• Los proyectores son perpendicular al plano de proyección.
Proyecciones Ortográficas
Perfil, Planta y Elevación
• El plano de proyección es paralelo a una cara del objeto.
• Preservación de distancias y ángulos.
• Se utilizan en el dibujo técnico.
• Los proyectores siguen perpendiculares sobre el plano de proyección, pero el plano de proyección no está paralelo a una cara del objeto.
• Isométrica: plano está simétrico a las 3 principales caras. Los ángulos entre las proyecciones de los tres ejes son iguales.
• Dimétrica: plano está simétrico a 2 caras. Los ángulos entre dos de los ejes son iguales.
• Trimétrica: caso general. Los ángulos entre los tres ejes son diferentes.
• Proyectores no son perpendiculares al plano de proyecciones
• Perspectiva clásica: observador se encuentra simétricamente con respecto al objeto.
• Se utiliza para obtener una impresión realista en 3 dimensiones del espacio (arquitectura y animación).
• A: 0 direcciones principales son paralelas al plano.
• B: 1 dirección principal es paralela al plano.
• C: 2 direcciones principales son paralelas al plano.
• Cámara en el Origen y Traslación de matriz Model-View.
– glTranslatef(0.0, 0.0, -5.0);
– mueve por defecto la cámara en dirección de +Z.
• glMatrixMode(GL_MODELVIEW);
• glLoadIdentity();
• glTranslatef(0.0, 0.0, -5.0);
• glRotatef(-90.0, 0.0, 1.0, 0.0);
gluLookAt(eyex,eyey,eyez,atx,aty,atz,upx,upy,upz)
Roll, Pitch y Yaw
• Cámara
a. Fondo de la cámara perpendicular a la dirección Z.
b. Caso general, fondo de la cámara con cualquier orientación.
• zp = -d
• x/z = -xp / d xp = -x /(z/d) x / (z/d)
• yp = -y / (z/d) y / (z/d)
• Nonuniform foreshortening.
• Transformación irreversible.
• Coordenadas Homogéneas:
– (x, y, z) (x, y, z, 1)
• Suponer:
– (x,y,z) (wx, wy, wz, w), w != 0
- Para recobrar (x,y,z) dividimos por w.
v’ = Mv
con v = ( x, y, z, w), vector columna.
5.4 Eliminación de Superficies Ocultas
• Algoritmos “hidden surface removal”.
• Algoritmos “visible surface”
• Los algoritmos se dividen en 2 clases:
– Object-Space: ordena las superficies del objeto.
– Image-Space: trabaja en conjunto con la proyección para determinar la relación entre los puntos del objeto.
• Algoritmo Z-Buffer (Image-Space).
Algoritmo Z-Buffer
• OpenGL:
– glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
– glEnable(GL_DEPTH_TEST);
– glClear(GL_DEPTH_BUFFER_BIT);