lunes, 12 de noviembre de 2012

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