2012-02-19 96 views
3

加載紋理時,我想了解如何在OpenGL中載入紋理和我寫了這個非常簡單的代碼:顏色錯誤在OpenGL

GLuint texture; 

void loadTexture() { 

    GLubyte data[] = { 255,0,0, 
         0,255,0, 
         0,255,0, 
         255,0,0 }; 

    glGenTextures(1, &texture); 

    glBindTexture(GL_TEXTURE_2D, texture);   

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    int chk = gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, 2, 2, GL_RGB, GL_UNSIGNED_BYTE, data); 

    if (chk!=0) 
     printf("error code = %d\n",chk); 
    else 
     printf("success\n"); 

} 

我用loadTexture()加載紋理內存。在這個示例中,紋理非常簡單,但目前沒有關係。

void drawTexturedSquare() { 

    glEnable(GL_TEXTURE_2D); 
    glBegin (GL_QUADS); 

    glTexCoord2f (0.0, 0.0); 
    glNormal3f(0, 0, 1); 
    glVertex3f (0.0, 0.0, 0.0); 

    glTexCoord2f (1.0, 0.0); 
    glNormal3f(0, 0, 1); 
    glVertex3f (10.0, 0.0, 0.0); 

    glTexCoord2f (1.0, 1.0); 
    glNormal3f(0, 0, 1); 
    glVertex3f (10, 10, 0.0); 

    glTexCoord2f (0.0, 1.0); 
    glNormal3f(0, 0, 1); 
    glVertex3f (0.0, 10, 0.0); 

    glEnd(); 
    glDisable(GL_TEXTURE_2D); 

} 

我想將這個簡單的紋理應用於廣場。我打電話功能drawTexturedSquare()draw()功能,我已經叫

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

的問題裏面,這是結果我得到

enter image description here

,而我希望廣場是綠色的主對角線(左上到右下),紅色是次對角線(右上到左下)。有人可以解釋我爲什麼?

再者,每次我運行程序時,我得到了不同的結果:

enter image description hereenter image description hereenter image description hereenter image description here

我不明白的地方這藍色出來。5月有人能幫助我嗎?

回答

7

數據的每一行都需要4字節對齊。或者用0填充每行,或者使用RGBA紋理。

如果你不想做上述情況,你可以使用:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

你的顏色改變的原因是因爲你不墊正確的行,OpenGL的讀取過去的結束陣列。

+0

謝謝,它的工作!你能向我解釋爲什麼,如果我使用RGBA紋理,即使我放置0 alpha,代碼也能正常工作嗎?我希望能夠「看到」一個透明的正方形...... – Saphrosit 2012-02-19 13:00:59

+0

您需要設置一個混合模式,在對渲染有任何影響之前使用alpha通道。 – rasmus 2012-02-19 16:56:42

0

你可能想嘗試GL_NEARESTGL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER

因爲它是現在,OpenGL的是顏色之間進行插值,創造一個梯度(因爲你的紋理被從2x2的拉伸至但是大屏幕是)

這並不能解釋爲什麼你每次都會爲你的紋理獲得不同的結果。