2011-07-26 42 views
0

這個問題讓我感到困惑。我正在測試一些Haskell綁定到OpenGL,我創建了一個頂點着色器,一個片段着色器,編譯程序,並在變換頂點之後在屏幕上繪製一個帶紋理的矩形...除了屏幕是空白的。glTexImage2d不做任何事

當我渲染矩形平白色而不是在片段着色器中使用採樣器時,它工作正常。當我進入gdebugger並使用選項將所有紋理替換爲存根紋理時,它也可以正常工作。

當我在gdebugger中查看分配的紋理時,沒有紋理對象,只有默認的2d紋理。當我在glTexImage2d上設置一個斷點時,我發現它正在被調用,但是當我用gdebugger看它時,沒有紋理對象出現在內存中。

發生了什麼事?我忘了設置一些環境變量嗎?我很沮喪。踢球者是我之前遇到過這個問題,於是我設法解決了這個問題,但我忘記了問題所在。我恨我自己> _>

+0

你也可能會調用glGetError(),看看它是否試圖告訴你哪裏出了問題...... –

+2

你的代碼中顯然存在一個錯誤。所以......發佈一些代碼。 –

+2

相關:[40種獲得黑屏的方法](http://dmalcolm.livejournal.com/2433.html) –

回答

5

我移植前段時間OpenGL上的a tutorial到Haskell。它包含一個鏈接到一個非常小的圖書館,其中包括幫助loading textures

也許你可以將該代碼與你必須找出差異的代碼進行比較。

+0

我沒有設置紋理的過濾模式!這顯然造成了問題。 – danharaj

1

我不是一個Haskell人以任何手段,但嘗試做能夠工作,檢查最簡單的事情,看看你想偏離它:

#include <GL/glut.h> 

double aspect_ratio = 0; 

GLuint texID = 0; 
unsigned int texBuf[] = { 
    0x00FFFFFF, 
    0x00FF0000, 
    0x0000FF00, 
    0x000000FF,  
}; 

void display(void) 
{ 
    glEnable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-10*aspect_ratio, 10*aspect_ratio, -10, 10, -10, 10); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255,255,255); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texID); 

    glScalef(8,8,8); 
    glTranslatef(-0.5f, -0.5f, 0.0f); 
    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(); 

    glFlush(); 
    glFinish(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    aspect_ratio = (double)w/(double)h; 
    glViewport(0, 0, w, h); 
} 

void idle() 
{ 
    glutPostRedisplay(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(200,200); 
    glutCreateWindow("Aspect Ratio"); 

    glGenTextures(1, &texID); 
    glBindTexture(GL_TEXTURE_2D, texID); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, 4, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, (char*)texBuf); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutIdleFunc(idle); 
    glutMainLoop(); 
    return 0; 
}