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 :
Parametro | Valor por defecto | Significado |
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_EXPONENT | 0.0 | exponente del foco |
GL_SPOT_CUTOFF | 180.0 | angulo de abertura del foco |
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 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
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
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 luzglPopMatrix();
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
// Dibujamos la escenaglTranslatef(0.0, 0.0, -5.0);
glutTeaPot(1.0);
glutSwapBuffers();
}
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 luzglPopMatrix();
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
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:
No hay comentarios:
Publicar un comentario