af_depthcue.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:5k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1997. */
  2. /* A version of the OpenGL Programming Guide's depthcue.c that
  3.    uses the "addfog" routines to add depth cueing as a post-rendering
  4.    pass.  This is not a rather poor application for "addfog" but it
  5.    does demonstrate how it use "addfog".  See "addfog.c" for details.  */
  6. /*
  7.  * (c) Copyright 1993, Silicon Graphics, Inc.
  8.  * ALL RIGHTS RESERVED 
  9.  * Permission to use, copy, modify, and distribute this software for 
  10.  * any purpose and without fee is hereby granted, provided that the above
  11.  * copyright notice appear in all copies and that both the copyright notice
  12.  * and this permission notice appear in supporting documentation, and that 
  13.  * the name of Silicon Graphics, Inc. not be used in advertising
  14.  * or publicity pertaining to distribution of the software without specific,
  15.  * written prior permission. 
  16.  *
  17.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  18.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  19.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  20.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  21.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  22.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  23.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  24.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  25.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  26.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  27.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  28.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  29.  * 
  30.  * US Government Users Restricted Rights 
  31.  * Use, duplication, or disclosure by the Government is subject to
  32.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  33.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  34.  * clause at DFARS 252.227-7013 and/or in similar or successor
  35.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  36.  * Unpublished-- rights reserved under the copyright laws of the
  37.  * United States.  Contractor/manufacturer is Silicon Graphics,
  38.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  39.  *
  40.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  41.  */
  42. /*
  43.  *  depthcue.c
  44.  *  This program draws a wireframe model, which uses 
  45.  *  intensity (brightness) to give clues to distance.
  46.  *  Fog is used to achieve this effect.
  47.  */
  48. #include <stdlib.h>
  49. #include <GL/glut.h>
  50. #include "addfog.h"
  51. /*  Initialize linear fog for depth cueing.
  52.  */
  53. void myinit(void)
  54. {
  55.     GLfloat fogColor[4] = {0.0, 0.0, 0.0, 1.0};
  56.     glFogi (GL_FOG_MODE, GL_LINEAR);
  57.     glHint (GL_FOG_HINT, GL_NICEST);  /*  per pixel   */
  58.     glFogf (GL_FOG_START, 3.0);
  59.     glFogf (GL_FOG_END, 5.0);
  60.     glFogfv (GL_FOG_COLOR, fogColor);
  61.     glClearColor(0.0, 0.0, 0.0, 1.0);
  62.     glDepthFunc(GL_LESS);
  63.     glEnable(GL_DEPTH_TEST);
  64.     glShadeModel(GL_FLAT);
  65.     afEyeNearFar(3.0, 5.0);
  66.     afFogStartEnd(3.0, 5.0);
  67.     afFogMode(GL_LINEAR);
  68.     afFogColor(0.0, 0.0, 0.0);
  69. }
  70. int width, height;
  71. int twopass = 1;
  72. /*  display() draws an icosahedron.
  73.  */
  74. void display(void)
  75. {
  76.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  77.     if (!twopass) {
  78.       glEnable(GL_FOG);
  79.     } else {
  80.       glDisable(GL_FOG);
  81.     }
  82.     glColor3f (1.0, 1.0, 1.0);
  83.     glutWireIcosahedron();
  84.     if (twopass) {
  85.       afDoFinalFogPass(0, 0, width, height);
  86.     }
  87.     glutSwapBuffers();
  88. }
  89. void myReshape(int w, int h)
  90. {
  91.   width = w;
  92.   height = h;
  93.     glViewport(0, 0, w, h);
  94.     glMatrixMode(GL_PROJECTION);
  95.     glLoadIdentity();
  96.     gluPerspective (45.0, (GLfloat) w/(GLfloat) h, 3.0, 5.0);
  97.     glMatrixMode(GL_MODELVIEW);
  98.     glLoadIdentity ();
  99.     glTranslatef (0.0, 0.0, -4.0);  /*  move object into view   */
  100. }
  101. /* ARGSUSED1 */
  102. void
  103. keyboard(unsigned char c, int x, int y)
  104. {
  105.   switch(c) {
  106.   case 'T':
  107.   case 't':
  108.     twopass = 1 - twopass;
  109.   case ' ':
  110.     glutPostRedisplay();
  111.     break;
  112.   }
  113. }
  114. void
  115. menu(int value)
  116. {
  117.   switch(value) {
  118.   case 1:
  119.     twopass = 0;
  120.     break;
  121.   case 2:
  122.     twopass = 1;
  123.     break;
  124.   }
  125.   glutPostRedisplay();
  126. }
  127. /*  Main Loop
  128.  */
  129. int main(int argc, char** argv)
  130. {
  131.     glutInitWindowSize(380, 380);
  132.     glutInit(&argc, argv);
  133.     glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  134.     glutCreateWindow("depthcuing by post-rendering pass");
  135.     myinit();
  136.     glutReshapeFunc(myReshape);
  137.     glutDisplayFunc(display);
  138.     glutKeyboardFunc(keyboard);
  139.     glutCreateMenu(menu);
  140.     glutAddMenuEntry("GL_LINEAR depthcueing", 1);
  141.     glutAddMenuEntry(""add fog" post-render depthcueing", 2);
  142.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  143.     glutMainLoop();
  144.     return 0;             /* ANSI C requires main to return int. */
  145. }