domingo, 11 de noviembre de 2012

Resumen U4

Como activar las fuentes de luz en OPEN GL

El cálculo del color se realiza en cada vértice según las luces que haya encendidas y las propiedades del material de dicho vértice, no tiene en cuenta posibles oclusiones de terceros objetos que producirían sombras, reflejos de la luz que permitiría tener espejos o refracciones de la luz para ver a traves de materiales como el agua.
Luces
Para habilitar el modo de iluminación se realiza con la función glEnable(GL_LIGHTING), cuando renderizamos en este modo la instrucción glColor no tienen ninguna influencia ya que el color resultante de cada vértice es calculado a partir de los materiales del vértice y las luces que haya encendidas.
 
Disponemos de ocho luces que podemos encender o apagar con la función glEnable(GL_LIGHTi) donde i =[0..7]. Cada luz la podemos configurar estableciendo los siguientes parámetros con la función glLight{if}v :
ParametroValor por defectoSignificado
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_LIGTH0
(0.0, 0.0, 0.0, 1.0) GL_LIGTH1-GL_LIGHT7
intensidad difusa de la luz
GL_SPECULAR(1.0, 1.0, 1.0, 1.0) GL_LIGTH0
(0.0, 0.0, 0.0, 1.0) GL_LIGTH1-GL_LIGHT7
intensidad especular de la luz
GL_POSITION(0.0, 0.0, 0.0, 1.0)(x, y, z, w) posición de la luz
GL_SPOT_DIRECTION(0.0, 0.0, -1.0)(x, y, z) dirección de la luz
GL_SPOT_EXPONENT0.0exponente del foco
GL_SPOT_CUTOFF180.0angulo de abertura del foco
GL_CONSTANT_ATTENUATION1.0factor de atenuación constante
GL_LINEAR_ATTENUATION0.0factor de atenuación lineal
GL_QUADRATIC_ATTENUATION0.0factor de atenuación cuadratico
 
Como Calcular la normal para cada vertice en opengl ?
Normales
Una de las características que se puede establecer de un vértice es el color (o el material si estamos en modo iluminacion), pero podemos establecer otras características como la coordenada de la textura o la normal que sirve para realizar los calculos de la iluminación resultante. No importa el orden en que se definan las características pero siempre se hará antes de definir el vértice.
glColor3f(1.0, 0.3, 0.4); // Color del vértice
glNormal3f(1.0, 0.0, 0.0); // Normal del vértice
glTexCoord2f(0.0, 1.0); // Coordenada de la textura
glVertex3f(1.0, 3.2, 3.6); // Vértice
 
3ejemplos de codigo en opengl manejando iluminación :

1) Luz en un punto fijo de la escena
GLfloat lightPos[4] = {1.0, 4.0, 7.5, 1.0}; // Luz direccionalvoid Display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(posx, posy, posz, eyex, eyey, eyez, upx, upy, upz);
glPushMatrix();

// Aqui podriamos aplicar alguna transformación para mover la luz
glLightfv(GL_LIGHT0, GL_LIGHT_POSITION, lightPos);

// Aqui dibujamos la luz
glPushAttrib(GL_LIGHTING_BIT); // Guardamos el estado de las luces
glDisable(GL_LIGHTING); // Deshabilitamos las luces
glutSolidSphere(1.0, 25, 25); // Dibujamos la luz para que sepamos donde esta
glPopAttrib(GL_LIGHTING_BIT); // Restauramos el estado de las luces
glPopMatrix();
// Dibujamos la escenaglTranslatef(0.0, 0.0, -5.0);
glutTeaPot(1.0);

glutSwapBuffers();
}
 
2) Luz con relación a la cámara
GLfloat lightPos[4] = {1.0, 4.0, 7.5, 1.0}; // Luz direccionalvoid Display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glPushMatrix();
// Aqui podriamos aplicar alguna transformación para mover la luz
glLightfv(GL_LIGHT0, GL_LIGHT_POSITION, lightPos);

// Aqui dibujamos la luz
glPushAttrib(GL_LIGHTING_BIT); // Guardamos el estado de las luces
glDisable(GL_LIGHTING); // Deshabilitamos las luces
glutSolidSphere(1.0, 25, 25); // Dibujamos la luz para que sepamos donde esta
glPopAttrib(GL_LIGHTING_BIT); // Restauramos el estado de las luces
glPopMatrix();
gluLookAt(posx, posy, posz, eyex, eyey, eyez, upx, upy, upz);// Dibujamos la escenaglTranslatef(0.0, 0.0, -5.0);
glutTeaPot(1.0);

glutSwapBuffers();
}
 3) Poligono
glBegin(GL_POLYGON);
glColor3f(1.0f,1.0f,1.0f);
glVertex3f(-10,15,0);
glColor3f(0.0f,0.0f,0.0f);
glVertex3f(10,5,0);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(10,-5,0);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0,-10,0);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f
glEnd();
 
Producirá una imagen como esta:
Color

No hay comentarios:

Publicar un comentario