   Lighting a Cube
  Hi,Can someone please explain how I may display this blue cube as a blue cube. I thought that if white light shines on the blue surface, it would absorb the red and green light and reflect the blue. Yet the only way I can do this is change the light diffuse to blue./* Copyright (c) Mark J. Kilgard, 1997. *//* This program is freely distributable without licensing fees    and is provided without guarantee or warrantee expressed or    implied. This program is -not- in the public domain. *//* This program was requested by Patrick Earl; hopefully someone else   will write the equivalent Direct3D immediate mode program. */#include <GL/glut.h>GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};  /* Red diffuse light. */GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};  /* Infinite light location. */GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */  {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},  {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */  {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},  {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */voiddrawBox(void){int i;glColor3f(0.0f, 0.0f, 1.0f);for (i = 0; i < 6; i++) {glBegin(GL_QUADS);glNormal3fv(&n[0]);glVertex3fv(&v[faces[0]][0]);glVertex3fv(&v[faces[1]][0]);glVertex3fv(&v[faces[2]][0]);glVertex3fv(&v[faces[3]][0]);glEnd();}}voiddisplay(void){  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  drawBox();  glutSwapBuffers();}voidinit(void){  /* Setup cube vertex data. */  v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;  v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;  v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;  v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;  v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;  v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;  /* Enable a single OpenGL light. */  glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);  glLightfv(GL_LIGHT0, GL_POSITION, light_position);  glEnable(GL_LIGHT0);  glEnable(GL_LIGHTING);  /* Use depth buffering for hidden surface elimination. */  glEnable(GL_DEPTH_TEST);  /* Setup the view of the cube. */  glMatrixMode(GL_PROJECTION);  gluPerspective( /* field of view in degree */ 40.0,    /* aspect ratio */ 1.0,    /* Z near */ 1.0, /* Z far */ 10.0);  glMatrixMode(GL_MODELVIEW);  gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */    0.0, 0.0, 0.0, /* center is at (0,0,0) */    0.0, 1.0, 0.); /* up is in positive Y direction */  /* Adjust cube position to be asthetic angle. */  glTranslatef(0.0, 0.0, -1.0);  glRotatef(60, 1.0, 0.0, 0.0);  glRotatef(-20, 0.0, 0.0, 1.0);}intmain(int argc, char **argv){  glutInit(&argc, argv);  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);  glutCreateWindow("red 3D lighted cube");  glutDisplayFunc(display);  init();  glutMainLoop();  return 0;   /* ANSI C requires main to return int. */}
  Hi,I noticed in a article the usage of glEnable(GL_COLOR_MATERIAL);Should I be using this?;  When lighting is enabled, the primary color is computed from the lighting equation. You want to set material parameters. glColorMaterial is an option to have some material parameter track the color specified by glColor instead, but it doesn't change the fact that you need to set material, and it is just one way to specify some subset of the material parameters.   ;  Maybe, what that does is that enable reflective property so that youwon't have to use glMaterial* in every object.   