Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1276 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Opengl+Qt impossible de charger une texture

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Opengl+Qt impossible de charger une texture

n°1470686
ash08
Posté le 05-11-2006 à 01:51:35  profilanswer
 

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?

mood
Publicité
Posté le 05-11-2006 à 01:51:35  profilanswer
 

n°1470689
IrmatDen
Posté le 05-11-2006 à 02:06:21  profilanswer
 

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 ;)


---------------
.
n°1470886
ash08
Posté le 05-11-2006 à 18:51:37  profilanswer
 

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 :)

n°1470933
IrmatDen
Posté le 05-11-2006 à 21:03:37  profilanswer
 

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.


---------------
.
n°1470940
ash08
Posté le 05-11-2006 à 21:30:50  profilanswer
 

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
n°1470980
IrmatDen
Posté le 06-11-2006 à 02:53:58  profilanswer
 

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 ;)


---------------
.
n°1664803
DrIDK
Posté le 02-01-2008 à 15:50:38  profilanswer
 

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!

n°1664817
DrIDK
Posté le 02-01-2008 à 16:02:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Opengl+Qt impossible de charger une texture

 

Sujets relatifs
Matrices & openGLconvertir du opengl en 'off-line rendering' (povray, pbrt, pixie...)
[ASP.Net] Impossible d'ouvrir une solution[OpenGL] ¨Probleme pour compiler
[openGL] Rotation d'un objet face a un pointImpossible d'insérer un nombre dans une table MySQL (Prob de noob dsl)
[OpenGL] surface avec couleur différente de chaque coté[Opengl] afficher un texte
Modeleur Volumique - Infos Idées & OpenCSG[MySQL/PHP] Impossible de renommer un fichier proposé en download
Plus de sujets relatifs à : Opengl+Qt impossible de charger une texture


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR