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

GIS编程

开发平台:

Visual C++

  1. /* texobj.c */
  2. /*
  3.  * Example of using the 1.1 texture object functions.
  4.  * Also, this demo utilizes Mesa's fast texture map path.
  5.  *
  6.  * Brian Paul   June 1996
  7.  */
  8. /* Conversion to GLUT by Mark J. Kilgard */
  9. #include <math.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <stdio.h>
  13. #include <GL/glut.h>
  14. static GLuint TexObj[2];
  15. static GLfloat Angle = 0.0f;
  16. static GLboolean HaveTexObj = GL_FALSE;
  17. #if defined(GL_VERSION_1_1)
  18. #define TEXTURE_OBJECT 1
  19. #elif defined(GL_EXT_texture_object)
  20. #define TEXTURE_OBJECT 1
  21. #define glBindTexture(A,B)     glBindTextureEXT(A,B)
  22. #define glGenTextures(A,B)     glGenTexturesEXT(A,B)
  23. #define glDeleteTextures(A,B)  glDeleteTexturesEXT(A,B)
  24. #endif
  25. #ifdef TEXTURE_OBJECT
  26. static int
  27. supportsOneDotOne(void)
  28. {
  29.   const char *version;
  30.   int major, minor;
  31.   version = (char *) glGetString(GL_VERSION);
  32.   if (sscanf(version, "%d.%d", &major, &minor) == 2)
  33.     return major >= 1 && minor >= 1;
  34.   return 0;            /* OpenGL version string malformed! */
  35. }
  36. #endif
  37. static void 
  38. draw(void)
  39. {
  40.   /* glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); */
  41.   glClear(GL_COLOR_BUFFER_BIT);
  42.   glColor3f(1.0, 1.0, 1.0);
  43.   /* draw first polygon */
  44.   glPushMatrix();
  45.   glTranslatef(-1.0, 0.0, 0.0);
  46.   glRotatef(Angle, 0.0, 0.0, 1.0);
  47.   if (HaveTexObj) {
  48. #ifdef TEXTURE_OBJECT
  49.     glBindTexture(GL_TEXTURE_2D, TexObj[0]);
  50. #endif
  51.   } else {
  52.     glCallList(TexObj[0]);
  53.   }
  54.   glBegin(GL_POLYGON);
  55.   glTexCoord2f(0.0, 0.0);
  56.   glVertex2f(-1.0, -1.0);
  57.   glTexCoord2f(1.0, 0.0);
  58.   glVertex2f(1.0, -1.0);
  59.   glTexCoord2f(1.0, 1.0);
  60.   glVertex2f(1.0, 1.0);
  61.   glTexCoord2f(0.0, 1.0);
  62.   glVertex2f(-1.0, 1.0);
  63.   glEnd();
  64.   glPopMatrix();
  65.   /* draw second polygon */
  66.   glPushMatrix();
  67.   glTranslatef(1.0, 0.0, 0.0);
  68.   glRotatef(Angle - 90.0, 0.0, 1.0, 0.0);
  69.   if (HaveTexObj) {
  70. #ifdef TEXTURE_OBJECT
  71.     glBindTexture(GL_TEXTURE_2D, TexObj[1]);
  72. #endif
  73.   } else {
  74.     glCallList(TexObj[0]);
  75.   }
  76.   glBegin(GL_POLYGON);
  77.   glTexCoord2f(0.0, 0.0);
  78.   glVertex2f(-1.0, -1.0);
  79.   glTexCoord2f(1.0, 0.0);
  80.   glVertex2f(1.0, -1.0);
  81.   glTexCoord2f(1.0, 1.0);
  82.   glVertex2f(1.0, 1.0);
  83.   glTexCoord2f(0.0, 1.0);
  84.   glVertex2f(-1.0, 1.0);
  85.   glEnd();
  86.   glPopMatrix();
  87.   glutSwapBuffers();
  88. }
  89. static void 
  90. idle(void)
  91. {
  92.   Angle += 2.0;
  93.   glutPostRedisplay();
  94. }
  95. /* exit upon ESC */
  96. /* ARGSUSED1 */
  97. static void 
  98. key(unsigned char k, int x, int y)
  99. {
  100.   switch (k) {
  101.   case 27:  /* Escape */
  102. #ifdef TEXTURE_OBJECT
  103.     glDeleteTextures(2, TexObj);
  104. #endif
  105.     exit(0);
  106.   }
  107. }
  108. /* new window size or exposure */
  109. static void 
  110. reshape(int width, int height)
  111. {
  112.   glViewport(0, 0, (GLint) width, (GLint) height);
  113.   glMatrixMode(GL_PROJECTION);
  114.   glLoadIdentity();
  115.   /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 ); */
  116.   glFrustum(-2.0, 2.0, -2.0, 2.0, 6.0, 20.0);
  117.   glMatrixMode(GL_MODELVIEW);
  118.   glLoadIdentity();
  119.   glTranslatef(0.0, 0.0, -8.0);
  120. }
  121. static void 
  122. init(void)
  123. {
  124.   static int width = 8, height = 8;
  125.   static GLubyte tex1[] =
  126.   {
  127.     0, 0, 0, 0, 0, 0, 0, 0,
  128.     0, 0, 0, 0, 1, 0, 0, 0,
  129.     0, 0, 0, 1, 1, 0, 0, 0,
  130.     0, 0, 0, 0, 1, 0, 0, 0,
  131.     0, 0, 0, 0, 1, 0, 0, 0,
  132.     0, 0, 0, 0, 1, 0, 0, 0,
  133.     0, 0, 0, 1, 1, 1, 0, 0,
  134.     0, 0, 0, 0, 0, 0, 0, 0};
  135.   static GLubyte tex2[] =
  136.   {
  137.     0, 0, 0, 0, 0, 0, 0, 0,
  138.     0, 0, 0, 2, 2, 0, 0, 0,
  139.     0, 0, 2, 0, 0, 2, 0, 0,
  140.     0, 0, 0, 0, 0, 2, 0, 0,
  141.     0, 0, 0, 0, 2, 0, 0, 0,
  142.     0, 0, 0, 2, 0, 0, 0, 0,
  143.     0, 0, 2, 2, 2, 2, 0, 0,
  144.     0, 0, 0, 0, 0, 0, 0, 0};
  145.   GLubyte tex[64][3];
  146.   GLint i, j;
  147.   glDisable(GL_DITHER);
  148.   /* Setup texturing */
  149.   glEnable(GL_TEXTURE_2D);
  150.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  151.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  152.   /* generate texture object IDs */
  153.   if (HaveTexObj) {
  154. #ifdef TEXTURE_OBJECT
  155.     glGenTextures(2, TexObj);
  156. #endif
  157.   } else {
  158.     TexObj[0] = glGenLists(2);
  159.     TexObj[1] = TexObj[0] + 1;
  160.   }
  161.   /* setup first texture object */
  162.   if (HaveTexObj) {
  163. #ifdef TEXTURE_OBJECT
  164.     glBindTexture(GL_TEXTURE_2D, TexObj[0]);
  165. #endif
  166.   } else {
  167.     glNewList(TexObj[0], GL_COMPILE);
  168.   }
  169.   /* red on white */
  170.   for (i = 0; i < height; i++) {
  171.     for (j = 0; j < width; j++) {
  172.       int p = i * width + j;
  173.       if (tex1[(height - i - 1) * width + j]) {
  174.         tex[p][0] = 255;
  175.         tex[p][1] = 0;
  176.         tex[p][2] = 0;
  177.       } else {
  178.         tex[p][0] = 255;
  179.         tex[p][1] = 255;
  180.         tex[p][2] = 255;
  181.       }
  182.     }
  183.   }
  184.   glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
  185.     GL_RGB, GL_UNSIGNED_BYTE, tex);
  186.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  187.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  188.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  189.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  190.   if (!HaveTexObj) {
  191.     glEndList();
  192.   }
  193.   /* end of texture object */
  194.   /* setup second texture object */
  195.   if (HaveTexObj) {
  196. #ifdef TEXTURE_OBJECT
  197.     glBindTexture(GL_TEXTURE_2D, TexObj[1]);
  198. #endif
  199.   } else {
  200.     glNewList(TexObj[1], GL_COMPILE);
  201.   }
  202.   /* green on blue */
  203.   for (i = 0; i < height; i++) {
  204.     for (j = 0; j < width; j++) {
  205.       int p = i * width + j;
  206.       if (tex2[(height - i - 1) * width + j]) {
  207.         tex[p][0] = 0;
  208.         tex[p][1] = 255;
  209.         tex[p][2] = 0;
  210.       } else {
  211.         tex[p][0] = 0;
  212.         tex[p][1] = 0;
  213.         tex[p][2] = 255;
  214.       }
  215.     }
  216.   }
  217.   glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
  218.     GL_RGB, GL_UNSIGNED_BYTE, tex);
  219.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  220.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  221.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  222.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  223.   if (!HaveTexObj) {
  224.     glEndList();
  225.   }
  226.   /* end texture object */
  227. }
  228. void 
  229. visible(int vis)
  230. {
  231.   if (vis == GLUT_VISIBLE)
  232.     glutIdleFunc(idle);
  233.   else
  234.     glutIdleFunc(NULL);
  235. }
  236. main(int argc, char *argv[])
  237. {
  238.   glutInit(&argc, argv);
  239.   glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
  240.   glutCreateWindow("Texture Objects");
  241.   /* Check that renderer has the GL_EXT_texture_object
  242.      extension or supports OpenGL 1.1. */
  243. #ifdef TEXTURE_OBJECT
  244.   if (supportsOneDotOne() || glutExtensionSupported("GL_EXT_texture_object")) {
  245.     HaveTexObj = GL_TRUE;
  246.   }
  247. #endif
  248.   if (!HaveTexObj) {
  249.     printf("nThis program doesn't really work the way it is supposedn");
  250.     printf("to if you lack OpenGL 1.1 or the EXT_texture_object extension.n");
  251.     printf("Each textured object should have a different numbered image.nn");
  252.   }
  253.   init();
  254.   glutReshapeFunc(reshape);
  255.   glutKeyboardFunc(key);
  256.   glutVisibilityFunc(visible);
  257.   glutDisplayFunc(draw);
  258.   glutMainLoop();
  259.   return 0;             /* ANSI C requires main to return int. */
  260. }