2015-12-13 54 views
0

我正在嘗試使用即時模式紋理來構建一個簡單的項目。 不幸的是,當我渲染時,GL顏色顯示出來而不是紋理。我搜索瞭解決方案,但發現在線示例和我的代碼之間沒有任何有意義的區別。OpenGL即時模式紋理不起作用

我已經將它減少到一個最小的失敗的例子,我已經在這裏提供了。如果我的理解是正確的,這應該會產生一個帶有黑色,紅色,綠色和藍色角落的紋理四邊形。不幸的是,它看起來是紫色的,就好像它完全忽略了紋理。我究竟做錯了什麼?

#include <glut.h> 

GLuint tex; 

void displayFunc() { 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glBegin(GL_TRIANGLE_STRIP); 
    glColor3f(0.5, 0, 1); 
    glTexCoord2f(0.0, 0.0); 
    glVertex2f(-1.0, -1.0); 

    glTexCoord2f(1.0, 0.0); 
    glVertex2f(1.0, -1.0); 

    glTexCoord2f(0.0, 1.0); 
    glVertex2f(-1.0, 1.0); 

    glTexCoord2f(1.0, 1.0); 
    glVertex2f(1.0, 1.0); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowPosition(0, 0); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("Test"); 
    glutDisplayFunc(displayFunc); 

    GLubyte textureData[] = { 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 255, 0 }; 
    GLsizei width = 2; 
    GLsizei height = 2; 

    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB8, GL_UNSIGNED_BYTE, (GLvoid*)textureData); 

    glutMainLoop(); 
} 

輸出: quad is purple

而且可能值得一提:

我建立在Mac(運行埃爾卡皮坦10.11.1)這個項目

顯卡:NVIDIA的GeForce GT 650M 1024 MB

+1

除了Reti Koradi的回答,你的紋理也不是mipmap-complete。您應該通過'glTexParameteri'將紋理縮小過濾器明確設置爲「GL_LINEAR」或「GL_NEAREST」。 – derhass

+0

@derhass謝謝!我需要這兩個和Reti Koradi的答案來解決它。 –

回答

2

您正在向glTexImage2D()傳遞無效參數。 GL_RGB8不是第7個(格式)參數支持的值之一。正確的值是GL_RGB

尺寸格式,如GL_RGB8,用於參數internalFormat。在這種情況下,該值定義組件的數量和用於紋理內部存儲的每個組件的大小。

格式參數定義你在傳遞數據。對於這些,所述格式僅限定部件的數量,而類型定義每個組件的類型和尺寸。

每當您的OpenGL代碼出現問題時,請確保您撥打glGetError()來檢查錯誤。在這種情況下,您會看到由glTexImage2D()調用引起的GL_INVALID_ENUM錯誤。

+0

謝謝!這與皮爾斯的評論一起解決了這個問題。 –