Creacion de Fuentes de Luz
Las fuentes de luz en OpenGL tienen una serie de propiedades tales como: el color, la posición y su dirección. La función utilizada para especificar dichas propiedades es glLight*.
La sintaxis de este comando es la siguiente:
void glLight{if}[v](GLenum light, GLenum pname, TYPE param);
De esta forma se crea la fuente de luz que indica el parámetro light, el cual puede recibir los valores GL_LIGHT0, GL_LIGHT1, … , GL_LIGHT7 (ocho fuentes de luz como máximo en la definición estándar de la librería). Las características de la luz se especifican en el parámetro pname utilizando las constantes que se muestran en la tabla adjunta. Finalmente, el argumento param indica los valores de la característica fijada en pname.
Nombre del parámetro
|
Valor por defecto
|
Significado
|
GL_AMBIENT
|
(0.0, 0.0, 0.0, 1.0)
|
intensidad ambiente RGBA de la luz
|
GL_DIFFUSE
|
(1.0, 1.0, 1.0, 1.0)
|
intensidad difusa RGBA de la luz
|
GL_SPECULAR
|
(1.0, 1.0, 1.0, 1.0)
|
intensidad especular RGBA de la luz
|
GL_POSITION
|
(0.0, 0.0, 1.0, 0.0)
|
posición (x,y,z,w) de la luz
|
GL_SPOT_DIRECTION
|
(0.0, 0.0, -1.0)
|
dirección (x,y,z) del foco de luz
|
GL_SPOT_EXPONENT
|
0.0
|
exponente del foco de luz
|
GL_SPOT_CUTOFF
|
180.0
|
ángulo del foco de luz
|
GL_CONSTANT_ATTENUATION
|
1.0
|
factor de atenuación constante
|
GL_LINEAR_ATTENUATION
|
0.0
|
factor de atenuación lineal
|
GL_QUADRATIC_ATTENUATION
|
0.0
|
factor de atenuación cuadrático
|
Nota: Los valores por defecto de GL_DIFFUSE y GL_SPECULAR se aplican sólo a GL_LIGTH0. Para otras fuentes de luz, los valores por defecto son (0.0, 0.0, 0.0, 1.0) para ambos casos.
Ejemplo de utilización del comando glLight*:
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);
Una vez creada la fuente de luz es necesario activar primero la iluminación de la escena (en caso contrario los objetos se visualizan únicamente con el color activo, sin incluir los efectos de luz, ni el tipo de material) y posteriormente cada una de las fuentes de luz que la iluminan. La función encargada de realizar dicha tarea es glEnable.
glEnable(GL_LIGHTING); {Activar el modelo de iluminación}
glEnable(GL_LIGHT0); {Activar la fuente de luz 0}
Para desactivar la iluminación debe utilizarse la función glDisable con el argumento GL_LIGHTING. De igual forma apagaremos cada una de las fuentes de luz con la misma función utilizando como argumento la luz que se desea apagar.
Color
El color de la fuente de luz se indica mediante sus componentes ambiente, difusa y especular. El significado asociado con cada uno de ellos es el siguiente:
· Ambiente. Indica la aportación a la iluminación ambiente de la escena
· Difusa. Determina el color de la fuente de luz
· Especular. Define el color del brillo especular que produce la fuente de luz
Posición
En OpenGL pueden utilizarse dos tipos de fuentes de luz, dependiendo de como se define su posición en el espacio:
· Direccionales. (x, y, z) indica el vector de dirección y w es cero. La luz se localiza en el infinito
· Posicionales. (x, y, z, w) indican la posición en coordenadas homogéneas. La luz se encuentra en la escena
Por tanto, la componente homogénea w determina el tipo de luz (direccional si w=0, posicional si w=1), mientras que las coordenadas x, y, z determinan la posición o dirección a la fuente de luz. Hay que tener en cuenta que en OpenGL la posición o dirección de una fuente de luz recibe el mismo tratamiento que la posición de una primitiva geométrica, es decir, una fuente de luz esta sujeta a las mismas transformaciones que una primitiva de acuerdo con la matriz de modelo / vista (GL_MODELVIEW)
Atenuación
En el mundo real, la intensidad de iluminación de las luces decrece a medida que aumenta la distancia a las mismas. En OpenGL se puede obtener este efecto para las luces posicionales definiendo los parámetros de atenuación constante (Kc), lineal (Kl) y cuadrática (Kq). La ecuación utilizada es la siguiente:
factor de atenuación = 1 / (Kc + Kl*d + Kq*d2)
Calculo de la Normal en OpenGl
Una de las caracteristicas que se puede establecer de un vertice es el color, pero podemos establecer otras caracteristicas como coordenada de la textura o la normal que sirve para realizar los calculos de iluminacion resultante. No importa el orden en que se definan las caraceteristicas pero siempre se hara antes de definir el vertice.glColor3f(1.0, 0.3, 0.4); //color del vertice
glNormal3f(1.0, 0.0, 0.0); //Normal del vertice
glTextCoord2f(0.0, 1.0); //Coordenada de la textura
glVertex3f (1.0, 3.2, 3.6); //vertice
El vector normal se utiliza para calcular la incidencia de la luz sobre el vertice, si el vector normal no es unitario el vertice estara sobreiluminado (mayor que 1) o infraluminado (menor que 1).
Es muy importante que para cada vertice se defina la normal, ya que OpenGL no asigna la normal a partir de la orientacion primitiva. De lo contrario utilizara como normal al ultima normal establecida.
No hay comentarios:
Publicar un comentario