2012-08-13 81 views
1

这是我确切的代码的简化版本,为什么下面的代码不会给出纯红色的图像?

我期待看到全红(因为我设置仅冲至255,其他为0),但实际上得到这个:

enter image description here

#include <GLUT/glut.h>                                                               

static GLuint texture; 
void reshape(int w, int h) { 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-2, 2, -2, 2, -2, 2); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

static void callback(unsigned char *data, long width, long height) { 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

    int i,j; 
    for (i = 0; i < height; i++) { 
     for (j = 0; j < width; j++) { 
      data[i * 3 * width + 3 * j] = 255; 
      data[i * 3 * width + 3 * j + 1] = 0; 
      data[i * 3 * width + 3 * j + 2] = 0; 
     } 
    } 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

void init() { 
    glClearColor(0, 0, 0, 0);//RGBA 
} 

void display() { 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
     glEnable(GL_TEXTURE_2D); 
     unsigned char data[3 * 350 * 168]; 
     callback(data, 350, 168); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glBegin(GL_QUADS); 
      glTexCoord2f(0, 0);glVertex2f(-2, -2); 
      glTexCoord2f(0, 1);glVertex2f(-2, 2); 
      glTexCoord2f(1, 1);glVertex2f(2, 2); 
      glTexCoord2f(1, 0);glVertex2f(2, -2); 
     glEnd(); 
     glBindTexture(GL_TEXTURE_2D, 0); 
     glutSwapBuffers(); 
} 

int main(int argc, char *argv[]) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH|GLUT_RGBA); 
    glutInitWindowSize(512, 512); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("hello world texture window"); 
    glutReshapeFunc(reshape); 
    glutDisplayFunc(display); 
    glutIdleFunc(display); 
    init(); 
    glutMainLoop(); 
    return 0; 
}     

我在做什么错在这里?

回答

8
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 

这是您的问题。这是一个常见的,但微妙的错误。

您告诉OpenGL您将提供三个组件的颜色数据:R,G和B.您说每个组件的大小都是UNSIGNED_BYTE

但你也告诉OpenGL别的东西。在函数调用中没有提到的东西。即,the alignment of the individual rows of pixel data。默认行比对是。这意味着OpenGL将假定每行的字节宽度将被填充到四个字节。

这一点尤其重要,因为您的行宽为350.每个像素350 * 3个字节为1050个字节。这是不是可以被四整除。这意味着OpenGL将假定每行占用1052个字节。因此,颜色拧紧;这就是模式重复的原因。这也是为什么你会在右上角得到垃圾像素(因为OpenGL将第一行放在最下面,它从顶部几个像素的内存中读取垃圾)。

无论何时您上传像素数据(主要是为了确保将其设置为您所需的值),您都需要设置对齐方式。这与glPixelStorei完成:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

这将行对齐1.从本质上讲,它是未对齐。

或者,你可以简单地上传GL_RGBA数据,它总是以4字节对齐。那么你不必担心它。

相关问题