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度倾斜,如图所示。

posted @ 2018-06-19 15:59  feifanren  阅读(1010)  评论(0编辑  收藏  举报