/* INTRODUCCION A LAS LUCES
========================
Parametros de glLight*()
========================
Parameter Name Default Value Meaning
TIPOS DE LUZ
============
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) ambient RGBA intensity of light
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) diffuse RGBA intensity of light
GL_SPECULAR (1.0, 1.0, 1.0, 1.0) specular RGBA intensity of light
ambiental.- Restos de la luz
difusa.- Incide sobre un objeto y proviene de un determinado punto
especular.- Al incidir se ve reflejada con un angulo similar al de incidencia
emitida.- Emitida por el objeto
GL_POSITION (0.0, 0.0, 1.0, 0.0) (x, y, z, w) position of light
GL_SPOT_DIRECTION (0.0, 0.0, -1.0) (x, y, z) direction of spotlight
GL_SPOFOT_EXPONENT 0.0 spotlight exponent
GL_SPOT_CUTF 180.0 spotlight cutoff angle
GL_CONSTANT_ATTENUATION 1.0 constant attenuation factor
GL_LINEAR_ATTENUATION 0.0 linear attenuation factor
GL_QUADRATIC_ATTENUATION 0.0 quadratic attenuation factor
posicion.- Indica si la luz es posicional o direccional
-glLightfv(LIGHTn, GL_POSITION, V)-
V = (x, y, y, w); si w=0 es direccional. si w=1 es posicional
direccion
del foco.- Si la luz es focal -glLightfv(LIGHTn, GL_SPOT_DIRECTION, V)- V=(x, y, z)
atenuacion
del foco.- Degradacion de la intensidad. -glLightf(LIGHTn, GL_SPOT_EXPONENT, Val)-
apertura
del foco.- -glLightf(LIGHTn, GL_SPOT_CUTOFF, Val)- Val=angulo/2 (grados)
intensidad Color ambiental, difuso y especular
de la luz.- -glLightfv(LIGHTn, GL_[AMBIENT | DIFFUSE | SPECULAR], V)- V=(r, g, b, a)
atenuacion Perdida de la intensidad de la luz
de la luz.- -glLightf(LIGHTn, GL_[CONSTANT | LINEAR | QUADRATIC]_ATTENUATION, Val)-
NOTA:
1) El color de un objeto se define por su material no por el color de sus vertices
2) La iluminacion se calcula a nivel de vertice (material activo, luces activas e incidencia sobre ellos)
=================================================================================
=================================================================================
RESPECTO AL MATERIAL -glMaterial*()-
color.-
glMaterialfv(GL_FRONT[_AND_BACK], [GL_AMBIENT | GL_DIFUSSE | GL_AMBIENT_AND_DIFUSSE | GL_SPECULAR], V)
V=(r, g, b, a)
intensidad del brillo.-
glMaterialf(GL_FRONT[_AND_BACK], GL_SHININESS, Val)
Si se desea cambiar el color de un material:
--------------------------------------------
glEnable(GL_COLOR_MATERIAL)
glColorMaterial(GL_FRONT[_AND_BACK], [GL_AMBIENT | GL_DIFUSSE | GL_AMBIENT_AND_DIFUSSE | GL_SPECULAR])
glColor3f(r, g, b)
-se usa-
glDisable(GL_COLOR_MATERIAL)
=================================================================================
=================================================================================
PASOS PARA LA ILUMINACION
1.- Activar la iluminaciOn
glEnable (GL_LIGHTING);
2.- Establecer las propiedades de cada luz y activarlas
glLight*()
glEnable(GL_LIGHTn) 0 <= n <= N, (N=8)
=================================================================================
=================================================================================
*/
#include <GL/glut.h>
// Definicion de arreglos que se van a utilizar
// --------------------------------------------
GLfloat mat_color [] = {1.0,0.0,0.0,1.0}; // El color ambiental y difuso del material
GLfloat light_color [] = {1.0,1.0,1.0,1.0}; // El color difuso y especular de la luz
GLfloat light_ambient [] = {0.0,0.0,0.0,1.0}; // El color ambiental de la luz (si algo estA fuera de la luz, no se ilumina)
GLfloat normal [] = {0.0,1.0,0.0}; // Valor de las normales (como el cuadrado estA en el plano (x,z), las
// normales van hacia arriba)
//GLfloat normal2[] = {1.0,1.0,-1.0}; // prueba 1
GLfloat normal2[] = {0.0,-1.0,-1.0}; // prueba 2
//GLfloat normal2[] = {1.0,-1.0,-1.0}; // prueba 3
//GLfloat normal2[] = {-1.0,-1.0,-1.0}; // prueba 4
GLfloat light_dir [] = {0.0,1.0,0.0,0.0}; // El valor de la direcciOn de la luz (es una luz situada en el eje Y, en el
// infinito, luego sus rayos irIan hacia abajo en el eje Y)
void display(void)
{
//Dibujamos el cuadrado, y antes de cada vertice, establecemos su normal.
glBegin(GL_QUADS);
glNormal3fv(normal2); glVertex3f(-1.0, 0.0, -1.0);
glNormal3fv(normal); glVertex3f(-1.0, 0.0, 1.0);
glNormal3fv(normal2); glVertex3f( 1.0, 0.0, 1.0);
glNormal3fv(normal); glVertex3f( 1.0, 0.0, -1.0);
glEnd();
glFlush();
sleep(20);
exit(0);
}
void initgl(void)
{
// Activamos la luz, y sus caracterIsticas, excepto la direcciOn:
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_color);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_color);
glEnable(GL_LIGHT0);
glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_color); // Seleccionamos el color del material
//Establecemos la perspectiva y posicionamos al observador:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,1.0,1.0,100.0);
glMatrixMode(GL_MODELVIEW);
glTranslatef(-0.3,-0.6,-4.0);
glLightfv(GL_LIGHT0,GL_POSITION,light_dir); // Establecemos la direcciOn de la luz
// (sometida a la posicion de la camara)
glClearColor(0.0,0.0,0.0,0.0); // Seleccionamos el color de fondo
glClear(GL_COLOR_BUFFER_BIT); // borramos la pantalla
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (600, 600);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
initgl();
glutDisplayFunc(display); // REGISTRAR FUNCION Callback
glutMainLoop();
return 0;
}