begin process at 2012 05 27 14:16:50
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > CHARGEMENT DES TEXTURES EN OPENGL

CHARGEMENT DES TEXTURES EN OPENGL


 Information sur la source

Note :
1 / 10 - par 1 personne
1,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Classé sous :texture, textures, chargement, OpenGL Niveau :Débutant Date de création :18/01/2010 Date de mise à jour :21/01/2010 12:45:27 Vu / téléchargé :2 999 / 144

Auteur : Jackyzgood

Ecrire un message privé
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

 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=tec hniques#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.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

19 janvier 2010 23:36:49 :
MODIF : la fonction ne génère plus d'erreur de segmentation si on ne l'utilise pas correctement. Vous pouvez maintenant même enlever le fichier texte ou mettre des noms qui n'ont aucun rapport avec les images que vous voulez chargez. Ceci dit, il est quand même plus naturel de n'envoyer que les paramètres nécessaires à la fonction.
21 janvier 2010 12:45:28 :
correction de 2 petites erreurs concernant la taille de la texture finale

 Sources du même auteur

Source avec Zip DECOUPAGE DE SPRITES

 Sources de la même categorie

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy
Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip Source avec une capture CLASSE AVEC OPENGL - OBJETS 3D ET ANIMATIONS par rasta63
Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec Zip CUBE 3D GLUT32 VC++ ET DEVC++ par bobby03

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture EDITEUR DE MAP 2D ISOMÉTRIQUE par F0ra
Source avec Zip DOOM LIKE EN OPENGL EN LANGAGE C AVEC LA BIB GLUT par kled
Source avec Zip Source avec une capture DÉBUT DE MOTEUR 3D par CyberP
Source avec Zip Source avec une capture DU TEXTE SUR UNE TEXTURE OPENGL par Arnaud16022
Source avec Zip Source avec une capture LOADER TGA OPENGL (TEXTURES + TRANSPARENCE) par Funto66

Commentaires et avis

Commentaire de shenron666 le 19/01/2010 17:38:39

une application qui plante ? 0/10
tester la présence d'un fichier c'est pas possible ?
l'échec de l'ouverture ?
ou tout simplement savoir qu'une chaine est vide ?
je ne vais pas noter pour pas paraitre méchant ^^

concernant la taille maximale de texture, un petit "glGetIntegeri" avec pname=GL_MAX_TEXTURE_SIZE et tu connaitras la taille maximale de texture que tu peux générer
par contre ça ne devrai pas planter, tester l'échec de création de la texture c'est aussi possible

Commentaire de Jackyzgood le 19/01/2010 18:10:04

L'application fonctionne très bien, en l'exécutant en mode console vous pourrez voir ou se situe le problème. J'ai placé pas mal de printf pour connaitre l'avancement des différentes étapes.

En temps normal, la console doit vous renvoyer le message suivant :

nombre de textures : 3
rouge.jpeg   texture chargée
bleu.jpeg   texture chargée
vert.jpeg   texture chargée
largeur totale arrondie : 256.000000
hauteur max : 64.000000  resultat : 64.000000
hauteur totale arrondie : 64.000000


Vous avez donc le nombre de lignes dans le fichier, les noms des images et si le chargement s'est bien déroulé, et la taille de l'image d'accueil, qui ne pose pas de problème tant qu'elle ne dépasse pas 8192 x 8192

***************************************************************

En cas de problème la console vous renvoie la chose suivante :

nombre de textures : 4
rouge.jpeg   texture chargée
bleu.jpeg   texture chargée
vert.jpeg   texture chargée
   problème de chargement de texture
Erreur de segmentation


On voit très bien que la fonction va chercher à lire 4 textures, or il n'y a que 3 noms dans le fichier, la dernière image ne pouvant être chargé (car aucune image ne porte ce nom là) elle produit une erreur de segmentation et le programme s'arrête.

Je vous rappel ceci :

-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.

Commentaire de Jackyzgood le 19/01/2010 18:27:56

Si jamais les messages d'erreurs affichés ne sont pas ceux que j'ai cité je veux bien un copie.

Commentaire de shenron666 le 19/01/2010 21:57:29

je ne dois pas bien parler français alors je me répète autrement : une application NE DOIT PAS PLANTER
il faut GERER les erreurs, pas laisser des erreurs de segmentation en disant c'est normal il y a une contrainte à respecter

Commentaire de Jackyzgood le 19/01/2010 22:34:31

Si je te suis alors ce n'est pas normal que ce code plante :

int a = 0;
images[i] = IMG_Load( a );

??

La fonction que j'ai codé est un outil, ce n'est de loin pas une application finale, et comme tout outils il y a une notice d'utilisation. Ne pas mettre de tournevis dans une prise électrique, ne pas mettre de chat dans le micro onde...

Je ne suis pas un professionnel en programmation, je le reconnais (c'est d'ailleurs pour ça que ce code se trouve en section débutant), mais je vais faire en sorte que cet outil soit le plus pratique possible.

Commentaire de shenron666 le 20/01/2010 14:52:08

le code que tu donnes ne plantera pas car... il ne compilera pas
IMG_Load attend un paramètre de type "const char*" pas un "int"

le problème n'est de toute façon pas IMG_Load
cette fonction ne plante pas, si l'image n'existe pas ou si le paramètre est invalide elle retourne NULL

le pire c'est que tu le gère dans ton programme :
#  if(images[i] != NULL)
# {
# printf(" texture chargée\n");
# numero_de_texture_valide[i] = 1;
# }
# else{printf(" problème de chargement de texture\n");}

sauf que printf ne suffit pas
si image[i] est laissé à NULL il faut le gérer
ou alors quitter le programme si une texture ne peut être chargée
mais pas le laisser planter

Commentaire de Jackyzgood le 20/01/2010 15:21:41

Dis moi, tu le fais exprès là ?

T'as pas vu la modif ?

Petit récapitulatif rien que pour toi :


19 janvier 2010 23:36:49 :
    MODIF : la fonction ne génère plus d'erreur de segmentation si on ne l'utilise pas correctement. Vous pouvez maintenant même enlever le fichier texte ou mettre des noms qui n'ont aucun rapport avec les images que vous voulez chargez. Ceci dit, il est quand même plus naturel de n'envoyer que les paramètres nécessaires à la fonction.


La prochaine fois regarde un peu avant de commenter.

Commentaire de shenron666 le 20/01/2010 18:36:49 1/10

hé ho du calme gamin, premièrement je ne fait que répondre à ton commentaire
si c'est pour me prendre de haut, à l'avenir je te laisserai te débrouiller tout seul
d'ici là, apprends à programmer correctement

Commentaire de Jackyzgood le 20/01/2010 19:02:50

Tu sais je suis pas idiot, quand tu m'as dis la première fois qu'il fallait gérer les erreurs j'avais compris, j'ai même mis à la fin de mon post :

"je vais faire en sorte que cet outil soit le plus pratique possible."

Puis tu reviens passer une couche, en citant le code rectifié en plus, et en me disant qu'il ne faut pas laisser planter...

Ce n'est pas moi qui te prends de haut, je ne te prends pas pour un abruti, je t'ai écouté et j'ai rectifié la fonction en conséquence !!

Commentaire de Gilliard le 21/01/2010 09:47:01

Eh cool les gars, le but n'est pas de faire un combat verbal !
Bien sûr, un programme ne devrait jamais planter, d'accord. Mais qui a déjà rencontré même un professionnel qui n'oublie pas de traper un problème quelconque ? En tout cas pas moi, et ça fait 34 ans que je programme. Et faire un programme vraiment "fail-safe", ça demande beaucoup de temps ... c'est ce qui différencie (enfin, devrait différencier) un programme commercial d'un "bout de code" proposé par un amateur sur un forum.
Ceci dit, en effet, l'amateur devrait aussi récupérer au moins les cas qu'il a détectés.
(A propos, moi, je met toujours un "default" après le dernier "case" d'un "switch" ... ne serait-ce que pour le jour où je modifie mon programme sans me souvenir des détails !)

Commentaire de shorzy le 25/01/2010 13:20:28

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.
++

Commentaire de Jackyzgood le 25/01/2010 15:49:18

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

Commentaire de shorzy le 25/01/2010 22:00:30

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

Commentaire de Jackyzgood le 25/01/2010 22:27:49

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 ?

Commentaire de shenron666 le 25/01/2010 22:43:53

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

OpenGL: problemes des textures [ par dletozeun ] bonjour,dans mon projet actuel sous devcpp j'affiche un objet 3D avec opengl en utilisant  GL_TRIANGLE_STRIP pour optimiser la vitesse d'affichag Transition progressive de textures en OPENGL [ par CausPupus ] En OPENGL tout le monde connait la magnifique gestion des couleurs de l'api notamment le mixage des couleurs qui permet d'avoir un dégradé e Les textures en OpenGL [ par fireuo ] Bonjour je vien de commencer en OpenGl et après beaucoup de travail j'ai réusie a faire apparaitre un Mesh avec une texture de gazon. Mais m OpenGL et textures [ par Jackyzgood ] Bonjour à tous ! Maintenant que je commence à être à l'aise en SDL, je me suis dis : ça pourrait être bien de passer à l'OpenGL. J'ai suivis un tuto Application de textures [ par mohdaef ] Bonjour, j'utilise OpenGL dans une application 3D, et j'ai un soucis pour appliquer une texture, j'utilise la fonction glTexCoord2d() pour spécifier pipeline opengl [ par fleurdelys77 ] Salut à tous, j'ai une image en entré après avoir exécuté un calcule j'extrairais des parties de cette image (un ensemble de triangle dispersé) et je [Débutant][OpenGL ES] Problème affichage textures [ par Niicoo ] Bonjour tout le monde,Je dois faire un jeu en OpenGL ES (Objective-c) pour IPhone.Je dois afficher une texture sur un carré (2D). Ça pas de soucis, j' OpenGL; transparence des png assombrie [ par choucroute987 ] Bonjour, Je me permet de poster dans la section C étant donné que l'OpenGl est peut utilisé avec d'autres langages... Je suis en train de développer c++, opengl, charger image pour texture [ par profiter ] bonjour je travaille avec opengl avec visual studio 2010 je dessine une scene en 3D je veux utiliser des images .png ou .jpeg ou .gif comme texture j' Problème d'affichage de texture [ par Turok ] Bonjour,Alors voila le problème est simple, voici un code que j'utilise pour afficher une simple image 2d en utilisant OpenGl et SDL, mais celui ci ne


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales