#include <iostream> using namespace std; #include <GL/glut.h> #include <stdlib.h> #include <stdio.h> #define checkImageWidth 64 //图片宽度 #define checkImageHeight 64 //图片高度 static GLubyte checkImage[checkImageWidth][checkImageHeight][4];//定义图片,RBGA //生成黑白相间的图片 void makeCheckImage(void) { int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i&0x8)==0)^((j&0x8))==0))*255; checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLubyte) c; checkImage[i][j][3] = (GLubyte) 255; } } } void init(void) { //清空用黑色 glClearColor(0.0, 0.0, 0.0, 0.0); //平滑着色 glShadeModel(GL_FLAT); //启用深度缓存 glEnable(GL_DEPTH_TEST); makeCheckImage(); //设置纹理图片封包解包的对其方式,1字节对齐, 即每行存储的字节数必须是1的整数倍 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //s,t方向超过1纹理重复 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //当所显示的纹理比加载进来的纹理大或小时,采用GL_NEAREST的方法来处理 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //载入二维纹理图像 glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage); } void reshape(int w, int h) { //设置视口大小 glViewport(0, 0, (GLsizei) w, (GLsizei) h); //载入投影矩阵 glMatrixMode(GL_PROJECTION); //当前矩阵单位化 glLoadIdentity(); //设置透视投影 gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0); //载入模型矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //摄像机在原点,把模型向z轴平移 3.6,不然看不到或看不全。 glTranslatef(0.0, 0.0, -3.6); } void display(void) { //清除深度缓存,颜色缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //启用2d纹理 glEnable(GL_TEXTURE_2D); //设置纹理和材料颜色混合 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //画两个面 glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(0.0, 5.0); glVertex3f(-2.0, 1.0, 0.0); glTexCoord2f(5.0, 5.0); glVertex3f(0.0, 1.0, 0.0); glTexCoord2f(5.0, 0.0); glVertex3f(0.0, -1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421); glEnd(); glFlush(); glDisable(GL_TEXTURE_2D); } void keyboard (unsigned char key, int x, int y) { //设置纹理滤波 switch (key) { case 's': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glutPostRedisplay(); break; case 'S': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glutPostRedisplay(); break; case 't': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glutPostRedisplay(); break; case 'T': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glutPostRedisplay(); break; case 'a': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glutPostRedisplay(); break; case 'A': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glutPostRedisplay(); break; case 'e': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glutPostRedisplay(); break; case 'E': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }