2010-08-09 4 views
1

Mon application OpenGL qui fonctionnait correctement sur la carte ATI a cessé de fonctionner lorsque j'ai mis une carte NVIDIA Quadro. La texture ne fonctionne tout simplement pas du tout! J'ai réduit mon programme à une seule fonction d'affichage qui ne fonctionne pas:OpenGL Nvidia Driver 259.12 texture ne fonctionne pas

void glutDispCallback() 
{ 
//ALLOCATE TEXTURE 
unsigned char * noise = new unsigned char [32 * 32 * 3]; 
memset(noise, 255, 32*32*3); 

glEnable(GL_TEXTURE_2D); 
GLuint textureID; 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei(GL_PACK_ALIGNMENT, 1); 
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_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, noise); 
    delete [] noise; 

//DRAW 
glDrawBuffer(GL_BACK); 
glViewport(0, 0, 1024, 1024); 
setOrthographicProjection(); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glDisable(GL_BLEND); 
glDisable(GL_LIGHTING); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glColor4f(0,0,1,0); 
glBegin(GL_QUADS); 
    glTexCoord2f(0,0); 
    glVertex2f(-0.4,-0.4); 

    glTexCoord2f(0, 1); 
    glVertex2f(-0.4, 0.4); 

    glTexCoord2f(1, 1); 
    glVertex2f(0.4, 0.4); 

    glTexCoord2f(1,0); 
    glVertex2f(0.4,-0.4); 

glEnd(); 
glutSwapBuffers(); 

//CLEANUP 
GL_ERROR(); 
glDeleteTextures(1, &textureID); 
} 

Le résultat est un quad bleu (ou tout ce qui est spécifié par glColor4f()), et non pas un quad blanc qui est ce que le la texture est. J'ai suivi la FAQ sur le site OpenGL. J'ai désactivé le mélange au cas où la texture serait mélangée. J'ai désactivé l'éclairage. J'ai regardé par glGetError() - pas d'erreurs. J'ai également défini glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); et GL_DECAL. Même résultat J'ai aussi essayé différents enroulements polygonaux - CW et CCW.

Quelqu'un d'autre rencontre cela?

+0

Une raison pour laquelle vous créez/détruisez un objet de texture à chaque image au lieu de simplement télécharger de nouvelles données de texture? – genpfault

+0

C'est juste du code pour reproduire le problème. Je ne fais pas ça en réalité. – Budric

Répondre

1

J'ai trouvé l'erreur. Quelque part dans mon code, j'avais initialisé un objet GL_TEXTURE_3D et je n'avais pas appelé glDisable (GL_TEXTURE_3D);

Même si j'avais appelé glBindTexture (GL_TEXTURE_2D, textureID); il aurait dû lier une texture 2D comme texture courante et l'utiliser - car ce code fonctionnait toujours sur les cartes ATI. Eh bien apparemment le pilote nVidia ne faisait pas ça - il utilisait cette texture 3D pour une raison quelconque. Donc, ajouter glDisable (GL_TEXTURE_3D); résolu le problème et tout fonctionne comme prévu.

Merci à tous ceux qui ont essayé de vous aider.

+2

Pour ce que ça vaut, le pilote nvidia fait la bonne chose. Si vous avez activé plusieurs cibles (ici 3d et 2d), la règle est que la 3d prend la précendence sur 2d. Cube> 3D> 2D> 1D. Voir http://stackoverflow.com/questions/2784937/what-is-the-correct-behavior-when-both-a-1d-and-a-2d-texture-are-bound-in-opengl/2786948#2786948 pour tous les détails – Bahbar

1

Pouvez-vous essayer d'utiliser GL_REPLACE dans glTexEnvi? Cela pourrait être un bug dans le pilote NV.

+0

J'ai essayé ça. Juste modifié mon message. J'ai aussi essayé GL_MODULATE. – Budric

1

Votre code est correct et fait ce qu'il faut.

memset (bruit, 255, 32 * 32 * 3); rend la texture blanche, mais vous appelez glColor4f (0,0,1,0); donc la couleur finale sera (1,1,1) * (0,0,1) = (0,0,1) = bleu.

Quel est le comportement que vous aimeriez avoir?

+0

Étant donné que GL_TEXTURE_ENV_MODE est défini sur GL_REPLACE et que GL_BLEND est désactivé, je m'attends à ce que la couleur bleue soit ignorée et que la couleur de texture soit utilisée à sa place. Aussi, je ne vois pas pourquoi votre multiplication des couleurs est correcte. Sous quel mode OpenGL fait-il cela? Ce n'est pas un mélange que je connais. – Budric

+0

Oui c'est le problème, avec GL_REPLACE la couleur du fragment devrait être la couleur de la texture directement. –