FOG.C
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //  本程序演示如何使用雾效,在场景中的不同深度共绘制了5个球,按下F
  2. //  键可以在三种不同的雾方程之间进行切换 #include <GL/glut.h> #include <math.h> #include <stdlib.h> #include <stdio.h> static GLint fogMode; //  初始化深度缓冲区、雾效、光源、材质特性和光照模型 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);    }    glClearColor(0.5, 0.5, 0.5, 1.0);   } static void renderSphere (GLfloat x, GLfloat y, GLfloat z)
  3. {
  4.    glPushMatrix();
  5.    glTranslatef (x, y, z);
  6.    glutSolidSphere(0.4, 16, 16);
  7.    glPopMatrix();
  8. }
  9. //  在不同的z坐标绘制了5个球 void display(void) {    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    renderSphere (-2., -0.5, -1.0);    renderSphere (-1., -0.5, -3.0);    renderSphere (0., -0.5, -5.0);    renderSphere (1., -0.5, -7.0);    renderSphere (2., -0.5, -9.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);    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_EXP2n");          }          else if (fogMode == GL_EXP2) {             fogMode = GL_LINEAR;             printf ("Fog mode is GL_LINEARn");          }          else if (fogMode == GL_LINEAR) {             fogMode = GL_EXP;             printf ("Fog mode is GL_EXPn");          }          glFogi (GL_FOG_MODE, fogMode);          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(200, 200);    glutCreateWindow(argv[0]);    init();    glutReshapeFunc (reshape);    glutKeyboardFunc (keyboard);    glutDisplayFunc (display);    glutMainLoop();    return 0; }