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

GIS编程

开发平台:

Visual C++

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