Opengl+Qt impossible de charger une texture

Opengl+Qt impossible de charger une texture - C++ - Programmation

Marsh Posté le 05-11-2006 à 01:51:35    

Salut tout le monde,
j'ai un probleme pour charger des textures en opengl.
Je suis novice donc je me suis inspire du tuto de nehe sur les textures et de cet article qui defini les specifications pour Qt.
 
Mais impossible a l'affichage j'obtient juste un carre bleu... :sweat:  

Code :
  1. /**
  2. *
  3. * Retracer la fenetre graphique. est appele a chaque modification de scene
  4. *
  5. */
  6. void Graphique::paintGL()
  7. {
  8.    // Vider la fenetre graphique
  9. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  10.    // Faire une mise a l'echelle pour la demo...
  11.    glLoadIdentity();
  12.   // On ne tient pas compte du temps encore...   
  13.    static double dt = 0.0 ;
  14.    pScene->animer(dt);
  15.    pScene->afficher(dt);
  16. }
Code :
  1. /**
  2. *
  3. * Initialisation de contexte OpenGL
  4. *
  5. */
  6. void Graphique::initializeGL()
  7. {
  8.    glClearColor( 0.0, 0.0, 0.0, 0.0 );
  9.    glShadeModel( GL_SMOOTH );
  10. glEnable(GL_TEXTURE_2D);
  11. glEnable(GL_DEPTH);
  12. glEnable(GL_DEPTH_TEST);
  13. glEnable(GL_COLOR_MATERIAL);
  14. glDepthFunc(GL_LEQUAL);
  15. }


La classe decor qui est pour l'instant juste un cube sur lequel on met une texture

Code :
  1. #include "decor.h"
  2. /*
  3. * Constructeur
  4. *  
  5. */
  6. decor::decor()
  7. {
  8. loadGLTextures();
  9. }
  10. /*
  11. * Destructeur
  12. *  
  13. */
  14. decor::~decor()
  15. {}
  16. /*
  17. * chargement de la texture
  18. *
  19. */
  20. void decor::loadGLTextures(void)
  21. {
  22.   QImage t;
  23.   QImage b;
  24.    
  25.   if ( !b.load( "./data/NeHe.bmp" ) )
  26.   {
  27.     b = QImage( 16, 16, 32 );
  28.     b.fill( Qt::red.rgb() );
  29.   }
  30.   t = QGLWidget::convertToGLFormat( b );
  31.   glGenTextures( 1, &texture[0] );
  32.   glBindTexture( GL_TEXTURE_2D, texture[0] );
  33.   glTexImage2D( GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, t.bits() );
  34.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  35.   glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  36. }
  37. /*
  38. * Afficher: Methode contenant les appels OpenGL pour dessiner l'objet
  39. *  
  40. */
  41. void decor::afficher() const
  42. {
  43. // Sauvegarde la matrice courante
  44. glPushMatrix();
  45. glBegin(GL_LINES);
  46.  glColor3f(1.0f,0.0f,0.0f);      // Red
  47.  glVertex3f( 1.5f, 0.0f, 0.0f);     // Top Of Triangle (Front)
  48.  glVertex3f( 0.0f, 0.0f, 0.0f);     // Top Of Triangle (Front)
  49. glEnd();
  50. glBegin(GL_LINES);
  51.  glColor3f(0.0f,1.0f,0.0f);      // Red
  52.  glVertex3f( 0.0f, 0.0f, 0.0f);     // Top Of Triangle (Front)
  53.  glVertex3f( 0.0f, 1.5f, 0.0f);     // Top Of Triangle (Front)
  54. glEnd();
  55. glBegin(GL_LINES);
  56.  glColor3f(0.0f,0.0f,1.0f);      // Red
  57.  glVertex3f( 0.0f, 0.0f, 0.0f);     // Top Of Triangle (Front)
  58.  glVertex3f( 0.0f, 0.0f, 1.5f);     // Top Of Triangle (Front)
  59. glEnd();
  60. glBindTexture(GL_TEXTURE_2D, texture[0]);
  61. glBegin(GL_QUADS);
  62.  // Front Face
  63.  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  64.  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  65.  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  66.  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  67.  // Back Face
  68.  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  69.  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
  70.  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
  71.  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  72.  // Top Face
  73.  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
  74.  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  75.  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  76.  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
  77.  // Bottom Face
  78.  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  79.  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  80.  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  81.  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  82.  // Right face
  83.  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
  84.  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
  85.  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
  86.  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
  87.  // Left Face
  88.  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
  89.  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
  90.  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
  91.  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
  92. glEnd();
  93. // Revient a la matrice initiale
  94. glPopMatrix();
  95. }
  96. /*
  97. * Afficher: Methode pour animer l'objet
  98. *  
  99. * @param dt Temps pour l'animation
  100. *
  101. */
  102. void decor::animer(double dt)
  103. {
  104. }


 
J'ai teste et b.load( "./data/NeHe.bmp" ) retourne bien true :)
 
voila je sais pas du tout ce que j'aurai pu oublier
quelqu'un a une idee?

Reply

Marsh Posté le 05-11-2006 à 01:51:35   

Reply

Marsh Posté le 05-11-2006 à 02:06:21    

Salut,
 
OpenGL conserve en mémoire la dernière couleur assignée; cette couleur sert aussi de multiplicateur à l'éventuelle texture utilisée.
Si je me trompe pas, un appel à glColor3f(1.0, 1.0, 1.0); avant d'afficher ton cube devrait résoudre ton problème.
 
Sans rapport direct, si tu utilises Qt4.x, QGLWidget te permet de charger une image grâce à QGLWidget::bindTexture.
Exemple d'utilisation (tiré de Qt\examples\opengl\textures\glwidget.cpp ):

Code :
  1. textures[j] = bindTexture(QPixmap(QString(":/images/side%1.png" ).arg(j + 1)), GL_TEXTURE_2D);


Tu t'économiseras toujours quelque lignes ;)


---------------
.
Reply

Marsh Posté le 05-11-2006 à 18:51:37    

Salut,
d'abord merci pour ton coup de main :)
 

IrmatDen a écrit :

Salut,
 
OpenGL conserve en mémoire la dernière couleur assignée; cette couleur sert aussi de multiplicateur à l'éventuelle texture utilisée.
Si je me trompe pas, un appel à glColor3f(1.0, 1.0, 1.0); avant d'afficher ton cube devrait résoudre ton problème.


J'ai teste et maintenant mon carre apparait juste tout blanc    
Je suis assez perplexe :sweat:

IrmatDen a écrit :

Sans rapport direct, si tu utilises Qt4.x, QGLWidget te permet de charger une image grâce à QGLWidget::bindTexture.
Exemple d'utilisation (tiré de Qt\examples\opengl\textures\glwidget.cpp ):

Code :
  1. textures[j] = bindTexture(QPixmap(QString(":/images/side%1.png" ).arg(j + 1)), GL_TEXTURE_2D);


Tu t'économiseras toujours quelque lignes ;)


En fait, je suis oblige d'utiliser qt3.3 qui est installe sur les machines. Mais c'est bon a savoir pour plus tard :)

Reply

Marsh Posté le 05-11-2006 à 21:03:37    

ash08 a écrit :

J'ai teste et maintenant mon carre apparait juste tout blanc    
Je suis assez perplexe :sweat:


Mince, raté :/
 
Tu peux tester contre t.isNull(), t.width() ou t.height() pour voir si ton image adaptée est bien enregistrée?
 
Sinon, ton image respecte-t-elle bien cette règle?

Citation :

The width must be 2^m + 2*border and the height 2^n + 2*border where m and n are integers and border is either 0 or 1.


---------------
.
Reply

Marsh Posté le 05-11-2006 à 21:30:50    

IrmatDen a écrit :

Mince, raté :/
 
Tu peux tester contre t.isNull(), t.width() ou t.height() pour voir si ton image adaptée est bien enregistrée?

Code :
  1. if(!t.isNull()) { cout << t.height()  << endl;}
  2. // affiche 256 sur la console
IrmatDen a écrit :

Sinon, ton image respecte-t-elle bien cette règle?

Citation :

The width must be 2^m + 2*border and the height 2^n + 2*border where m and n are integers and border is either 0 or 1.



je pense, c'est l'image de texture du tutoriel : 256*256  
 
ca devient dur la


Message édité par ash08 le 05-11-2006 à 21:31:34
Reply

Marsh Posté le 06-11-2006 à 02:53:58    

Essaie de voir ce que te donne texture[0] après initialisation, et juste avant appel à glBindTexture?
Là, je vois pas trop :/
 
Après, t'es bon pour comparer fonction par fonction avec les exemples :/
Sauf si quelqu'un voit de suite ce qu'il manque ;)


---------------
.
Reply

Marsh Posté le 02-01-2008 à 15:50:38    

J'ai le meme problemes! La solution est de mettre ton LoadTextures dans le initializeGL()..
 
Perso, j'aime pas trop, et j'aimerai aussi faire comme toi, le faire dans le constructeur.
Parce que meme apres l'appelle de initializeGL dans le construct, ca marche pas.. Ah mon avis , il dois se passer qqch après le constructeur... Si tas la reponse dit le moi!

Reply

Marsh Posté le 02-01-2008 à 16:02:08    

Ca y'est j'ai trouvé !!
Dans ton constructeur , met  glInit()   avant ton loadTexture()!  
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed