2017-01-09 17 views
1

2x2 GL_RGB GL_FLOATビットマップを使って2x2クワッドテクスチャを描画するための概念証明を書いて、OpenGLで遊んでいます。OpenGL 1.1でテクスチャ付きクワッドを作成するにはどうすればよいですか?

私の理解からです。これを達成するには、

  1. glEnable(GL_TEXTURE_2D)を呼び出して2dテクスチャを有効にする必要があります。
  2. glTexture2Dを呼び出してピクセルデータでテクスチャを塗りつぶします。
  3. は、ウィンドウ座標系(0、幅、0、高さ、-1,1)に一致するようにglOrthoを設定します。

  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ピクセルは赤、緑、下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:私はそれが働いて得た

OK。ここでは大腿四頭筋を使用したバージョンです:

#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_DECALから

切り替えGL_TEXTURE_ENVまたはあなたがに固執するつもりなら、レンダリングの前に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

I 1、1、1にglColor3fを設定するが、それでも4つの緑色画素として示しています。 glTexEnvの使い方がわかりません。私はそれをglTexImage2Dの代わりに使うべきですか? – Dmitry

+0

@ドミトリー:バインディングの問題もありました。答えは更新されました。 – genpfault

+0

glOrthoを 'glOrtho(0,300,300,0-1,1);に変更すると、それは単一の白いピクセルとして表示されます。ウィンドウ座標0、0で{{赤、緑}、{青、白}}のように正確に表示させるにはどうすればよいですか?私が 'glOrtho(0、200、200、0、-1、1)なら、それはうまくいくようです。 glTranslatef(5、5、0); 'しかし、翻訳を削除すると、赤いピクセルだけが再び表示されます。また、これは四角形の代わりに三角形で行うことができますか? – Dmitry

関連する問題