1. Como activar las fuentes de luz en OpenGL
Para habilitar el modo de iluminacion se realiza con la funcion glEnable(GL_LIGHTING), cuando renderizamos en este modo la instruccion glColor no tienen ninguna influencia ya que el color resultante de cada vertice es calculado a aprtir de los materiales del vertice y las luces que haya encendidas.
Cada luz se puede configurar estableciendo los siguientes parametros con la funcion glLight(if)v:
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) = Intensidad ambiente de la luz
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) GL_LIGHT0 (0.0, 0.0, 0.0, 1.0) GL_LIGHT1-GL_LIGHT7 = intensidad difusa de la luz
GL_SPECULAR (1.0, 1.0, 1.0, 1.0) GL_LIGHT0 (0.0, 0.0, 0.0, 1.0) GL_LIGHT1-GL_LIGHT7 = intensidad especular de la luz
GL_POSITION (0.0, 0.0, 0.0, 1.0) = (x, y, z, w) Posicion de la luz
GL_SPOT_DIRECTION (0.0, 0.0, -1.0) = (x, y,z) direccion de la luz
GL_SPOT_EXPONENT (0.0) = exponente del foco
GL_SPOT_CUTOFF (180.0) = angulo de abertura del foco
GL_CONSTANT_ATTENUATION (1.0) = factor de atenuacion constante
GL_LINEAR_ATTENUATION (0.0) = factor de atenuacion lineal
GL_QUADRATIC_ATTENUATION (0.0) = factor de atenuacion cuadratico
2. Como calcular la normal para cada vertice 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.
3 Ejemplos de Codigo OpenGL manejando la iluminacion
No hay comentarios:
Publicar un comentario