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.