c - 如何在 OpenGL 1.1 中创建带纹理的四边形?

标签 c opengl

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

根据我的理解;为此,我必须

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

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

  5. 通过调用 glBindTexture 选择我的纹理。
  6. 通过调用 glTexParameteri 设置纹理参数。
  7. 使用具有指定纹理坐标和顶点的 glBegin(glEnd)/glDrawArrays

我对 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 个像素为红色、绿色,底部两个像素为蓝色和白色。

我做错了什么?

编辑:

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

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;
}

编辑2:

好的,我让它工作了;这是使用四边形的版本:

#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

最佳答案

开关GL_TEXTURE_ENV GL_DECAL 或在渲染前使用 glColor3f(1, 1, 1) 如果您要坚持使用默认的 GL_MODULATE texenv。

在调用 glTexImage2D() 之前,您还需要 glBindTexture(),以便 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;
}

关于c - 如何在 OpenGL 1.1 中创建带纹理的四边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555409/

相关文章:

c - 如何计算C语言中文本中的不同单词数?

c - 在套接字监听服务器之间建立连接

c - 读取二进制文件到-32767到32767的整数范围

c++ - 如何清除opengl着色器缓存

c++ - 一个大的 OpenGL 顶点缓冲区,还是许多小的?

c - emxFree_real_T 导致可执行文件中止

c - 了解 CSAPP 书中的代码片段 open_clientfd(char *hostname, char *port)?

opengl - 如何在 OpenGL 中提供自定义插值技术来填充三角形

c++ - 使用 assimp 在 OpenGL 中使用法线作为颜色

opengl - 使用 OpenGL 编译 OpenCV