/******************************************************************** Program fog.cpp Adapted from the example program in Chapter 6 of the OpenGL Programming Guide for OpenGL 2.1 by H Masterman April 2009 Changes made: perspective projection added some comments added the ability to change the density interactively ********************************************************************/ #include #include #include static GLint fogMode; float density = 0.3; static void init(void) { GLfloat position[] = { 0.5, 0.5, 3.0, 0.0 }; //for locating the light glEnable(GL_DEPTH_TEST); glLightfv(GL_LIGHT0, GL_POSITION, position); //position the light glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); { GLfloat mat[3] = {0.1745, 0.01175, 0.01175}; //set the material properties for the spheres glMaterialfv (GL_FRONT, GL_AMBIENT, mat); mat[0] = 0.61424; mat[1] = 0.04136; mat[2] = 0.04136; glMaterialfv (GL_FRONT, GL_DIFFUSE, mat); mat[0] = 0.727811; mat[1] = 0.626959; mat[2] = 0.626959; glMaterialfv (GL_FRONT, GL_SPECULAR, mat); glMaterialf (GL_FRONT, GL_SHININESS, 0.6*128.0); } glEnable(GL_FOG); //fog must always be enabled { GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1.0}; fogMode = GL_EXP; //initial fog mode glFogi (GL_FOG_MODE, fogMode); glFogfv (GL_FOG_COLOR, fogColor); //set the fog color to grey glFogf (GL_FOG_DENSITY, density); //set the fog density glHint (GL_FOG_HINT, GL_NICEST); //nicest possible rendering glFogf (GL_FOG_START, 2.0); //start distance for linear fog glFogf (GL_FOG_END, 6.0); //end distance for linear fog } glClearColor(0.5, 0.5, 0.5, 1.0); // set the background color = fog color } static void renderSphere (GLfloat x, GLfloat y, GLfloat z) //render a sphere at x,y,z { glPushMatrix(); glTranslatef (x, y, z); glutSolidSphere(0.4, 32, 32); glPopMatrix(); } /* display() draws 5 spheres at different z positions. */ void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); renderSphere (-2., -0.5, -2.0); renderSphere (-1., -0.5, -3.0); renderSphere (0., -0.5, -4.0); renderSphere (1., -0.5, -5.0); renderSphere (2., -0.5, -6.0); glFlush(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* if (w <= h) glOrtho (-2.5, 2.5, -2.5*(GLfloat)h/(GLfloat)w, 2.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0); else glOrtho (-2.5*(GLfloat)w/(GLfloat)h, 2.5*(GLfloat)w/(GLfloat)h, -2.5, 2.5, -10.0, 10.0); */ gluPerspective(75, 1.0,1.0,20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity (); } void keyboard(unsigned char key, int x, int y) //user can toggle the fog mode { switch (key) { case 'f': case 'F': if (fogMode == GL_EXP) { fogMode = GL_EXP2; printf ("Fog mode is GL_EXP2\n"); } else if (fogMode == GL_EXP2) { fogMode = GL_LINEAR; printf ("Fog mode is GL_LINEAR\n"); } else if (fogMode == GL_LINEAR) { fogMode = GL_EXP; printf ("Fog mode is GL_EXP\n"); } glFogi (GL_FOG_MODE, fogMode); glutPostRedisplay(); break; case 'D': //increase the density density += 0.1; glFogf (GL_FOG_DENSITY, density); //set the fog density glutPostRedisplay(); printf("Density = %2.1f\n",density); break; case 'd': //decrease the density density -= 0.1; printf("Density = %2.1f\n",density); glFogf (GL_FOG_DENSITY, density); //set the fog density glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(700, 700); glutCreateWindow(argv[0]); init(); glutReshapeFunc (reshape); glutKeyboardFunc (keyboard); glutDisplayFunc (display); glutMainLoop(); return 0; }