Chargement des textures en opengl

Soyez le premier à donner votre avis sur cette source.

Vue 5 575 fois - Téléchargée 863 fois

Description

Bonjour à tous

En apprenant l'opengl, j'ai remarqué que si on voulait faire quelque chose d'un peu diversifié, on devait faire appel à un grand nombre d'images différentes, créer des textures et les appeler. Ce qui est assez lourd comme méthode car apparemment la fonction : glBindTexture(GL_TEXTURE_2D, textures) est assez gourmande en ressouces.

Je me suis donc inspiré de ceci :

http://jeux.developpez.com/faq/opengl/?page=techniques#TECHNIQUES_meta_texture

L'avantage de la fonction que j'ai codé est qu'elle fait quasiment tout toute seule :p.
Vous verrez que dans les sources il y a un fichier : fichier_textures.txt, il suffit d'y noter le noms des images que l'on souhaite utiliser en tant que texture et la fonction les chargera les unes après les autres (grâce à SDL_Image, elle gère donc les formats : TGA, BMP, PNM, XPM, XCF, PCX, GIF, JPG, TIF, LBM, PNG), créera une SDL_Surface suffisamment grande pour toutes les accueillir, collera les différentes images dessus et créera un index dans une structure (voir "structure.h").

Au final, une fois les noms des textures rentré dans le fichier txt, 1 seul appel de glBindTexture(GL_TEXTURE_2D, textures) suffit et les coordonnées des textures seront :

coordonnees_textures[i].haut_gauche.x coordonnees_textures[i].haut_gauche.y
coordonnees_textures[i].haut_droite.x coordonnees_textures[i].haut_droite.y
coordonnees_textures[i].bas_droite.x coordonnees_textures[i].bas_droite.y
coordonnees_textures[i].bas_gauche.x coordonnees_textures[i].bas_gauche.y

i étant le numéro de l'image, 0 correspond à la première dans le fichier.

On peut donc très facilement passer d'une texture à une autre, simplement en changeant la valeur de i.


Quelques remarques :
-J'ai lu que "normalement" OpenGL ne prend que des textures qui on une taille du type : 2^n, j'ai donc mis dans ma fonction de chargement un bout de code qui cherche la puissance de 2 permettant de faire rentrer toutes les images. Aucune idée si c'est nécessaire :p

-La fonction plante si la taille de la surface d'accueil dépasse 8192 x 8192 pixel, il y a déjà moyen de mettre pas mal de textures, mais je préfère vous prévenir.

[CONTRAINTE SUPPRIMEE LORS DE LA MODIFICATION]
-La seule contrainte sur le fichier .txt est qu'il ne doit pas contenir de ligne vierge, même pas à la fin du fichier, car sinon il la lira et ne trouvera pas de fichier correspondant => plantage.

Voili voilou, j'espère que ma fonction sera utile à certains d'entre vous.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

concernant le point (2), il ne faut normalement pas inclure des fichiers .c mais des fichiers .h contenant le prototype des fonctions présentes dans le .c

en faisant cela, la ligne 163 n'est certainement pas une ligne du fichier main mais une ligne du fichier résultant des "include" + le main
Messages postés
26
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
6 mars 2010

tu veux dire que tu as fais :
SDL_Surface **images {NULL}, *surface_d_accueil NULL;
//Allocation dynamique de la taille du tableau de surfaces
images = (SDL_Surface **)malloc((nombre_de_textures) * sizeof(SDL_Surface*));

Quand j'ai cherché de la doc sur le comment utiliser la fonction malloc je suis tombé la dessus :

http://forum.hardware.fr/hfr/Programmation/C-2/cast-malloc-faire-sujet_33909_1.htm

et d'autre part on crée un tableau de surface : images est donc effectivement de type SDL_Surface **, mais chaque élément du tableau que l'ont va créer avec malloc est de type SDL_Surface*.

Donc si tu veux caster malloc tu peux faire la chose suivante :
SDL_Surface **images {NULL}, *surface_d_accueil NULL;
//Allocation dynamique de la taille du tableau de surfaces
images = (SDL_Surface *)malloc((nombre_de_textures) * sizeof(SDL_Surface*));

Et pour ce qui est de la fonction main ? Comme dit il y a 150 lignes, tu as rajouté 4 lignes d'include, ça nous amène a 154, alors pourquoi ton compilateur te dit il qu'il y a une erreur à la ligne 163 ? Tu as rajouté quoi d'autre ?
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

J'ai Ajouté les :
#include ...

Ha et j'ai aussi du ajouter
(int*) et (SDL_Surface**)
aux instructions malloc.

Apparement aucun de vous

????????????????????????????????????????
Pourquoi???????????

Salutations
Messages postés
26
Date d'inscription
mercredi 17 septembre 2008
Statut
Membre
Dernière intervention
6 mars 2010

Si j'ai bien compris il te dit qu'il y à une erreur à la ligne 163 dans le main ?

T'as rajouté autre chose que les includes ? parce que le fichier main.c ne fait que 150 lignes
Messages postés
94
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
1 juin 2013

Salut les Garcs
(Je présise que j'arrive sur la Pointe des Pieds !!)

Je ne veux pas me faire Insulter dans tous les Sens, mais J'ai des Problème de Compilation.

(Code::Block)

(1)
J'ai Installé la SDL (que je n'avais pas) pour compiler ton Code.




(2)
Il faut ensuite que j'ajoute : (dans main)
#include "initialisation_structure_evenements.c"
#include "initialisation_OpenGL.c"
#include "chargement_des_textures.c"
#include "fonction_gestion_des_evenements.c"
pour pouvoir Compiler (?!)

(3)
Il me Reste une Erreur :
C:\main.c|163|error: expected `}' at end of input|



A)
A Quoi (3) est du ???

B)
Existe t il une Ligne de Cde au Compilo pour Evité (2)

Merci.
++
Afficher les 15 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (Jackyzgood)