2012-08-13 55 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字節對齊。那麼你不必擔心它。

相關問題