1/** 2 * Draw a series of quads, each with a different texture. 3 */ 4 5#include <stdio.h> 6#include <string.h> 7#include <stdlib.h> 8#include <GL/glew.h> 9#include "glut_wrap.h" 10 11#define NUM_TEX 10 12 13static GLint Win = 0; 14static GLuint Tex[NUM_TEX]; 15 16 17static void Init(void) 18{ 19 int i; 20 21 fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 22 fflush(stderr); 23 24 glGenTextures(NUM_TEX, Tex); 25 26 for (i = 0; i < NUM_TEX; i++) { 27 glBindTexture(GL_TEXTURE_2D, Tex[i]); 28 29 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 30 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 31 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 32 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 33 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 34 } 35} 36 37 38static void Reshape(int width, int height) 39{ 40 float ar = (float) width / height; 41 glViewport(0, 0, width, height); 42 glMatrixMode(GL_PROJECTION); 43 glLoadIdentity(); 44 glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0); 45 glMatrixMode(GL_MODELVIEW); 46} 47 48 49static void Key(unsigned char key, int x, int y) 50{ 51 if (key == 27) { 52 glDeleteTextures(NUM_TEX, Tex); 53 glutDestroyWindow(Win); 54 exit(1); 55 } 56 glutPostRedisplay(); 57} 58 59 60static void Draw(void) 61{ 62 GLubyte tex[16][16][4]; 63 int t, i, j; 64 65 for (t = 0; t < NUM_TEX; t++) { 66 67 for (i = 0; i < 16; i++) { 68 for (j = 0; j < 16; j++) { 69 if (i < t) { 70 /* red row */ 71 tex[i][j][0] = 255; 72 tex[i][j][1] = 0; 73 tex[i][j][2] = 0; 74 tex[i][j][3] = 255; 75 } 76 else if ((i + j) & 1) { 77 tex[i][j][0] = 128; 78 tex[i][j][1] = 128; 79 tex[i][j][2] = 128; 80 tex[i][j][3] = 255; 81 } 82 else { 83 tex[i][j][0] = 255; 84 tex[i][j][1] = 255; 85 tex[i][j][2] = 255; 86 tex[i][j][3] = 255; 87 } 88 } 89 } 90 91 glBindTexture(GL_TEXTURE_2D, Tex[t]); 92 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, 93 GL_RGBA, GL_UNSIGNED_BYTE, tex); 94 } 95 96 glEnable(GL_TEXTURE_2D); 97 98 glClear(GL_COLOR_BUFFER_BIT); 99 100 for (i = 0; i < NUM_TEX; i++) { 101 102 glBindTexture(GL_TEXTURE_2D, Tex[i]); 103 104 glPushMatrix(); 105 glTranslatef(-4.0 + i, 0, 0); 106 glScalef(0.5, 0.5, 1.0); 107 108 glBegin(GL_QUADS); 109 glTexCoord2f(1,0); 110 glVertex3f( 0.9, -0.9, 0.0); 111 glTexCoord2f(1,1); 112 glVertex3f( 0.9, 0.9, 0.0); 113 glTexCoord2f(0,1); 114 glVertex3f(-0.9, 0.9, 0.0); 115 glTexCoord2f(0,0); 116 glVertex3f(-0.9, -0.9, 0.0); 117 glEnd(); 118 119 glPopMatrix(); 120 } 121 122 123 glutSwapBuffers(); 124} 125 126 127int main(int argc, char **argv) 128{ 129 glutInit(&argc, argv); 130 glutInitWindowSize(900, 200); 131 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 132 Win = glutCreateWindow(*argv); 133 if (!Win) { 134 exit(1); 135 } 136 glewInit(); 137 Init(); 138 glutReshapeFunc(Reshape); 139 glutKeyboardFunc(Key); 140 glutDisplayFunc(Draw); 141 glutMainLoop(); 142 return 0; 143} 144