IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[Delphi : OpenGL / SDL] Problème de textures


Sujet :

Langage Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [Delphi : OpenGL / SDL] Problème de textures
    Bonjour tout le monde, je me permet de poster pour demander de l'aide.
    Voici mon problème : dans le cadre d'un projet de jeu, j'utilise OpenGL et SDL pour le moteur graphique, j'ai toutefois un gros problème avec les textures.

    J'utilise le code de la source utilisant GLAUX de cette page : http://eraquila.developpez.com/opengl/?page=page_9, en remplaçant les utilisations de GLAUX par SDL, voila ce que ça donne :

    Les variables et constantes utilisées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const
      NB_TEXTURE = 3;
      TAB_CHEMIN_BITMAP : Array[1..NB_TEXTURE] Of String =
                            (
                             'texcell.bmp',
                             'texground.bmp',
                             'fond2.bmp'
                            );
     
     
    var
      IDTexture  :Array Of GLuint;
    La création des textures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    procedure TGraphics.CreerTextures;
    {Objectif :Charger une texture en mémoire. Les chemins accédant aux textures
               sont passés en paramètre.}
    var
       {Pointeur sur une structure PTAUX_RGBImageRec stockant les pixels de l'image}
    //    pTextures         :PTAUX_RGBImageRec;
        texture : PSDL_Surface;
       {Variable contrôle pour créer les texture une à une}
        i : Integer;
       {Message d'erreurs pour les textures non-trouvée}
        Msg_Erreur : string;
     
    begin
        {Récupérer le nombre de textures qui seront à générer}
         SetLength(IDTexture, NB_TEXTURE );
     
        {Génération de "x" nom pour la texture}
         glDeleteTextures( NB_TEXTURE, @IDTexture[1] );
         glGenTextures( NB_TEXTURE, @IDTexture[1] );
     
         {Parcourir les chemins passés en paramètre}
         for i := 1 to NB_TEXTURE do
         begin
          {Vérifier si le fichier existe}
          if FileExists( TAB_CHEMIN_BITMAP[i] ) then
          begin
           {Charger la texture en mémoire}
            texture := SDL_LoadBMP( PChar(TAB_CHEMIN_BITMAP[i]) );
           {Si fichier bitmap chargé en mémoire alors créer la texture}
           if Assigned( texture ) then
           begin
                {Charge la texture portant le ID "IDTexture" donc la i ième}
                glBindTexture(GL_TEXTURE_2D, IDTexture[i]);
     
                {Paramétrage d'application de la texture
                 Ici on prend GL_LINEAR du fait que l'application est
                 beaucoup plus net que GL_NEAREST. Fait le changement et
                 vous verrez...}
                glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
                                GL_NEAREST );
                glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
                                GL_NEAREST );
     
                {Type de  combinaison de la texture avec le tampon
                 chronomatique}
                glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
     
                WriteLn( texture.format.BytesPerPixel,'  ', texture.w,' ', texture.h);
     // Renvoie les bons formats/largeur/hauteur (qui sont des puissances de 2)
     
                {Définition de la texture 2D}
                glTexImage2D( GL_TEXTURE_2D, 0, texture.format.BytesPerPixel,
                              texture.w, texture.h,
                              0, GL_RGB, GL_UNSIGNED_BYTE,
                              texture.pixels);
     
                WriteLn(glIsTexture(IDTexture[i])); // Renvoie TRUE
                SDL_FreeSurface(texture);
     
               end
               else
                   begin
                   {Avertir que la texture n'a pue être trouvé}
                   Msg_Erreur := 'Erreur au chargement de la texture "' +
                                  TAB_CHEMIN_BITMAP[I] + '"';
                   MessageBox( 0, PChar(Msg_Erreur), 'Textures',
                               MB_OK And MB_ICONWARNING );
              end;
          end
          else
              begin
                   {Avertir que la texture n'a pue être trouvé}
                   Msg_Erreur := 'Texture : "' + TAB_CHEMIN_BITMAP[I] + '" n''a pas'
                                 + ' été trouvée';
                   MessageBox( 0, PChar(Msg_Erreur), 'Textures',
                               MB_OK And MB_ICONWARNING );
              end;
         end;
    end;
    L'initialisation d'OpenGL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    constructor TGraphics.Create(heigth, width : Integer);
    begin
      Self.height := height;
      Self.width := width;
     
      SDL_Init(SDL_INIT_VIDEO);
      SDL_SetVideoMode(width, heigth, 32, SDL_OPENGL or SDL_FULLSCREEN);
     
      glMatrixMode( GL_PROJECTION );
      glLoadIdentity();
     
      gluPerspective( 45, width/heigth, 600, 2000 );
     
      glEnable( GL_TEXTURE_2D );
      glEnable( GL_DEPTH_TEST );
      glDepthFunc( GL_LEQUAL );
      glEnable( GL_LIGHTING );
     
      SetLight(); // crée une lumières
      CreerTextures();
    end;
    Cependant, quand je lance l'application, le résultat que j'obtient est pour le moins surprenant: après quelque tests, je m'aperçois que l'ensemble des objets de ma scène est de la couleur de pixel tout en haut à gauche de la dernière image chargée, mais avec les composantes R et B inversées.
    Si je met une ou plusieurs des lignes suivantes en commentaire, l'affichage se fais comme si je ne mettais rien :
    glEnable( GL_TEXTURE_2D );
    glTexImage2D( GL_TEXTURE_2D, 0, texture.format.BytesPerPixel,
    texture.w, texture.h,
    0, GL_RGB, GL_UNSIGNED_BYTE,
    texture.pixels);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
    GL_NEAREST );

    Sans celle ci :
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    la scène est un peu plus sombre que la normale.

    Je fini juste par préciser que le résultat est le même quelque soit la texture que je souhaite utiliser plus tard dans le code avec glBindTexture( GL_TEXTURE_2D, 1 ); , glBindTexture( GL_TEXTURE_2D, 2 ); , ou glBindTexture( GL_TEXTURE_2D, 3 ); , et même sans.

    Merci d'avance, si vous avez besoin de précision, je serais ravi de les fournir.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    première remarque, les tableaux dynamiques sont 0 basés ! donc la boucle devrait aller de 0 à NB_TEXTURE-1 (attention aux noms des bitmaps, soit il faut modifier la déclaration, soit utilise "i+1")

    ensuite, tu devrais tester un affichage simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    glBegin(GL_QUADS);
          glTexCoord2f(0,0); glVertex2f(0,0);
          glTexCoord2f(1,0); glVertex2f(0,100);
          glTexCoord2f(1,1); glVertex2f(100,100);
          glTexcoord2f(0,1); glVertex2f(100,0);
    glEnd();
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    J'ai résolu mon problème, c'était en fait un problème d'application de texture sur un quadrique, en désactivant les textures avant de l'afficher et en les réactivant après, les textures s'affichent bien sur le reste des objets.

    Il me reste tout de même un problème : les composantes R et B des images chargées sont inversées, par exemple, je désire appliquer une texture rouge et elle apparait en bleu, je n'ai pas la moindre idée de la provenance du problème et j'aimerais pouvoir le résoudre sans avoir à inverser moi même les composantes.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    tu peux tenter d'utiliser GL_BGR ou GL_BGRA dans glTexImage2D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const 
      GL_BGR = $80E0;
      GL_BGRA = $80E1;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci, c'est exactement ce dont j'avais besoin, j' avais essayé avec GL_BGR mais la constante n'avait pas été reconnue, tout marche bien avec $80E0.

Discussions similaires

  1. [Débutant][OpenGL ES] Problème affichage textures
    Par Niicoo dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/06/2009, 15h15
  2. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  3. Opengl / SDL : Modifier une texture pixel par pixel
    Par tenseiken dans le forum Langage
    Réponses: 0
    Dernier message: 27/03/2009, 13h58
  4. Delphi opengl : Probleme d'initialisation texture
    Par tenseiken dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2009, 12h18
  5. texture opengl-sdl
    Par ffomnislash dans le forum OpenGL
    Réponses: 20
    Dernier message: 21/07/2005, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo