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
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 const NB_TEXTURE = 3; TAB_CHEMIN_BITMAP : Array[1..NB_TEXTURE] Of String = ( 'texcell.bmp', 'texground.bmp', 'fond2.bmp' ); var IDTexture :Array Of GLuint;
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
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;
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.
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;
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.
Partager