8 votes

La carte de texture OpenGL simple ne fonctionne pas ?

J'essaie de comprendre le mappage de texture en OpenGL et je n'arrive pas à faire fonctionner un exemple simple.

Le polygone est en train d'être dessiné, bien qu'il ne soit pas texturé mais juste d'une couleur unie. De plus, le bitmap est chargé correctement dans sprite1[] car j'utilisais avec succès glDrawPixels jusqu'à présent.

J'utilise glGenTextures pour obtenir mon nom de tex, mais je remarque que cela ne change pas texName1 ; ce GLuint est ce à quoi je l'initialise, même après l'appel à glGenTextures...

J'ai activé GL_TEXTURE_2D.

Voici le code :

GLuint texName1 = 0;

glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_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_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);

glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
    glTexCoord2f (0.0, 0.0);
    glVertex3f (0.0, 0.0, -5.0f);
    glTexCoord2f (1.0, 0.0);
    glVertex3f (.5, 0.0, -5.0f);
    glTexCoord2f (1.0, 1.0);
    glVertex3f (.5, .5, -5.0f);
    glTexCoord2f (0.0, 1.0);
    glVertex3f (0.0, .5, -5.0f);
glEnd();

MISE À JOUR : Je suis perdu. Voici tout ce que j'ai essayé :

  1. Il s'avère que j'initialisais ma texture avant que l'OGL ne soit initialisé. La texture est initialisée (glGenTextures->glTexImage2D) dans un constructeur de classe et dessinée (glBegin->glEnd) dans une fonction membre qui est appelée à chaque image. genTextures semble fonctionner correctement maintenant et j'obtiens un nom de 1.

  2. Toutes les combinaisons possibles de GL_RGBA8, GL_BGRA_EXT (GL_BGRA ne fonctionne pas sur mon système ; j'ai besoin du _EXT), et j'ai même supprimé le canal alpha du bitmap et essayé toutes les combinaisons de GL_RGB, GL_BGR_EXT, etc etc. Sans succès.

  3. J'ai essayé de créer un bitmap de manière procédurale et de l'utiliser.

  4. Assurez-vous que GL_COLOR_MATERIAL n'est pas activé.

  5. Changement de la taille des bitmaps en 32x32.

  6. J'ai essayé glTexEnvi au lieu de glTexEnvf.

7voto

unwind Points 181987

En plus de note de mentat que vous pourriez avoir un problème avec les dimensions de texture non puissantes de deux, vous mentionnez la génération du nom de la texture sans changer le nom.

On dirait que vous appelez [glGenTextures](http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gentextures.html)() trop tôt, c'est-à-dire avant d'initialiser OpenGL. Si ce n'est pas le cas, alors je suggère d'ajouter du code juste après l'appel à glGenTextures() qui vérifient l'état d'erreur OpenGL, en appelant [glGetError()](http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/geterror.html) .

4voto

mentat Points 1061

Dans vos commentaires, vous dites que votre bitmap fait 29x20 pixels. À ma connaissance, pour générer une texture valide, OpenGL exige que la taille de l'image (sur chaque dimension) soit une puissance de 2. Il n'est pas nécessaire que ce soit un carré, ce peut être un rectangle. Vous pouvez contourner ce problème en utilisant des extensions OpenGL telles que GL_ARB_texture_rectangle .

2voto

Christian Points 21

Je vais mettre ceci ici car j'ai eu le même problème et j'ai trouvé un autre post expliquant le problème. L'iPhone supporte GL_BGRA(GL_EXT_BGRA) mais apparemment seulement comme un format d'entrée et non comme un format interne. Donc, si vous changez l'appel glTexImage2D pour avoir un format interne de GL_RGBA alors cela fonctionne.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, &sprite1[54]);

J'espère que cela aidera quelqu'un d'autre qui tombera sur cet article.

1voto

Maurice Gilden Points 1363

Quelques idées au hasard :

  • GL_COLOR_MATERIAL peut être activé.
  • changez "glTexEnvf" en "glTexEnvi" et voyez si cela aide
  • si texName1 est 0 après glGenTextures vous n'avez peut-être pas de contexte OpenGL actif

Pour vérifier les erreurs, je recommande d'écrire une petite fonction qui imprime une sortie lisible pour les résultats les plus communs de glGetErrors et de l'utiliser pour trouver la ligne qui crée l'erreur. Une autre possibilité serait d'utiliser quelque chose comme GLIntercept , BuGLe o gDEBugger .

1voto

Azder Points 2076

Mon OpenGL est rouillé, mais je me rappelle avoir eu les mêmes problèmes avec avec glTexImage2D . J'ai finalement réussi à le faire fonctionner, mais j'ai toujours eu plus de chance avec gluBuild2DMipmaps Je me suis donc retrouvé avec

gluBuild2DMipmaps (
  GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data
);

qui a remplacé

glTexImage2D (
  GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data 
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X