/* * CPSC 465 * Principles of Computer Graphics * Section 1 * Spring 2006 * * Texture Mapping Demonstration * */ #include #include #include unsigned char texture[16][16][3]; void display(void) { float lightpos[] = { 2.0, 2.0, 2.0, 1.0 }; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glLightfv(GL_LIGHT0, GL_POSITION, lightpos); glRotated(45.0, 1.0, 1.0, 0.0); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glNormal3d(0.0, 0.0, 1.0); glTexCoord2d(1.0, 1.0); glVertex3d(0.5, -0.5, 0.5); glTexCoord2d(1.0, 0.0); glVertex3d(0.5, 0.5, 0.5); glTexCoord2d(0.0, 0.0); glVertex3d(-0.5, 0.5, 0.5); glTexCoord2d(0.0, 1.0); glVertex3d(-0.5, -0.5, 0.5); glEnd(); glBegin(GL_QUADS); glNormal3d(0.0, 1.0, 0.0); glTexCoord2d(0.0, 1.0); glVertex3d(-0.5, 0.5, -0.5); glTexCoord2d(0.0, 0.0); glVertex3d(-0.5, 0.5, 0.5); glTexCoord2d(1.0, 0.0); glVertex3d(0.5, 0.5, 0.5); glTexCoord2d(1.0, 1.0); glVertex3d(0.5, 0.5, -0.5); glEnd(); glBegin(GL_QUADS); glNormal3d(-1.0, 0.0, 0.0); glTexCoord2d(0.0, 0.0); glVertex3d(-0.5, -0.5, -0.5); glTexCoord2d(0.0, 1.0); glVertex3d(-0.5, -0.5, 0.5); glTexCoord2d(1.0, 1.0); glVertex3d(-0.5, 0.5, 0.5); glTexCoord2d(1.0, 0.0); glVertex3d(-0.5, 0.5, -0.5); glEnd(); glutSwapBuffers(); } void reshape(int w, int h) { double scaledWidth, scaledHeight; glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* a square window would be exactly 2.0 by 2.0) */ if (w > h) { scaledWidth = 2.0 * w / h; scaledHeight = 2.0; } else { scaledWidth = 2.0; scaledHeight = 2.0 * h / w; } glFrustum(-scaledWidth / 2.0, scaledWidth / 2.0, -scaledHeight / 2.0, scaledHeight / 2.0, 1.0, 6.0); glViewport(0, 0, w, h); } void mouse(int button, int state, int x, int y) { static int mapping = 0; if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN) return; mapping = !mapping; if (mapping) { glEnable(GL_TEXTURE_2D); } else { glDisable(GL_TEXTURE_2D); } glutPostRedisplay(); } int main(int argc, char *argv[]) { int i, j; glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutCreateWindow("Texture Mapping Demonstration"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glClearColor(0.0, 0.0, 0.0, 1.0); for (i = 0; i < 16; i++) { for (j = 0; j < 16; j++) { texture[i][j][0] = ((i + j) % 2 == 0) ? 255 : 0; texture[i][j][1] = ((i + j) % 2 == 0) ? 255 : 0; texture[i][j][2] = ((i + j) % 2 == 0) ? 0 : 255; } } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGB, GL_UNSIGNED_BYTE, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glutMainLoop(); return 0; }