zoukankan      html  css  js  c++  java
  • opengl学习笔记(三):经过纹理贴图的棋盘

    opengl纹理贴图的步骤:

    1:创建纹理对象,并为它指定一个纹理

    2:确定纹理如何应用到每个像素上

    3:启用纹理贴图功能

    4:绘制场景,提供纹理坐标和几何图形坐标

    注意:纹理坐标必须在RGBA模式下才能使用。

    使用一个简单的程序演示纹理贴图,纹理(由交替的黑白方块组成)是有程序产生的。

    /*Create checkerboard texture */
    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    
    
    #define checkImageWidth 64
    #define checkImageHeight 64
    static GLubyte checkImage [checkImageHeight][checkImageWidth][4];
    
    static GLuint texName;
    
    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();
        glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    
        glGenTextures(1,&texName);
        glBindTexture(GL_TEXTURE_2D,texName);
    
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
        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,GL_RGBA,checkImageWidth,checkImageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,checkImage);
    }
    
    void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glEnable(GL_TEXTURE_2D);
        glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
        glBindTexture(GL_TEXTURE_2D,texName);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0,0.0);glVertex3f(-2.0,-1.0,0.0);
        glTexCoord2f(0.0,1.0);glVertex3f(-2.0,1.0,0.0);
        glTexCoord2f(1.0,1.0);glVertex3f(0.0,1.0,0.0);
        glTexCoord2f(1.0,0.0);glVertex3f(0.0,-1.0,0.0);
    
        glTexCoord2f(0.0,0.0);glVertex3f(0.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 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();
        glTranslatef(0.0,0.0,-3.6);
    }
    
    int main( int argc, char** argv )
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(500, 500);    
        glutCreateWindow(argv[0]);
        init();
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
    
        glutMainLoop();
        return 0;
    
    
    }

    程序运行结果

    这个程序把这个纹理应用到两个正方形上,然后在透视投影模式下对它们进行渲染。其中一个正方形正面朝向观察者,另一个正方形与观察者呈45度倾斜,如图所示。

  • 相关阅读:
    SDN 实验室学生们
    面向对象程序设计
    软件工程实践
    走出舒适圈的信念和勇气——“Learning by doing!” 我的软工2020春季教学总结
    第二次作业(2)
    结对编程第一战——“停课不停学”数据可视化的数据采集
    团队作业第四次—项目系统设计与数据库设计
    团队作业第一次—团队展示
    软件工程实践2019第五次作业——结对编程的编程实现
    软件工程实践2019——idea表述及组队
  • 原文地址:https://www.cnblogs.com/feifanrensheng/p/9198984.html
Copyright © 2011-2022 走看看