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

GIS编程

开发平台:

Visual C++

  1. /* accumaa.c - by Tom McReynolds, SGI */
  2. /* Using the accumulation buffer for scene antialiasing. */
  3. #include <GL/glut.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. const GLdouble FRUSTDIM = 100.f;
  7. /* Create a single component texture map */
  8. GLfloat *
  9. make_texture(int maxs, int maxt)
  10. {
  11.   int s, t;
  12.   static GLfloat *texture;
  13.   texture = (GLfloat *) malloc(maxs * maxt * sizeof(GLfloat));
  14.   for (t = 0; t < maxt; t++) {
  15.     for (s = 0; s < maxs; s++) {
  16.       texture[s + maxs * t] = ((s >> 4) & 0x1) ^ ((t >> 4) & 0x1);
  17.     }
  18.   }
  19.   return texture;
  20. }
  21. enum {
  22.   SPHERE = 1, CONE
  23. };
  24. void
  25. render(void)
  26. {
  27.   /* material properties for objects in scene */
  28.   static GLfloat wall_mat[] =
  29.   {1.f, 1.f, 1.f, 1.f};
  30.   glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  31.   /* Note: wall verticies are ordered so they are all front facing this lets
  32.      me do back face culling to speed things up.  */
  33.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
  34.   /* floor */
  35.   /* make the floor textured */
  36.   glEnable(GL_TEXTURE_2D);
  37.   /* Since we want to turn texturing on for floor only, we have to make floor 
  38.      a separate glBegin()/glEnd() sequence. You can't turn texturing on and
  39.      off between begin and end calls */
  40.   glBegin(GL_QUADS);
  41.   glNormal3f(0.f, 1.f, 0.f);
  42.   glTexCoord2i(0, 0);
  43.   glVertex3f(-100.f, -100.f, -320.f);
  44.   glTexCoord2i(1, 0);
  45.   glVertex3f(100.f, -100.f, -320.f);
  46.   glTexCoord2i(1, 1);
  47.   glVertex3f(100.f, -100.f, -520.f);
  48.   glTexCoord2i(0, 1);
  49.   glVertex3f(-100.f, -100.f, -520.f);
  50.   glEnd();
  51.   glDisable(GL_TEXTURE_2D);
  52.   /* walls */
  53.   glBegin(GL_QUADS);
  54.   /* left wall */
  55.   glNormal3f(1.f, 0.f, 0.f);
  56.   glVertex3f(-100.f, -100.f, -320.f);
  57.   glVertex3f(-100.f, -100.f, -520.f);
  58.   glVertex3f(-100.f, 100.f, -520.f);
  59.   glVertex3f(-100.f, 100.f, -320.f);
  60.   /* right wall */
  61.   glNormal3f(-1.f, 0.f, 0.f);
  62.   glVertex3f(100.f, -100.f, -320.f);
  63.   glVertex3f(100.f, 100.f, -320.f);
  64.   glVertex3f(100.f, 100.f, -520.f);
  65.   glVertex3f(100.f, -100.f, -520.f);
  66.   /* ceiling */
  67.   glNormal3f(0.f, -1.f, 0.f);
  68.   glVertex3f(-100.f, 100.f, -320.f);
  69.   glVertex3f(-100.f, 100.f, -520.f);
  70.   glVertex3f(100.f, 100.f, -520.f);
  71.   glVertex3f(100.f, 100.f, -320.f);
  72.   /* back wall */
  73.   glNormal3f(0.f, 0.f, 1.f);
  74.   glVertex3f(-100.f, -100.f, -520.f);
  75.   glVertex3f(100.f, -100.f, -520.f);
  76.   glVertex3f(100.f, 100.f, -520.f);
  77.   glVertex3f(-100.f, 100.f, -520.f);
  78.   glEnd();
  79.   glPushMatrix();
  80.   glTranslatef(-80.f, -60.f, -420.f);
  81.   glCallList(SPHERE);
  82.   glPopMatrix();
  83.   glPushMatrix();
  84.   glTranslatef(-20.f, -80.f, -500.f);
  85.   glCallList(CONE);
  86.   glPopMatrix();
  87.   if (glGetError())     /* to catch programming errors; should never happen */
  88.     printf("Oops! I screwed up my OpenGL calls somewheren");
  89.   glFlush();            /* high end machines may need this */
  90. }
  91. /* compute scale factor for window->object space transform could use
  92.    gluUnProject(), but probably too much trouble */
  93. void
  94. computescale(GLfloat * sx, GLfloat * sy)
  95. {
  96.   enum {
  97.     XORG, YORG, WID, HT
  98.   };
  99.   GLint viewport[4];
  100.   glGetIntegerv(GL_VIEWPORT, viewport);
  101.   *sx = 2 * FRUSTDIM / viewport[WID];
  102.   *sy = 2 * FRUSTDIM / viewport[WID];
  103. }
  104. enum {
  105.   NONE, AA
  106. };
  107. int rendermode = NONE;
  108. void
  109. menu(int selection)
  110. {
  111.   rendermode = selection;
  112.   glutPostRedisplay();
  113. }
  114. /* Called when window needs to be redrawn */
  115. void 
  116. redraw(void)
  117. {
  118.   int i, j;
  119.   int min, max;
  120.   int count;
  121.   GLfloat invx, invy;
  122.   GLfloat scale, dx, dy;
  123.   switch (rendermode) {
  124.   case NONE:
  125.     glMatrixMode(GL_PROJECTION);
  126.     glLoadIdentity();
  127.     glFrustum(-FRUSTDIM, FRUSTDIM, -FRUSTDIM, FRUSTDIM, 320., 640.);
  128.     glMatrixMode(GL_MODELVIEW);
  129.     render();
  130.     break;
  131.   case AA:
  132.     min = -2;
  133.     max = -min + 1;
  134.     count = -2 * min + 1;
  135.     count *= count;
  136.     /* uniform scaling, less than one pixel wide */
  137.     scale = -.9f / min;
  138.     computescale(&invx, &invy);
  139.     glClear(GL_ACCUM_BUFFER_BIT);
  140.     for (j = min; j < max; j++) {
  141.       for (i = min; i < max; i++) {
  142.         dx = invx * scale * i;
  143.         dy = invy * scale * j;
  144.         glMatrixMode(GL_PROJECTION);
  145.         glLoadIdentity();
  146.         glFrustum(-FRUSTDIM + dx,
  147.           FRUSTDIM + dy,
  148.           -FRUSTDIM + dx,
  149.           FRUSTDIM + dy,
  150.           320., 640.);
  151.         glMatrixMode(GL_MODELVIEW);
  152.         render();
  153.         glAccum(GL_ACCUM, 1.f / count);
  154.       }
  155.     }
  156.     glAccum(GL_RETURN, 1.f);
  157.     break;
  158.   }
  159.   glutSwapBuffers();
  160. }
  161. /* ARGSUSED1 */
  162. void 
  163. key(unsigned char key, int x, int y)
  164. {
  165.   if (key == '33')
  166.     exit(0);
  167. }
  168. const int TEXDIM = 256;
  169. /* Parse arguments, and set up interface between OpenGL and window system */
  170. int
  171. main(int argc, char *argv[])
  172. {
  173.   GLfloat *tex;
  174.   static GLfloat lightpos[] =
  175.   {50.f, 50.f, -320.f, 1.f};
  176.   static GLfloat sphere_mat[] =
  177.   {1.f, .5f, 0.f, 1.f};
  178.   static GLfloat cone_mat[] =
  179.   {0.f, .5f, 1.f, 1.f};
  180.   GLUquadricObj *sphere, *cone, *base;
  181.   glutInit(&argc, argv);
  182.   glutInitWindowSize(512, 512);
  183.   glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_ACCUM | GLUT_DOUBLE);
  184.   (void) glutCreateWindow("scene antialiasing");
  185.   glutDisplayFunc(redraw);
  186.   glutKeyboardFunc(key);
  187.   glutCreateMenu(menu);
  188.   glutAddMenuEntry("Aliased View", NONE);
  189.   glutAddMenuEntry("AntiAliased", AA);
  190.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  191.   /* draw a perspective scene */
  192.   glMatrixMode(GL_PROJECTION);
  193.   glFrustum(-FRUSTDIM, FRUSTDIM, -FRUSTDIM, FRUSTDIM, 320., 640.);
  194.   glMatrixMode(GL_MODELVIEW);
  195.   /* turn on features */
  196.   glEnable(GL_DEPTH_TEST);
  197.   glEnable(GL_LIGHTING);
  198.   glEnable(GL_LIGHT0);
  199.   /* place light 0 in the right place */
  200.   glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  201.   /* remove back faces to speed things up */
  202.   glCullFace(GL_BACK);
  203.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  204.   glNewList(SPHERE, GL_COMPILE);
  205.   /* make display lists for sphere and cone; for efficiency */
  206.   sphere = gluNewQuadric();
  207.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  208.   gluSphere(sphere, 20.f, 20, 20);
  209.   gluDeleteQuadric(sphere);
  210.   glEndList();
  211.   glNewList(CONE, GL_COMPILE);
  212.   cone = gluNewQuadric();
  213.   base = gluNewQuadric();
  214.   glRotatef(-90.f, 1.f, 0.f, 0.f);
  215.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  216.   gluDisk(base, 0., 20., 20, 1);
  217.   gluCylinder(cone, 20., 0., 60., 20, 20);
  218.   gluDeleteQuadric(cone);
  219.   gluDeleteQuadric(base);
  220.   glEndList();
  221.   /* load pattern for current 2d texture */
  222.   tex = make_texture(TEXDIM, TEXDIM);
  223.   glTexImage2D(GL_TEXTURE_2D, 0, 1, TEXDIM, TEXDIM, 0, GL_RED, GL_FLOAT, tex);
  224.   free(tex);
  225.   glReadBuffer(GL_BACK);  /* input to accum buffer */
  226.   glutMainLoop();
  227.   return 0;             /* ANSI C requires main to return int. */
  228. }