Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL/OpenGL ne fonctionne pas sur tous mes ordis......

Mac..

    23 avril 2008 à 11:39:56

    Bonjour, j'ai créé une petite appli opengl, je la lance sur mon macbook : pas de problème, puis je l'envoie à un pote qui la teste sur son propre macbook, toujours pas de problème, (je lui envoie les libraries qu'il faut utiliser aussi) puis il la teste sur son imac.. et là ça ne marche plus, je la retest sur mon ibook et ça ne marche pas non plus.
    Initialisation OpenGL/SDL :=>
    if( SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            std::cerr << "Echec SDL_Init : " << SDL_GetError() << std::endl;
            return (EXIT_FAILURE);
        }
    
        /* assurons nous que le mode "double buffer" est bien demande*/
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    
        // activation de l'affichage SDL en mode fenetre ou plein ecran....
    	
        SDL_Surface* pScreen = SDL_SetVideoMode(largeur, hauteur, 32, SDL_OPENGL );//  | SDL_GL_DOUBLEBUFFER | SDL_FULLSCREEN=> pour une appli plein écran
    	SDL_ShowCursor(SDL_DISABLE);
    
        /* verification de l'activation de l'affichage*/
        if( !pScreen )
        {
            std::cerr << "Echec de creation de la fenetre en " << largeur << "x" << hauteur << SDL_GetError() << std::endl;
            return (EXIT_FAILURE);
        }
    
        /*recuperation de l'etat du parametre "double buffer"*/
        int nValue;
        if( SDL_GL_GetAttribute(SDL_GL_DOUBLEBUFFER, &nValue) < 0)
        {
            std::cerr << "Echec de recuperation du parametre SDL_GL_DOUBLEBUFFER : " << SDL_GetError() << std::endl;
            return (EXIT_FAILURE);
        }
    	/*autoriser la répétition de touche*/
    	SDL_EnableKeyRepeat(10, 10);
        // assurons nous que le mode "double buffer" est bien actif
        if(nValue != 1)
        {
            std::cerr << "Erreur : SDL_GL_DOUBLEBUFFER inactif" << std::endl;
            return (EXIT_FAILURE);
        }
    

    Affichage:=>
    int i=0;//i pour parcourir le tableau d'image
    	if(init())
    		return (EXIT_FAILURE);
    	GLuint *logos = new GLuint[3];
    	logos[0]=loadTexture("Media/login/logo1.jpg",false);
    glEnable(GL_BLEND); 
    	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    	glEnable(GL_TEXTURE_2D);
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );//on supprime le buffer
    				glBindTexture(GL_TEXTURE_2D, logos[i]);//affichage logo
    				glBegin(GL_QUADS);
    				glTexCoord2d(0,1);  glVertex2d(-1,1);
    				glTexCoord2d(0,0);  glVertex2d(-1,-1);
    				glTexCoord2d(1,0); glVertex2d(1,-1);
    				glTexCoord2d(1,1);  glVertex2d(1,1);
    				glEnd();
    				glFlush();
    				SDL_GL_SwapBuffers();
    

    À la place des images, j'obtient un fond blanc...
    Merci de votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2008 à 12:03:31

      salut
      tu luis envoye les images?
      • Partager sur Facebook
      • Partager sur Twitter
        23 avril 2008 à 12:06:53

        Ton code est pas mal car tu testes les retours de pas mal de fonctions
        Mais tu oublies un test fondamental :

        logos[0]=loadTexture("Media/login/logo1.jpg",false);

        il faut savoir si cette fonction s'est bien passée ou non.
        cette fonction doit appeler gluBuildMipmap ou glTexture. Il faut savoir si ça s'est bien passé.
        Pour cela, tu as gluErrorString et glError a tester

        http://pyopengl.sourceforge.net/docume [...] String.3G.xml
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          23 avril 2008 à 12:39:31

          reBonjour,
          j'ai rajouté le test suivant =>
          GLenum error = glGetError() ; 
          	if (error!=GL_NO_ERROR) { 
          		 
          		 std::cerr << gluErrorString(error) << endl;
          		 return (EXIT_FAILURE);
          		}
          

          et, effectivement j'obtiens une erreur.
          Ce qui me gêne, c'est que l'application arrive à charger l'image lorsqu'elle est exécuté à partir de deux macbooks mais ni un imac ni un ibook n'i arrive.
          a+
          merci,
          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2008 à 12:54:01

            quelle erreur obtiens tu ?
            • Partager sur Facebook
            • Partager sur Twitter

            Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

              23 avril 2008 à 13:24:44

              J'obtiens donc l'erreur "invalid value"
              • Partager sur Facebook
              • Partager sur Twitter
                23 avril 2008 à 14:08:35

                http://pyopengl.sourceforge.net/docume [...] tError.3G.xml

                Voila les erreurs et leurs explications sur cette page. Tu as une valeur non supportée par le driver de carte de ton imac (peut etre un vieux ?)

                Ce qu'il faudrait, c'est voir le code de la fontion loadTexture, qui est une fonction donnée par une personne sur ce site, de voir quelle fonction opengl, a l'intérieur, genere cette erreur, et essayer de modifier les parametres pour voir. (un parametre surement non supporté par le vieux driver)
                Puis, idéalement, il faudrait modifier la fonction loadTexture, faire le test d'erreur dedans, et si ça échoue, tenter de générer une texture d'une autre maniere, plus modeste pour le driver.

                Ce que tu peux faire pour voir, c'est utiliser les fonctions OpenGL qui permettent d'obtenir la version installée, et il y a aussi, je crois, d'autres fonctions d'OpenGL qui permettent d'énumérer les fonctionnalités actives/inactives.

                exemple :
                imagine que ton driver ne supporte par le mipmapping, il faudrait, en cas d'échec, initialiser la texture avec un glTexture
                • Partager sur Facebook
                • Partager sur Twitter

                Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                  23 avril 2008 à 14:17:43

                  Bon vous allez dire que je suis compliqué.......
                  Donc j'ai mis un petit test, pour vérifier si l'image se charge bien de cette manière sinon je la charge d'une autre manière.
                  je teste cette méthode sur mon ibook et effectivement ça marche comme il faut.
                  Je l'envoie ensuite à mon ami qui la teste sur son imac, et là ! l'imac ne renvoie aucune erreur mais affiche son fond blanc. donc je refais un teste en désactivant le mipmapping qui effectivement est à l'origine du problème, et là ça marche... J'ai l'impression qu'il n'est pas capable de charger l'image avec le mipmapping mais qu'il ne s'en "rend pas compte" ( l'imac )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 avril 2008 à 14:38:06

                    Le mipmapping a été rajouté plus tard, donc les vielles cartes graphiques ne savent pas le faire.
                    Pas contre, pour des raisons de compatibilité, que ça ne plante pas, le pilote sait reconnaitre la fonction, mais il renvoie une erreur, ou ne fait rien.

                    Un bon programme teste les codes de retour, ou alors si le pilote sait le faire, et, si ce n'est pas le cas, fait d'une autre façon.

                    pour interroger le driver sur la version, par exemple : utilise
                    http://pyopengl.sourceforge.net/docume [...] String.3G.xml

                    pour récupérer d'autres infos (peut etre trouveras tu ton bonheur)
                    http://pyopengl.sourceforge.net/docume [...] /glGet.3G.xml


                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      23 avril 2008 à 17:30:42

                      Après quelques recherche, j'ai découvert que ce n'est pas le mipmapping qui gênait mais la ligne suivante :
                      glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
                                           gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
                                           gl_fliped_surface->pixels);
                      

                      et pour pouvoir charger l'image, je passe par le mipmapping.
                      merci,
                      • Partager sur Facebook
                      • Partager sur Twitter

                      SDL/OpenGL ne fonctionne pas sur tous mes ordis......

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown