opengl: 编程指南例子解析 opengl_wrap

来源:互联网 发布:韩国悬疑电视剧知乎 编辑:程序博客网 时间:2024/05/22 15:29
#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;}


0 0
原创粉丝点击