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

GIS编程

开发平台:

Visual C++

  1. /* genmipmap.c - by David Blythe, SGI */
  2. /* Example of how to generate texture mipmap levels with the
  3.    accumulation buffer. */
  4. /* Usage example: genmipmap [file.rgb] */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include <GL/glut.h>
  9. #include "texture.h"
  10. static int w = 512, h = 512;
  11. static int pause;
  12. void 
  13. reshape(int w, int h)
  14. {
  15.   glViewport(0, 0, w, h);
  16.   glMatrixMode(GL_PROJECTION);
  17.   glLoadIdentity();
  18.   glOrtho(0, w, 0, h, -1, 1);
  19.   glMatrixMode(GL_MODELVIEW);
  20.   glLoadIdentity();
  21. }
  22. void 
  23. init_textures(char *filename)
  24. {
  25.   unsigned *buf;
  26.   int width, height, components;
  27.   if (filename) {
  28.     buf = read_texture(filename, &width, &height, &components);
  29.     if (buf == NULL) {
  30.       fprintf(stderr, "Error: Can't load image file "%s".n",
  31.         filename);
  32.       exit(1);
  33.     } else {
  34.       printf("%d x %d texture loadedn", width, height);
  35.     }
  36.   } else {
  37.     int i, j;
  38.     GLubyte *p;
  39.     components = 4;
  40.     width = height = 512;
  41.     buf = (unsigned *) malloc(width * height * sizeof(unsigned));
  42.     p = (GLubyte *) buf;
  43.     for (j = 0; j < height; j++) {
  44.       for (i = 0; i < width; i++) {
  45.         if (i & 1)
  46.           p[4 * (i + j * width) + 0] = 0xff;
  47.         else
  48.           p[4 * (i + j * width) + 1] = 0xff;
  49.         if (j & 1)
  50.           p[4 * (i + j * width) + 2] = 0xff;
  51.       }
  52.     }
  53.   }
  54.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  55.   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  56.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  57.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  58.   glTexImage2D(GL_TEXTURE_2D, 0, components, width,
  59.     height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  60.     buf);
  61.   free(buf);
  62. }
  63. void 
  64. init(char *filename)
  65. {
  66.   glEnable(GL_TEXTURE_2D);
  67.   init_textures(filename);
  68. }
  69. void 
  70. draw_rect(int w, int h)
  71. {
  72.   glBegin(GL_QUADS);
  73.   glTexCoord2f(0, 0);
  74.   glVertex2f(0, 0);
  75.   glTexCoord2f(1, 0);
  76.   glVertex2f(w, 0);
  77.   glTexCoord2f(1, 1);
  78.   glVertex2f(w, h);
  79.   glTexCoord2f(0, 1);
  80.   glVertex2f(0, h);
  81.   glEnd();
  82. }
  83. void 
  84. stop(void)
  85. {
  86.   if (pause) {
  87.     printf("? ");
  88.     fflush(stdout);
  89.     getchar();
  90.   }
  91. }
  92. void 
  93. acfilter(int width, int height)
  94. {
  95.   glClear(GL_COLOR_BUFFER_BIT | GL_ACCUM_BUFFER_BIT);
  96.   glMatrixMode(GL_TEXTURE);
  97.   if (pause) {
  98.     draw_rect(width, height);
  99.     stop();
  100.     glClear(GL_COLOR_BUFFER_BIT);
  101.   }
  102.   draw_rect(width / 2, height / 2);
  103.   stop();
  104.   glAccum(GL_ACCUM, 0.25);
  105.   glTranslatef(1.0 / width, 0, 0);
  106.   draw_rect(width / 2, height / 2);
  107.   stop();
  108.   glAccum(GL_ACCUM, 0.25);
  109.   glLoadIdentity();
  110.   glTranslatef(0, 1.0 / height, 0);
  111.   draw_rect(width / 2, height / 2);
  112.   stop();
  113.   glAccum(GL_ACCUM, 0.25);
  114.   glLoadIdentity();
  115.   glTranslatef(1.0 / width, 1.0 / height, 0);
  116.   draw_rect(width / 2, height / 2);
  117.   stop();
  118.   glAccum(GL_ACCUM, 0.25);
  119.   glAccum(GL_RETURN, 1.0);
  120.   glMatrixMode(GL_MODELVIEW);
  121. }
  122. void 
  123. display(void)
  124. {
  125.   glClear(GL_COLOR_BUFFER_BIT);
  126.   draw_rect(w, h);
  127.   acfilter(w, h);
  128.   glFlush();
  129. }
  130. void 
  131. help(void)
  132. {
  133.   printf("'h'   - helpn");
  134.   printf("'s'   - toggle single step moden");
  135. }
  136. /* ARGSUSED1 */
  137. void
  138. key(unsigned char key, int x, int y)
  139. {
  140.   switch (key) {
  141.   case 'h':
  142.     help();
  143.     break;
  144.   case 's':
  145.     pause ^= 1;
  146.     break;
  147.   case '33':
  148.     exit(0);
  149.     break;
  150.   default:
  151.     glutPostRedisplay();
  152.   }
  153. }
  154. int 
  155. main(int argc, char *argv[])
  156. {
  157.   glutInit(&argc, argv);
  158.   glutInitWindowSize(w, h);
  159.   glutInitDisplayMode(GLUT_RGBA | GLUT_ACCUM);
  160.   (void) glutCreateWindow("genmipmap");
  161.   if (argc > 1)
  162.     init(argv[1]);
  163.   else
  164.     init(0);
  165.   glutDisplayFunc(display);
  166.   glutKeyboardFunc(key);
  167.   glutReshapeFunc(reshape);
  168.   glutMainLoop();
  169.   return 0;             /* ANSI C requires main to return int. */
  170. }