2011-07-26 5 views
0

Ce problème me déconcerte. Je teste certaines liaisons Haskell à OpenGL, je crée un vertex shader, un fragment shader, compile le programme et dessine un rectangle texturé à l'écran après la transformation des vertices ... sauf que l'écran est vide.glTexImage2d ne fait rien

Lorsque je rend le rectangle plat en blanc au lieu d'utiliser un échantillonneur dans le fragment shader, cela fonctionne correctement. Quand je vais dans gdebugger et que j'utilise l'option pour remplacer toutes les textures avec une texture de bout, cela fonctionne aussi bien.

Lorsque je regarde les textures allouées dans gdebugger, il n'y a pas d'objets texture, seulement la texture 2d par défaut. Lorsque je définis un point d'arrêt sur glTexImage2d, je vois qu'il est appelé, mais aucun objet de texture n'apparaît en mémoire quand je le vois avec gdebugger.

Que se passe-t-il? Est-ce que j'oublie de définir certaines variables d'environnement? Je suis assez frustré. Le kicker est que j'avais déjà ce problème, et j'ai réussi à le réparer, mais j'ai oublié quel était le problème. Je me déteste> _>

+0

Vous pouvez également appeler glGetError() et voir s'il essaie de vous dire ce qui s'est passé ... –

+2

Il y a évidemment un bug dans votre code. Alors ... poster du code. –

+2

pertinent: [40 façons d'obtenir un écran noir vide] (http://dmalcolm.livejournal.com/2433.html) –

Répondre

5

Je Ported a tutorial sur OpenGL à Haskell il y a quelque temps. Il comprend un lien vers une très petite bibliothèque qui, entre autres choses, aide avec loading textures.

Peut-être que vous pourriez comparer ce code avec ce que vous avez à repérer les différences.

+0

Je ne mettais pas un mode de filtre pour la texture! Cela causait des problèmes, apparemment. – danharaj

1

Je ne suis pas un gars Haskell par tout moyen, mais essayer de faire la chose la plus simple qui pourrait éventuellement travailler et vérifier pour voir où vous vous écartez de lui:

#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; 
}