Partage
  • Partager sur Facebook
  • Partager sur Twitter

texture opengl

image texture

Sujet résolu
    18 juillet 2007 à 10:53:11

    j'aurais voulu savoir quelle était mon erreur concernant "loadtexture("oiseau.jpg");".Car quand j'affiche ma fenetre l'image ne s'est pas integree dans la face du cube, à la place, la face est blanche.

    #include <SDL/SDL.h>
    #include "sdlglutils.h"
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <cstdlib>
    #include <stdio.h>
    #include <SDL/SDL_image.h>
    #include <cstring>

    GLuint texture1; //en variable globale

     int main(int argc, char *argv[])
    {
    SDL_Surface *ecran = NULL;
    SDL_Init(SDL_INIT_VIDEO);
    ecran = SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(70,(double)640/480,1,1000);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    texture1 = loadTexture("oiseau.jpg");

    //      FERMER FENETRE
        bool continuer = true;
        SDL_Event event;

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = false;
            }

    //      CREATION D'UN CUBE EN 3D

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity( );
    gluLookAt(3,4,2,0,0,0,0,0,1);
    glBindTexture(GL_TEXTURE_2D, texture1);
    glBegin(GL_QUADS);

       glTexCoord2d(0,1);  glVertex3d(1,1,1);
        glTexCoord2d(0,0);  glVertex3d(1,1,-1);
        glTexCoord2d(1,0);  glVertex3d(-1,1,-1);
        glTexCoord2d(1,1);  glVertex3d(-1,1,1);
    glEnd();


    glFlush();//MISE A JOUR DE L'ECRAN
    SDL_GL_SwapBuffers();//MISE A JOUR DE L'ECRAN


        }
        SDL_Quit();

        return 0;
    }
     


    je vous remercie d'avance, :)
    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2007 à 12:27:29

      Salut,
      l'image oiseau.jpg est bien placé a coté ton executable ?
      • Partager sur Facebook
      • Partager sur Twitter
        18 juillet 2007 à 12:31:14

        Bonjour.
        C'est peut-être un problème lors du chargement de la texture. Il faudrait que tu nous montres le code de ta fonction loadTexture. A moins que ce ne soit une fonction SDL. Dans ce cas je ne peux pas t'aider je ne connais pas assez SDL.
        Moi pour charger mes textures, j'utilise ces deux fonctions dont la base vient de Nehe (nehe dans google)
        Je ne l'ai changé que pour pouvoir charger un tableau de texture au lieu d'une seule.


        AUX_RGBImageRec *LoadBMP(char *Filename)
        {
                FILE *File = NULL;

                if (!Filename)
                {
                        return NULL;
                }

                File = fopen(Filename,"r");

                if (File)
                {
                        fclose(File);
                        return auxDIBImageLoad(Filename);
                }
                return NULL;
        }

        bool LoadGLTextures(GLuint *Texture)
        {
                bool retour = true;

                for (int i = 0 ; i < NB_BOUTONS ; i++)
                {
                        char chemin[512];
                        AUX_RGBImageRec *TextureImage[1];
               
                        memset(TextureImage, 0, sizeof(void *) * 1);
                        sprintf(chemin, "data\\boutons\\%d.bmp", i);   
                        if (TextureImage[0] = LoadBMP(chemin))
                        {
                                glGenTextures(1, &Texture[i]);
                                glBindTexture(GL_TEXTURE_2D, Texture[i]);
                                glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
                                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
                        }
                        else
                                retour = false;

                        if (TextureImage[0])
                        {
                                if (TextureImage[0]->data)
                                {
                                        free(TextureImage[0]->data);
                                }
                                free(TextureImage[0]);
                        }
                }
                return retour;
        }
         


        Le problème c'est que là tu ne pourras charger une texture JPG, mais uniquement BMP puisque JPG et un format compressé, il ne contient pas les donnée "brut" de l'image (genre un tableau avec les valeurs RGB)
        J'espere t'avoir aidé...
        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2007 à 14:25:14

          mon image est bien dans le meme dossier que l'executable.
          le code source de "loadtexture" est le même que celui du tutorial.
          je continue à chercher de mon coté et merci de m'avoir répondu ;)
          le voici:



          SDL_Surface * flipSurface(SDL_Surface * surface);

          GLuint loadTexture(const char * filename,bool useMipMap)
          {
              GLuint glID;
              SDL_Surface * picture_surface = NULL;
              SDL_Surface *gl_surface = NULL;
              SDL_Surface * gl_fliped_surface = NULL;
              Uint32 rmask, gmask, bmask, amask;

              picture_surface = IMG_Load(filename);
              if (picture_surface == NULL)
                  return 0;

          #if SDL_BYTEORDER == SDL_BIG_ENDIAN

              rmask = 0xff000000;
              gmask = 0x00ff0000;
              bmask = 0x0000ff00;
              amask = 0x000000ff;
          #else

              rmask = 0x000000ff;
              gmask = 0x0000ff00;
              bmask = 0x00ff0000;
              amask = 0xff000000;
          #endif

              SDL_PixelFormat format = *(picture_surface->format);
              format.BitsPerPixel = 32;
              format.BytesPerPixel = 4;
              format.Rmask = rmask;
              format.Gmask = gmask;
              format.Bmask = bmask;
              format.Amask = amask;

              gl_surface = SDL_ConvertSurface(picture_surface,&format,SDL_SWSURFACE);

              gl_fliped_surface = flipSurface(gl_surface);

              glGenTextures(1, &glID);

              glBindTexture(GL_TEXTURE_2D, glID);


              if (useMipMap)
              {

                  gluBuild2DMipmaps(GL_TEXTURE_2D, 4, gl_fliped_surface->w,
                                    gl_fliped_surface->h, GL_RGBA,GL_UNSIGNED_BYTE,
                                    gl_fliped_surface->pixels);

                  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
                                  GL_LINEAR_MIPMAP_LINEAR);

              }
              else
              {
                  glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
                               gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
                               gl_fliped_surface->pixels);
                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
              }
              glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);


              SDL_FreeSurface(gl_fliped_surface);
              SDL_FreeSurface(gl_surface);
              SDL_FreeSurface(picture_surface);

              return glID;
          }
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            18 juillet 2007 à 14:38:04

            Ton image doit avoir une taille puissance de 2, soit 1024 *1024, 512*512, 256*256, ....

            Si elle ne l'est pas elle ne s'affichera pas ;).
            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2007 à 15:21:38

              Je crois, mais je ne suis pas certain, qu'il suffit que les dimensions de l'image soit un nombre pair...
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                18 juillet 2007 à 15:22:21

                C'est ce que je vient de dire :D
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2007 à 15:30:29

                  "Je crois, mais je ne suis pas certain, qu'il suffit que les dimensions de l'image soit un nombre pair"

                  "C'est ce que je vient de dire :D "

                  --> Et non, ce n'est pas ce que tu viens de dire :)
                  Ce que tu avais dit avant : que l'image devait avoir une taille puissance de 2, est différent du pair que sa taille soit un nombre pair.

                  Je ne sais pas comment fonctionne ta fonction "loadtexture" (pour ma part, je l'ai reprogrammée, mais qu'a partir de BMP), mais je sais que les implémentations de OpenGl, a partir de 1.2 si je ne m'abuse (donc largement le cas sur beaucoup de machines) restretchent l'image si elle n'a pas une taille puissanc de 2 : du coup, ça permet d'ouvrir toutes les images possibles.

                  Essaie, a tout hasard, de redimentionner ton image en puissance de 2 (avec Paint) pour voir si ça change quelque chose, afin de savoir si le probleme vient de la ou non.
                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    18 juillet 2007 à 15:32:17

                    Ba pas vraiment. Moi je disais qu'on pouvais charger une image de taille 6*10 par exemple même si 60 n'est pas une puissance de 2.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 juillet 2007 à 15:39:01

                      si on peut faire ça, c'est parce que les versions OpenGL dès la 1.2 stretchent les images non-puissances de 2 :) Comme je disais au dessus :)

                      Pour localiser le probleme, essaie de mettre une image gentillette puissance de 2 pour voir si elle apparait, ou alors si ça vient d'ici ou d'ailleurs !
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        18 juillet 2007 à 22:14:55

                        tout d'abord je tiens à vous remercier pour m'avoir aidé! :)
                        Après maintes recherches, j'ai trouvé ce qu'il n'allait pas.Hé bien il fallait le jpeg.dll dans le dossier du projet et ça je l'ignorais :-°
                        Au moins ça servira pour d'autres, car j'en suis sûre qu'il y en aura... :p

                        Et merci encore! ^^
                        • Partager sur Facebook
                        • Partager sur Twitter

                        texture opengl

                        × 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