如何在OpenGL 1.1中创建纹理四边形?

时间:2017-01-09 19:24:47

标签: c opengl

我正在玩OpenGL,尝试编写一个概念验证,用于绘制带有2x2 GL_RGB GL_FLOAT位图的2x2四边形纹理。

从我的理解;要做到这一点,我必须

  1. 通过调用glEnable(GL_TEXTURE_2D)启用2d纹理。
  2. 通过调用glTexture2D
  3. 为像素数据填充纹理
  4. 设置glOrtho以匹配窗口坐标系(0,宽度,0,高度,-1,1)。

  5. 调用glGenTextures获取唯一标识纹理的标识符。

  6. 通过调用glBindTexture选择我的纹理。
  7. 通过调用glTexParameteri设置纹理参数。
  8. 使用glBeginglEnd)/ glDrawArrays指定纹理坐标和椎体。
  9. 我对glBegin的尝试看起来像是

    #include <gl/glut.h>
    #include <stdio.h>
    
    const char *appTitle = "OpenGL Texture Experiment";
    
    static GLfloat identity4f[] = {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };
    
    static GLfloat pixels[] = {
        1, 0, 0,
        0, 1, 0,
        0, 0, 1,
        1, 1, 1
    };
    
    GLuint texid[] = {-1};
    
    static inline void display()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0, 0, 0, 0);  
    
        glColor3f(0, 1, 0);
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glBegin(GL_TRIANGLES);
    
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
    
        glTexCoord2f(0, 1);
        glVertex2f(0, 2);
    
        glTexCoord2f(1, 0);
        glVertex2f(2, 2);
    
        glTexCoord2f(1, 0);
        glVertex2f(2, 2);
    
        glTexCoord2f(1, 1);    
        glVertex2f(2, 0);
    
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
    
        glEnd();
    
        glutSwapBuffers();        
    }
    
    static inline void init()
    {
        glEnable(GL_TEXTURE_2D);
    
        glGenTextures(1, texid);
    
        /* anonymous scope: set texture */
        {
            GLenum target = GL_TEXTURE_2D;
            GLint level = 0;
            GLint internalformat = GL_RGB;
            GLsizei width = 2;
            GLsizei height = 2;
            GLint border = 0;
            GLenum format = GL_RGB;
            GLenum type = GL_FLOAT;
            const GLvoid *data = pixels;
    
            glTexImage2D (
                target,
                level,
                internalformat,
                width,
                height,
                border,
                format,
                type,
                data
            );
        }
        printf("got texture #%d.\n", texid[0]);
    
        typedef struct {
            double x_left;
            double x_right;
            double y_bottom;
            double y_top;
            double z_near;
            double z_far;
        } glOrtho_arguments;
    
    
        const struct {
            GLint width;
            GLint height;
        } glutInfo = {
            glutGet(GLUT_WINDOW_WIDTH),
            glutGet(GLUT_WINDOW_HEIGHT)
        };
    
        glOrtho_arguments args;
        args.x_left = 0;
        args.x_right = glutInfo.width;
        args.y_bottom = glutInfo.height;
        args.y_top = 0;
        args.z_near = -1;
        args.z_far = 1;
    
        glClearColor(0, 0, 0, 0);
        glMatrixMode(GL_PROJECTION);
        glMultMatrixf(identity4f);        
        glOrtho (
            args.x_left, 
            args.x_right, 
            args.y_bottom, 
            args.y_top, 
            args.z_near, 
            args.z_far
        );
    }
    
    int main(int argc, char **argv)
    {    
        glMatrixMode(GL_MODELVIEW);
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow(appTitle);
        init();    
        glutDisplayFunc(display);
        glutMainLoop();
    
        return 0;
    }
    

    我对glDrawArrays的尝试如下:

    #include <gl/glut.h>
    #include <stdio.h>
    
    const char *appTitle = "OpenGL Texture Experiment";
    
    static GLfloat identity4f[] = {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };
    
    static GLfloat pixels[] = {
        1, 0, 0,
        0, 1, 0,
        0, 0, 1,
        1, 1, 1
    };
    
    static GLfloat vertices[] = {
        0, 0, 0,
        0, 2, 0,
        2, 2, 0,
        2, 2, 0,
        2, 0, 0,
        0, 0, 0
    };
    
    static GLfloat colors[] = {
        0, 1, 0,
        0, 1, 0,
        0, 1, 0,
        0, 1, 0,
        0, 1, 0,
        0, 1, 0
    };
    
    static GLfloat coords[] = {
        0, 0, 0,
        0, 1, 0,
        1, 0, 0,
        1, 1, 0
    };
    
    GLuint texid[] = {-1};
    
    static inline void display()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0, 0, 0, 0);  
    
        glColor3f(0, 1, 0);
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
        glTexCoordPointer(3, GL_FLOAT, 0, coords);
        glVertexPointer(3, GL_FLOAT, 0, vertices);
        glColorPointer(3, GL_FLOAT, 0, colors);
        glDrawArrays(GL_TRIANGLES, 0, 6);
    
        glutSwapBuffers();        
    }
    
    static inline void init()
    {
        glEnable(GL_TEXTURE_2D);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glGenTextures(1, texid);
    
        /* set texture */
        {
            GLenum target = GL_TEXTURE_2D;
            GLint level = 0;
            GLint internalformat = GL_RGB;
            GLsizei width = 2;
            GLsizei height = 2;
            GLint border = 0;
            GLenum format = GL_RGB;
            GLenum type = GL_FLOAT;
            const GLvoid *data = pixels;
    
            glTexImage2D (
                target,
                level,
                internalformat,
                width,
                height,
                border,
                format,
                type,
                data
            );
        }
        printf("got texture #%d.\n", texid[0]);
    
        typedef struct {
            double x_left;
            double x_right;
            double y_bottom;
            double y_top;
            double z_near;
            double z_far;
        } glOrtho_arguments;
    
        const struct {
            GLint width;
            GLint height;
        } glutInfo = {
            glutGet(GLUT_WINDOW_WIDTH),
            glutGet(GLUT_WINDOW_HEIGHT)
        };
    
        glOrtho_arguments args;
        args.x_left = 0;
        args.x_right = glutInfo.width;
        args.y_bottom = glutInfo.height;
        args.y_top = 0;
        args.z_near = -1;
        args.z_far = 1;
    
        glClearColor(0, 0, 0, 0);
        glMatrixMode(GL_PROJECTION);
        glMultMatrixf(identity4f);        
        glOrtho (
            args.x_left, 
            args.x_right, 
            args.y_bottom, 
            args.y_top, 
            args.z_near, 
            args.z_far
        );
    }
    
    int main(int argc, char **argv)
    {    
        glMatrixMode(GL_MODELVIEW);
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow(appTitle);
        init();    
        glutDisplayFunc(display);
        glutMainLoop();
    
        return 0;
    }
    

    这是尝试修改使用顶点数组的工作答案,看起来很有趣。

    #include <GL/glut.h>
    #include <stdio.h>
    
    static GLfloat pixels[] =
    {
        1, 0, 0,
        0, 1, 0,
        0, 0, 1,
        1, 1, 1
    };
    
    GLuint texid[] = { -1 };
    
    static inline void init()
    {
        glEnable( GL_TEXTURE_2D );
        glGenTextures( 1, texid );
        glBindTexture( GL_TEXTURE_2D, texid[ 0 ] );
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    }
    
    static inline void display()
    {
        glClearColor( 0, 0, 0, 0 );
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        glOrtho(0, 5, 5, 0, -1, 1 );
    
        glColor3f( 1, 1, 1 );
    
        glBindTexture( GL_TEXTURE_2D, texid[ 0 ] );
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
        GLfloat c[] = {
            0, 0, 0,
            1, 0, 0,
            1, 1, 0,
            0, 1, 0
        };
    
        glVertexPointer(3, GL_FLOAT, 0, c);
        glColorPointer(3, GL_FLOAT, 0, pixels);
        glTexCoordPointer(3, GL_FLOAT, 0, c);
        glDrawArrays(GL_QUADS, 0, 4);
    
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    
        glutSwapBuffers();
    }
    
    int main( int argc, char **argv )
    {
        glMatrixMode( GL_MODELVIEW );
        glutInit( &argc, argv );
        glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
        glutInitWindowSize( 300, 300 );
        glutCreateWindow( "OpenGL Texture Experiment" );
        init();
        glutDisplayFunc( display );
        glutMainLoop();
        return 0;
    }
    
    The result only shows a green untextured 2x2 square; I want it to be a 2x2 square with
    

    前2个像素为红色,绿色,底部2为蓝色和白色。

    我做错了什么?

    编辑:

    这是纹理三角形的概念证明;我认为它会以某种奇怪的方式扭曲,但它的行为却像这样:

    enter image description here

    #include <gl/glut.h>
    
    const char *appTitle = "OpenGL Basic Template";
    
    static GLuint texid[] = {-1};
    
    static GLfloat pixels[] = {
        1, 0, 0,
        0, 1, 0,
        0, 0, 1,
        1, 1, 1
    };
    
    static inline void display()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor((float)0x55/0xff, (float)0x55/0xff, 1, 1);  
    
    /**
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glBegin(GL_QUADS);
        glColor3f(1, 1, 1);
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
        glTexCoord2f(0, 1);
        glVertex2f(0, 1);
        glTexCoord2f(1, 1);
        glVertex2f(1, 1);
        glTexCoord2f(1, 0);
        glVertex2f(1, 0);
        glEnd();
    
    */
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glBegin(GL_TRIANGLES);
        glColor3f(1, 1, 1);
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
        glTexCoord2f(0, 1);
        glVertex2f(0, 1);
        glTexCoord2f(1, 1);
        glVertex2f(1, 1);
        glEnd();
    
        glPushMatrix();
        glTranslatef(-1, -1, 0);
        glBegin(GL_TRIANGLES);
        glColor3f(1, 1, 1);
        glTexCoord2f(0, 0);
        glVertex2f(0, 0);
        glTexCoord2f(1, 1);
        glVertex2f(1, 1);
        glTexCoord2f(1, 0);
        glVertex2f(1, 0);
        glEnd();
        glPopMatrix();
    
    
    
        glColor3f(0, 0, 0);
        glLineWidth(1.0);
        glBegin(GL_LINES);
        glVertex2f(0, 0);
        glVertex2f(0, 1);
        glVertex2f(0, 1);
        glVertex2f(1, 1);
        glVertex2f(1, 1);
        glVertex2f(0, 0);
        glEnd();
    
        glPushMatrix();
        glTranslatef(-1, -1, 0);
        glBegin(GL_LINES);
        glVertex2f(0, 0);
        glVertex2f(1, 1);
        glVertex2f(1, 1);
        glVertex2f(1, 0);
        glVertex2f(1, 0);
        glVertex2f(0, 0);
        glEnd();
        glPopMatrix();
    
        glutSwapBuffers();
    }
    
    static inline void init()
    {
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, texid);
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);    
    
        // | there is no overhead for using this
        // | but it makes it much more explicit what the values
        // | mean!
        typedef struct {
            double x_left;
            double x_right;
            double y_bottom;
            double y_top;
            double z_near;
            double z_far;
        } glOrtho_arguments;
    
        glOrtho_arguments args;
        args.x_left = -1;
        args.x_right = 1;
        args.y_bottom = -1;
        args.y_top = 1;
        args.z_near = -1;
        args.z_far = 1;
    
        glClearColor(0, 0, 0, 0);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();        
        glOrtho (
            args.x_left, 
            args.x_right, 
            args.y_bottom, 
            args.y_top, 
            args.z_near, 
            args.z_far
        );
    }
    
    int main(int argc, char **argv)
    {    
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow(appTitle);
        init();    
        glutDisplayFunc(display);
        glutMainLoop();
    
        return 0;
    }
    

    EDIT2:

    好吧,我把它弄好了;这是使用四边形的版本:

    #include <gl/glut.h>
    #include <stdio.h>
    
    const char *appTitle = "OpenGL Texture Experiment";
    
    static GLfloat identity4f[] = {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };
    
    static GLfloat pixels[] = {
        1, 0, 0,
        0, 1, 0,
        0, 0, 1,
        1, 1, 1
    };
    
    static GLfloat vertices[] = {
        0, 0, 
        0, 2, 
        2, 2, 
        2, 0, 
    };
    
    static GLfloat coords[] = {
        0, 0,
        1, 0,
        1, 1,
        0, 1
    };
    
    GLuint texid[] = {-1};
    
    static inline void display()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor((float)81/255, (float)81/255, 1, 1);  
    
        glColor3f(1, 1, 1);
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
        glTexCoordPointer(2, GL_FLOAT, 0, coords);
        glVertexPointer(2, GL_FLOAT, 0, vertices);
        glDrawArrays(GL_QUADS, 0, 4);
    
        glutSwapBuffers();        
    }
    
    static inline void init()
    {
        glEnable(GL_TEXTURE_2D);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glGenTextures(1, texid);
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        /* set texture */
        {
            GLenum target = GL_TEXTURE_2D;
            GLint level = 0;
            GLint internalformat = GL_RGB;
            GLsizei width = 2;
            GLsizei height = 2;
            GLint border = 0;
            GLenum format = GL_RGB;
            GLenum type = GL_FLOAT;
            const GLvoid *data = pixels;
    
            glTexImage2D (
                target,
                level,
                internalformat,
                width,
                height,
                border,
                format,
                type,
                data
            );
        }
        printf("got texture #%d.\n", texid[0]);
    
        typedef struct {
            double x_left;
            double x_right;
            double y_bottom;
            double y_top;
            double z_near;
            double z_far;
        } glOrtho_arguments;
    
        const struct {
            GLint width;
            GLint height;
        } glutInfo = {
            glutGet(GLUT_WINDOW_WIDTH),
            glutGet(GLUT_WINDOW_HEIGHT)
        };
    
        glOrtho_arguments args;
        args.x_left = 0;
        args.x_right = glutInfo.width;
        args.y_bottom = glutInfo.height;
        args.y_top = 0;
        args.z_near = -1;
        args.z_far = 1;
    
        glClearColor(0, 0, 0, 0);
        glMatrixMode(GL_PROJECTION);
        glMultMatrixf(identity4f);        
        glOrtho (
            args.x_left, 
            args.x_right, 
            args.y_bottom, 
            args.y_top, 
            args.z_near, 
            args.z_far
        );
    }
    
    int main(int argc, char **argv)
    {    
        glMatrixMode(GL_MODELVIEW);
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow(appTitle);
        init();    
        glutDisplayFunc(display);
        glutMainLoop();
    
        return 0;
    }
    

    这是一个使用三角形的版本

    #include <gl/glut.h>
    #include <stdio.h>
    
    const char *appTitle = "OpenGL Texture Experiment";
    
    static GLfloat identity4f[] = {
        1, 0, 0, 0,
        0, 1, 0, 0,
        0, 0, 1, 0,
        0, 0, 0, 1
    };
    
    static GLfloat pixels[] = {
        1, 0, 0,
        0, 1, 0,
        0, 0, 1,
        1, 1, 1
    };
    
    static GLfloat vertices[] = {
        0, 0, 
        0, 2, 
        2, 2, 
        2, 2, 
        2, 0, 
        0, 0
    };
    
    static GLfloat coords[] = {
        0, 0,
        1, 0,
        1, 1,
        1, 1,
        0, 1,
        0, 0
    };
    
    GLuint texid[] = {-1};
    
    static inline void display()
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor((float)81/255, (float)81/255, 1, 1);  
    
        glColor3f(1, 1, 1);
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
        glTexCoordPointer(2, GL_FLOAT, 0, coords);
        glVertexPointer(2, GL_FLOAT, 0, vertices);
        glDrawArrays(GL_TRIANGLES, 0, 6);
    
        glutSwapBuffers();        
    }
    
    static inline void init()
    {
        glEnable(GL_TEXTURE_2D);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glGenTextures(1, texid);
    
        glBindTexture(GL_TEXTURE_2D, texid[0]);
        /* set texture */
        {
            GLenum target = GL_TEXTURE_2D;
            GLint level = 0;
            GLint internalformat = GL_RGB;
            GLsizei width = 2;
            GLsizei height = 2;
            GLint border = 0;
            GLenum format = GL_RGB;
            GLenum type = GL_FLOAT;
            const GLvoid *data = pixels;
    
            glTexImage2D (
                target,
                level,
                internalformat,
                width,
                height,
                border,
                format,
                type,
                data
            );
        }
        printf("got texture #%d.\n", texid[0]);
    
        typedef struct {
            double x_left;
            double x_right;
            double y_bottom;
            double y_top;
            double z_near;
            double z_far;
        } glOrtho_arguments;
    
        const struct {
            GLint width;
            GLint height;
        } glutInfo = {
            glutGet(GLUT_WINDOW_WIDTH),
            glutGet(GLUT_WINDOW_HEIGHT)
        };
    
        glOrtho_arguments args;
        args.x_left = 0;
        args.x_right = glutInfo.width;
        args.y_bottom = glutInfo.height;
        args.y_top = 0;
        args.z_near = -1;
        args.z_far = 1;
    
        glClearColor(0, 0, 0, 0);
        glMatrixMode(GL_PROJECTION);
        glMultMatrixf(identity4f);        
        glOrtho (
            args.x_left, 
            args.x_right, 
            args.y_bottom, 
            args.y_top, 
            args.z_near, 
            args.z_far
        );
    }
    
    int main(int argc, char **argv)
    {    
        glMatrixMode(GL_MODELVIEW);
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow(appTitle);
        init();    
        glutDisplayFunc(display);
        glutMainLoop();
    
        return 0;
    }
    

    enter image description here

1 个答案:

答案 0 :(得分:1)

在呈现前将GL_TEXTURE_ENV切换为GL_DECAL或使用glColor3f(1, 1, 1),如果您要坚持使用默认的GL_MODULATE texenv。

在致电glBindTexture()之前,您还需要glTexImage2D(),以便OpenGL知道要填充的纹理对象。

所有在一起:

#include <GL/glut.h>
#include <stdio.h>

static GLfloat pixels[] =
{
    1, 0, 0,
    0, 1, 0,
    0, 0, 1,
    1, 1, 1
};

GLuint texid[] = { -1 };

static inline void init()
{
    glEnable( GL_TEXTURE_2D );
    glGenTextures( 1, texid );
    glBindTexture( GL_TEXTURE_2D, texid[ 0 ] );
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
}

static inline void display()
{
    glClearColor( 0, 0, 0, 0 );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( -2, 2, -2, 2, -1, 1 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3f( 1, 1, 1 );

    glBindTexture( GL_TEXTURE_2D, texid[ 0 ] );
    glBegin( GL_QUADS );
    glTexCoord2f( 0, 0 );
    glVertex2f( 0, 0 );
    glTexCoord2f( 1, 0 );
    glVertex2f( 1, 0 );
    glTexCoord2f( 1, 1 );
    glVertex2f( 1, 1 );
    glTexCoord2f( 0, 1 );
    glVertex2f( 0, 1 );
    glEnd();

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glMatrixMode( GL_MODELVIEW );
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowSize( 300, 300 );
    glutCreateWindow( "OpenGL Texture Experiment" );
    init();
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;
}