/* In the following code we are going study Fog. 1. Run the code as is. Hit the 'f' key to toggle between the three types of fog: GL_EXP, GL_EXP2, GL_LINEAR. If the MS-DOS window is visible, you will see which type of fog is being calculated. 2. The keys 'x', 'y', and 'z' can be used to rotate and view the scene from different angles. Scroll through the code and take note of where each sphere is being rendered. What happens if each sphere is rendered in the same z=-1.0 plane? 3. Change the glHint from GL_DONT_CARE to GL_FASTEST then GL_NICEST. 4. Try different values for the GL_FOG_DENSITY. */ #include #include #include #include static GLint fogMode; GLfloat xangle=0; GLfloat yangle=0; GLfloat zangle=0; static void init(void) { GLfloat position[] = { 0.5 , 0.5 , 3.0 , 0.0 }; glEnable(GL_DEPTH_TEST); glLightfv(GL_LIGHT0 , GL_POSITION , position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); { GLfloat mat[3] = {0.1745,0.01175,0.01175}; 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); { GLfloat fogColor[4] = { 0.5 , 0.5 , 0.5 , 1.0 }; fogMode = GL_EXP; glFogi(GL_FOG_MODE, fogMode); glFogfv(GL_FOG_COLOR, fogColor); glFogf(GL_FOG_DENSITY, 0.35); glHint(GL_FOG_HINT, GL_DONT_CARE); glFogf(GL_FOG_START, 1.0); glFogf(GL_FOG_END, 5.0); } // Fog Color glClearColor(0.5 , 0.5 , 0.5 , 1.0); } static void renderSphere(GLfloat x, GLfloat y, GLfloat z) { glPushMatrix(); glTranslatef(x, y, z); glutSolidSphere(0.4, 16, 16); glPopMatrix(); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(xangle, 1, 0, 0); glRotatef(yangle, 0, 1, 0); glRotatef(zangle, 0, 0, 1); // render 5 spheres, at different distances, to sample the effects of fog renderSphere(-2.0 , -0.5 , -1.0); renderSphere(-1.0 , -0.5 , -2.0); renderSphere( 0.0 , -0.5 , -3.0); renderSphere( 1.0 , -0.5 , -4.0); renderSphere( 2.0 , -0.5 , -5.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)h/(GLfloat)w, 2.5*(GLfloat)h/(GLfloat)w, -2.5, 2.5, -10.0 , 10.0 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key , int x, int y) { 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 'q': case 'Q': exit(0); break; case 'x': xangle+=5; glutPostRedisplay(); break; case 'y': yangle+=5; glutPostRedisplay(); break; case 'z': zangle+=5; glutPostRedisplay(); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }