2017-01-09 53 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