/* 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; }