2017-01-09 51 views
1

我正在玩OpenGL,试图写一个2x2 GL_RGB GL_FLOAT位图绘制2x2四纹理的概念验证。如何在OpenGL 1.1中创建纹理四元组?

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

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

  4. 请致电glGenTextures获取标识符以唯一标识我的纹理。

  5. 通过调用glBindTexture来选择我的纹理。
  6. 通过调用glTexParameteri来设置纹理参数。
  7. 使用glBeginglEnd)/ 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; 
} 

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

开关GL_TEXTURE_ENVGL_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; 
} 
+0

我设置glColor3f 1,1,1,但它仍然显示其作为4个绿色像素。我不知道如何使用glTexEnv;我应该使用,而不是glTexImage2D? – Dmitry

+0

@Dmitry:你也有一个具有约束力的问题,答案更新。 – genpfault

+0

如果我将glOrtho更改为'glOrtho(0,300,300,0,-1,1);'它显示为单个白色像素。如何在窗口坐标0,0处将其显示为{{red,green},{blue,white}}?它似乎工作,如果我'glOrtho(0,200,200,0,-1,1); glTranslatef(5,5,0);'但是如果我删除了翻译,它只会再次显示红色像素。这也可以用三角形而不是四边形完成吗? – Dmitry