begin process at 2010 02 10 07:17:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > LOADER TGA OPENGL (TEXTURES + TRANSPARENCE)

LOADER TGA OPENGL (TEXTURES + TRANSPARENCE)


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Classé sous :TGALoader, OpenGL, texture Niveau :Initié Date de création :13/04/2004 Date de mise à jour :08/10/2007 08:53:28 Vu / téléchargé :12 384 / 999

Auteur : Funto66

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

 Description

Cliquez pour voir la capture en taille normale
Ah ça faisait longtemps que je postais pas de code :)
Donc voilà : c'est une classe qui permet de charger des fichiers au format TGA., qui peut contenir une couche alpha : en clair les pixels de l'image peuvent être transparents ou pas.
Pour utiliser des formats TGA, le mieux est d'utiliser GIMP, Photoshop ou Paint Shop Pro. Vous pouvez aussi utiliser TGA Alpha Edit, une autre de mes sources (un peu de pub :p)

J'ai remarqué que sur CppFrance un loader de TGA est beaucoup utilisé : celui fait par Nate Miller. C'est celui que j'utilisais avant, mais j'ai préféré écrire celui-ci parce que l'autre comportait 2 défauts importants :
1) il n'était pas orienté objet (ce n'est pas un vrai problème en soi mais bon...la POO c'est beau ;))
2) le problème majeur : il ne supportait pas les fichiers TGA compressés.

Mon loader possède les caractéristiques suivantes :
-il est portable
-il est orienté objet
-il supporte les images compressées en RLE ou pas
-les images chargées doivent être 24 bits ou 32 bits.

Je poste juste le header ici, le reste est dans le zip.
Pour tester le programme, faites glisser une texture TGA sur TGA.exe.

***
Changements du 14/04/04 : maintenant on peut préciser au loader le type de filtering que l'on veut utiliser. L'exemple permet de choisir à l'exécution entre pas de filtering, linear filtering, bilinear filtering, trilinear filtering ou anisotropic filtering.
J'ai aussi rajouté les fonction LoadOpenGLTexture() et LoadOpenGLTextureWithID() à destination du programmeur fainéant (on dira "économe de lignes" ça fait mieux :p) qui permettent en un seul appel de charger une texture TGA depuis un fichier et de l'envoyer à OpenGL. On peut aussi bien sûr préciser le type de filtering à ce moment-là.

***
Changements du 17/02/05 : version 1.2 de TGALoader : j'ai rajouté 3 fonctions : LoadFromData(), LoadOpenGLTextureFromData() et LoadOpenGLTextureFromDataWithID() (ouais c'est "un peu" long mais bon j'aime bien quand le nom est explicite :p).
Elles donnent à la classe la capacité de charger des textures depuis un tableau statique C, créé avec le programme bin2h (fourni dans l'archive).
Je m'explique : avec le programme bin2h, on transforme un fichier .tga en fichier .h (si vous ne voyez pas comment l'utiliser, faites un glisser-déposer de votre fichier .tga sur le programme bin2h (que vous aurez compilé), ça vous sortira un fichier .h).
Le fichier .h contiendra un tableau de cette forme : static unsigned char tableau_image[] = {0, 23, 46...etc};.
Lorsque vous passez ce tableau en argument à une des fonctions Load*FromData(), la classe charge l'image, comme elle le fait avec un fichier TGA.

Cela permet d'embarquer vos images dans l'exécutable et non en fichiers "extérieurs" si vous le voulez.

***
Changements du 28/04/05 : version 1.3 de TGALoader.
J'ai enlevé la clause "using namespace std;", qui peut poser des problèmes dans certains codes où ce n'est pas voulu et j'ai rajouté un constructeur de copie et un opérateur d'affectation. Il y a aussi maintenant des projets Dev-C++/FreeGLUT (à utiliser avec le DevPak FreeGLUT sur devpaks.org), ainsi qu'un projet Visual C++/FreeGLUT. FreeGLUT a entre autres l'avantage de nous permettre de nous passer de glut32.dll en linkant la librairie en static.
Ben voilà c'est tout :)

***
Changements du 08/10/07 : version 1.4 de TGALoader.
J'ai juste changé quelques petits trucs dans les sources pour ne plus avoir de warnings lors de l'utilisation avec MinGW au sujet d'une variable non initialisée et de m_width et m_height qui ne sont pas initialisées dans le bon ordre, dans les constructeurs.

Source

  • // TGALoader.h - chargeur de fichiers TGA.
  • // 2004-2007 par Funto. Si vous utilisez cette classe dans un de vos projets, un mail
  • // de remerciement à funto66@gmail.com serait le bienvenu ;).
  • // Version 1.4
  • #ifndef TGALOADER_H
  • #define TGALOADER_H
  • #define TGA_OPENGL_SUPPORT
  • #include <cstdlib>
  • #include <iostream>
  • #include <fstream>
  • #ifdef TGA_OPENGL_SUPPORT
  • #ifdef WIN32
  • #include <windows.h>
  • #endif
  • #include <GL/gl.h>
  • #include <GL/glu.h>
  • #endif // defined TGA_OPENGL_SUPPORT
  • enum TGAErrorCode
  • {
  • TGA_OK,
  • TGA_FILE_NOT_FOUND,
  • TGA_UNSUPPORTED_TYPE,
  • TGA_NOT_ENOUGH_MEMORY
  • };
  • #ifdef TGA_OPENGL_SUPPORT
  • enum TGAFiltering
  • {
  • TGA_NO_FILTER,
  • TGA_LINEAR,
  • TGA_BILINEAR,
  • TGA_TRILINEAR
  • #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
  • ,TGA_ANISOTROPIC
  • #endif
  • };
  • #endif
  • class TGALoader
  • {
  • private:
  • unsigned char* m_data;
  • bool m_loaded;
  • unsigned int m_width, m_height;
  • unsigned int m_bpp; // Bytes Per Pixel : 0, 3 ou 4
  • public:
  • TGALoader();
  • TGALoader(const TGALoader& ref);
  • TGALoader(char* path, TGAErrorCode* error=NULL);
  • ~TGALoader();
  • TGAErrorCode LoadFile(char* path);
  • TGAErrorCode LoadFromData(unsigned char *data);
  • TGALoader& operator=(const TGALoader& ref);
  • #ifdef TGA_OPENGL_SUPPORT
  • GLuint SendToOpenGL(TGAFiltering filtering=TGA_NO_FILTER);
  • void SendToOpenGLWithID(GLuint ID, TGAFiltering filtering=TGA_NO_FILTER);
  • TGAErrorCode LoadOpenGLTexture(char* path, GLuint* pID=NULL,
  • TGAFiltering filtering=TGA_NO_FILTER);
  • TGAErrorCode LoadOpenGLTextureWithID(char* path, GLuint ID,
  • TGAFiltering filtering=TGA_NO_FILTER);
  • TGAErrorCode LoadOpenGLTextureFromData(unsigned char *data, GLuint* pID=NULL,
  • TGAFiltering filtering=TGA_NO_FILTER);
  • TGAErrorCode LoadOpenGLTextureFromDataWithID(unsigned char *data, GLuint ID,
  • TGAFiltering filtering=TGA_NO_FILTER);
  • #endif
  • void Free();
  • inline unsigned char* GetData() {return m_data;}
  • inline bool IsLoaded() {return m_loaded;}
  • inline unsigned int GetHeight() {return m_height;}
  • inline unsigned int GetWidth() {return m_width;}
  • inline unsigned int GetBpp() {return m_bpp;}
  • };
  • #endif // !defined TGALOADER_H
// TGALoader.h - chargeur de fichiers TGA.
// 2004-2007 par Funto. Si vous utilisez cette classe dans un de vos projets, un mail
// de remerciement à funto66@gmail.com serait le bienvenu ;).
// Version 1.4

#ifndef TGALOADER_H
#define TGALOADER_H

#define TGA_OPENGL_SUPPORT

#include <cstdlib>
#include <iostream>
#include <fstream>

#ifdef TGA_OPENGL_SUPPORT
	#ifdef WIN32
	#include <windows.h>
	#endif
#include <GL/gl.h>
#include <GL/glu.h>
#endif // defined TGA_OPENGL_SUPPORT

enum TGAErrorCode
{
	TGA_OK,
	TGA_FILE_NOT_FOUND,
	TGA_UNSUPPORTED_TYPE,
	TGA_NOT_ENOUGH_MEMORY
};

#ifdef TGA_OPENGL_SUPPORT
enum TGAFiltering
{
	TGA_NO_FILTER,
	TGA_LINEAR,
	TGA_BILINEAR,
	TGA_TRILINEAR
#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
	,TGA_ANISOTROPIC
#endif
};
#endif

class TGALoader
{
private:
	unsigned char* m_data;
	bool m_loaded;
	unsigned int m_width, m_height;
	unsigned int m_bpp;	// Bytes Per Pixel : 0, 3 ou 4
public:
	TGALoader();
	TGALoader(const TGALoader& ref);
	TGALoader(char* path, TGAErrorCode* error=NULL);
	~TGALoader();
	TGAErrorCode LoadFile(char* path);
	TGAErrorCode LoadFromData(unsigned char *data);

	TGALoader& operator=(const TGALoader& ref);

#ifdef TGA_OPENGL_SUPPORT
	GLuint SendToOpenGL(TGAFiltering filtering=TGA_NO_FILTER);

	void SendToOpenGLWithID(GLuint ID, TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTexture(char* path, GLuint* pID=NULL,
		TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTextureWithID(char* path, GLuint ID,
		TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTextureFromData(unsigned char *data, GLuint* pID=NULL,
		TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTextureFromDataWithID(unsigned char *data, GLuint ID,
		TGAFiltering filtering=TGA_NO_FILTER);
#endif

	void Free();

	inline unsigned char* GetData() {return m_data;}
	inline bool IsLoaded() {return m_loaded;}
	inline unsigned int GetHeight() {return m_height;}
	inline unsigned int GetWidth() {return m_width;}
	inline unsigned int GetBpp() {return m_bpp;}
};

#endif // !defined TGALOADER_H


 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

08 août 2004 13:26:27 :
* Version 1.1 : grâce à djl (et à gluBuild2DBitmaps :p), on peut maintenant charger des textures dont les côtés ne sont pas forcément des puissances de 2! Bon, ça reste forcément plus moche que si c'était des puissances de 2 mais ça marche :)
17 février 2005 12:52:51 :
Cf présentation du code
28 avril 2005 15:49:27 :
Cf présentation du code.
29 avril 2005 01:54:03 :
Correction d'un bug dans bin2h.c, qui ouvrait le fichier binaire en mode texte...
08 octobre 2007 08:53:28 :
Petites modifs pour ne plus avoir de warnings lorsque l'on utilise TGALoader avec MinGW (et probablement avec GCC)

 Sources du même auteur

Source avec Zip Source avec une capture GÉNÉRATEUR DE LIGHTMAPS À PARTIR D'UNE HEIGHTMAP
Source avec Zip CHARGER UNE DLL DYNAMIQUEMENT (PORTABLE)
Source avec Zip Source avec une capture [OPENGL] LOADER XPM: TEXTURES DANS L'EXE
Source avec Zip Source avec une capture LECTEUR VIDEO OPENGL
Source avec Zip Source avec une capture HEIGHTMAP OPENGL

 Sources de la même categorie

Source avec Zip JEU DE DAMES 3D par vbclaude
Source avec Zip CHARGEMENT DES TEXTURES EN OPENGL par Jackyzgood
Source avec Zip Source avec une capture OPENGL - UN PEU DE NEIGE... par underprog
Source avec Zip Source avec une capture JEU DE LA VIE 3D OPENGL AVEC GESTION SOURIS par fratleym
Source avec Zip Source avec une capture SPEAD RACER par jngl

 Sources en rapport avec celle ci

Source avec Zip CHARGEMENT DES TEXTURES EN OPENGL par Jackyzgood
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 MOTEUR 3D ISOMÉTRIQUE EN OPENGL par Mattpbem
Source avec Zip Source avec une capture DU TEXTE SUR UNE TEXTURE OPENGL par Arnaud16022

Commentaires et avis

Commentaire de Funto66 le 13/04/2004 18:39:43

Postez des commentaires svp

Commentaire de cppdupdup34 le 13/04/2004 19:19:05

peut etre me trompes-je mais pourquoi tu utilises des inline
le code n'a pas specialement besoin d'etre rapide (ce qui je crois est le but de inline)

j'aurais plutot mis  inline pour l'envoi de la texture a openGL

---&gt; #include &lt;windows.h&gt;
et mais c'est pas portable ton code :p  
ban ben je, enfin on vas mettre ton loader de tga a l'epreuve ;-)

code bien

Commentaire de Funto66 le 13/04/2004 19:34:54

Si tu regardes bien les seules fonctions mises en inline sont les GetXX et IsLoaded(), elles ne tiennent qu'en une seule ligne. Donc plutôt que de faire un "vrai" appel à chaque fois qu'on les utilise, le compilateur les remplace par ce qu'il y a dans le "return". Ca ne prend pas plus de place et ça va plus vite.
C'est un réflexe d'optimiser quand c'est possible ;)

Pour ce qui est de la portabilité : mon code est portable. Selement, le #include &lt;windows.h&gt; est là parce que la compilation l'exige. C'est dû au fait que les déclarations des fonctions OpenGL sont du style :
WINGDIAPI GLvoid glVertex2i(GLint x, GLint y);
et WINGDIAPI est défini dans &lt;windows.h&gt;.

Sinon, le code en lui-même n'utilise rien de windows.h, et le #include est placé dans un #ifdef. Donc la compilation sous Linux ne devrait pas poser de problème, bien que je n'aie pas essayé.

PS : j'ai oublié de préciser : mon code d'exemple utilise GLUT, il vous faudra glut32.dll pour l'exécuter.

Commentaire de Kirua le 13/04/2004 20:22:16

"...la POO c'est beau ;))"
OUIIIIIIIIIIIIIIIIIIIIIIIIIII on est bien d'accord, la POO c'est ESTHETIQUE.

Après mes petites excentricités (pardon aux familles tt ça)

Voyons, première remarque: très propre :-)
La classe n'est pas "limitée" à OpenGL, puisque les données sont chargées et puis traitées selon le besoin. Ce qui veut dire que si je crée ma lib graphique ton code est utilisable, cool ^_^

"g_ID_texture = tga_loader.SendToOpenGL();
tga_loader.Free();"

idée:
C'est pas long à faire, permettre de définir la qualité de la texture via une méthode inline. (et définis toi même des constantes BAS/MOYEN/HAUT, parce que je retiens jamais les noms OpenGL ^^)

Le code est très propre (très beau ^^), mais si j'étais toi je créerais une structure TGAHeader. Tu mets les propriétés dans l'ordre et tu surcharges l'opérateur &gt;&gt;. Comme ça l'esthétisme est poussé jusqu'au bout: (avec file un objet fstream)
file &gt;&gt; MonEnTeteTGA;

et puis à patir de l'en-tête comem c une structure les propriétés sont nommées, et tu dois plus commenter: le code parle de lui-même. (c clair?)

Suis déçu que tu aies utilisé malloc et free... au diable la vieille école, utilise new/delete :-)

"if (origin_non_bottom_left)" ça c le genre de saleté qui casse la tête ^^ c'est bien géré ;-)

valaaa, à toi la parole.

Ah, puis si tu pouvais expliciter les commandes préprocesseurs du header, je comprends pas trop l'utilité du windows.h, ciao ;-)

Commentaire de Kirua le 13/04/2004 20:24:20

Ah, désolé, j'ai été manger pdt que j'écrivais le message, dc j'ai pas vu que tu avais répondu à la question du windows.h

Commentaire de Kirua le 13/04/2004 20:32:36

Voici une fonction que je trouve intéressante à ajouter dans le bloc "#ifdef TGA_OPENGL_SUPPORT"

TGAErrorCode LoadOpenGLTexture(char* path, GLuint id)
{
TGAErrorCode ret = LoadFile(path);
if(ret == TGA_OK)
{
  SendToOpenGLWithID(id);
  Free();
}
return ret;
}

Commentaire de Funto66 le 13/04/2004 20:47:10

"C'est pas long à faire, permettre de définir la qualité de la texture via une méthode inline. (et définis toi même des constantes BAS/MOYEN/HAUT, parce que je retiens jamais les noms OpenGL ^^)"
Ben moi non plus je connais pas le nom des constantes lol (les GL_NEAREST et tout ça...). Mais de toutes façons quand t'as loadé la texture, t'as même pas besoin de faire un glBindTexture2D(), c'est déjà celle-là qui est en cours, donc c'est vraiment, vraiment de la fainéantise ! :p Bon mais si tu veux je vais l'implémenter ;)

Pour l'idée de l'en-tête (structure TGAHeader), franchement je vois pas trop l'utilité, à part pour un code plus beau...Mais ce serait une structure/classe (avec un opérateur surchargé, ça se rapproche d'une classe) qui ne serait utilisée que dans ce loader, donc ce ne serait pas une classe réutilisable.
Je suis parti du concept que celui qui lit le code source et veut le comprendre sait comment est organisé un fichier TGA.
En plus, c'est plus optimisé d'utiliser un tableau header[].
Enfin c'est une question de préférence ^^, et tant que ça marche ça j'y touche pas :p

Au sujet de malloc()/free() : j'ai préféré utiliser ça parce que ça ne dépend pas d'un runtime, et il me semble que new[]/delete[] par contre si, mais encore une fois je n'en suis pas sûr du tout. Et puis aussi j'étais pas sûr de la syntaxe avec delete[], s'il faut parcourir tout le tableau, mais il me semble que non, j'en suis presque sûr.
Aussi, la différence entre new/delete et malloc/free c'est que new/delete appellent les constructeurs et destructeurs des objets créés/détruits, or là mes objets étant des unsigned char, je n'en avais pas besoin.

""if (origin_non_bottom_left)" ça c le genre de saleté qui casse la tête ^^ c'est bien géré ;-)" Ben en fait non lol, la meilleure façon de le gérer aurait été de faire ça dès le "loadage" dans m_data[]. Mais comme j'arrivais pas j'ai préféré faire un flip vertical ensuite. Ca prend un petit plus de temps au chargement. D'ailleurs si je me rappelle bien c'est toi qui m'avais aidé pour ça non? ;)

pour ta fonction LoadOpenGLTexture(), en fait j'y avais déjà pensé mais j'avais la flemme de l'implémenter. Donc je vais faire ça maintenant, et aussi une version qui n'oblige pas à spécifier soi-même l'ID de la texture.

Commentaire de djl le 13/04/2004 23:26:27

les ascesseurs definis dans le corps de la classe sont inline par defaut, c'est redondant de le rajouter
ca serait cool comme dit kirua de passer le filtrage de la texture en parametre (indispensable pour la 3d)
genre creer un type enum avec NEAREST, BILINEAR, TRILINEAR, ANISOTROPIC, opur anisotropic il te faut l'entete glext.h pour les extensions opengl

sinon c'est cool ta classe, tu devrai faire une classe qui load different type de fichier ca serais encore mieux ;)
bonne chance

Commentaire de Funto66 le 14/04/2004 18:30:55

" les ascesseurs definis dans le corps de la classe sont inline par defaut, c'est redondant de le rajouter" ouais c'est vrai mais j'en étais pas sûr...Je trouve que c'est plus explicite c'est tout.
Sinon pour l'enum ben je pense que je vais mettre ça en paramètres facultatifs, mais sans créer d'enum propre, en passant les constantes d'OpenGL. Comme ça celui qui n'aura pas glext.h par exemple n'aura pas de problème, et si jamais un nouveau filtrage est inventé j'aurai rien à updater.
"tu devrai faire une classe qui load different type de fichier ca serais encore mieux ;)" Ben là désolé mais non, je n'ai besoin que de ce format-là, et étudier les autres formats est très long. A la base j'ai créé cette classe pour un autre projet qui, s'il se finit, arrivera sur CppFrance.

Voilà, je vais prendre en compte vos remarques ;)

Commentaire de djl le 14/04/2004 19:38:44

oui c'est vrai, moi en ce moment je me suis mi a utiliser devil, parce que c'est pratique de  charger des image jpeg, mais si on commence a devenir dependant de ce genre de bibliotheque la c moin cool

pour les acsesseur , tu peut par exemple les definirs dans le .h (apres le corps) et les specifier inline (ca se fait beaucoup, genre dans les entetes standard du c++)

Commentaire de Funto66 le 14/04/2004 20:02:15

Moi aussi j'utilisais DevIL, mais en fait le gros problème avec cette librairie c'est que personne (du moins je n'en connais pas) n'a réussi à la compiler avec Dev-C++. Et beaucoup de personnent utilisent Dev-C++...
Pour les accesseurs, je trouve que ça fait perdre du temps (et des lignes) de les déclarer pour les implémenter plus tard dans le même fichier, alors qu'ils tiennent en une ligne...

Pour ça, il faut reconnaître, c'est un des rares avantages du C# par rapport au C++ : les accesseurs font partie intégrante du langage (genre int m_membre set get et ensuite on accède au membre via des accesseurs).

Commentaire de Cyberboy2054 le 14/04/2004 21:15:38

Ma ptite participation pour le filtrage .. Chuis très flemmard, alors va falloir que tu modifie pas mal ;)
// enum minimum
enum K2D_Filtering
{
K2D_NO_FILTER=0,
K2D_LINEAR,
K2D_BILINEAR,
K2D_TRILINEAR,
K2D_ANISOTROPIC_TRILINEAR_FILTERING
};
/* faut modifier la fonction
En definissant une valeur par défaut, on est pas obligé de mettre ce parametre : on peut appeler LoadFile ("machine.tga"); sans problemes, le type de filtrage sera biliénéaire
*/
TGAErrorCode LoadFile (char* strFileName, K2D_FilteringType=K2D_BILINEAR);
/*
puis dans la generation
*/
   switch(iType)
{
case K2D_NO_FILTER: glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
break;


case K2D_LINEAR: glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
break;

case K2D_BILINEAR: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
break;

case K2D_TRILINEAR: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
break;
}

Bon ok c est un peu le bordel ... mais j avais la flemme de mettre un code complet.
Sinon, au passage, c est pas parceque tu mets inline que le compilateur optimisera ta fonction, ya qu a regarder le code asm généré ... c est juste une manière de lui dire que tu voudrais bien qu elle le soit. De plus, la plupart des fonctions déclarées dans les headers sont mises en inline meme si on ne le précise pas.

Commentaire de Funto66 le 14/04/2004 21:24:18

Je viens juste de poster le code modifié avec la gestion des différents filterings, mais j'ai préféré ne pas mettre d'enum...
Mais là je vois que vous êtes 3 à penser qu'il en faudrait un...
Bon, je vais donc me plier à la majorité (et d'ailleurs vous avez certainement raison) : je vais remodifier mon code...

Commentaire de Funto66 le 14/04/2004 22:49:02

Nouvelle version !
Cette fois-ci j'utilise l'enum tant demandé.
GLuint ID;
tga_loader.LoadOpenGLTexture("texture;tga", &ID, TGA_BILINEAR);
et une texture est chargée :)

Cyberboy &gt;&gt; Désolé mais j'ai pas gardé le préfixe K2D, j'ai mis TGA...

Y'a un truc qui me fait marrer chaque fois que j'uploade une source sur CppFrance, c'est ce qui est écrit en bas à droite :
"Etes-vous sûr de l'orthographe de votre source ?
Avant de valider jettez un dernier p'tit coup d'oeil ;-)"

Pour ceux qui ne l'ont pas vu, vérifiez l'orthographe de "jettez"...:p

Commentaire de Cyberboy2054 le 15/04/2004 00:13:15

Oué heureusement que t as viré le K2D, c est le préfixe qu il y a dans mon moteur :) (que je posterais ... un jour ... quand il aura suffisament avancé...)
Bon sinon une idée qui, je l espere, sera constructive.
La, ton code supporte le format tga. pas de chance, t as envie d implementer un super bel effet de la mort qui tue, mais il faut obligatoirement passer par un fichier .bmp.
bon ca c est le scénario. En pratique, t as envie d étendre ton code pour supporter d autres formats : hé ben pas de chance, tu dois réécrire les fonctions d envoi a opengl dans cette nouvelle classe.
bon en fait c est trop long a expliquer la, alors jvais coder et le truc et jte l envoie.

Commentaire de Funto66 le 08/08/2004 13:29:44

Yup, nouvelle version, que j'ai baptisée 1.1 :p
Grâce à un msg sur le forum de djl, on peut maintenant charger des textures dont les côtés ne sont pas des puissances de 2 :)
Pour tester, vous pouvez faire glisser "avion_non_pow2_rle.tga" sur TGA.exe, vous verrez, c'est un peu moche parce que l'image est redimensionnée par GLU masi ça marche :)

Commentaire de djl le 08/08/2004 18:31:07

j'ai pas le temps de tester (j'ai pas glut), mais  l'image, ca  te la fout carré aussi ou ca redimensionne juste chaque coté à la puissance de 2 la plus proche ?

Commentaire de Funto66 le 09/08/2004 01:06:24

Je comprends pas exactement la question...
Ce que je peux te dire c'est qu'au final l'image est chargée comme une image de côté 2^n; gluScaleImage() (utilisé en interne par gluBuild2DMipmaps()) apparemment arrondit jusqu'à la puissance de 2 la plus proche mais, et je sais pas comment fait GLU, les coordonnées de texture sont les mêmes que si les images de côté non-2^n étaient supportées (comment dans OpenGL 1.5)...

Commentaire de _Thy_ le 25/08/2004 20:24:28

Help wanted :
Si j'incorpore ce loader dans mon projet,  j'ai des caisses de msg d'erreur à la compilation, alors que sans l'include, j'ai même pas un warning ..
Le 1er msg :
46 C:\Dev-Cpp\include\c++\bits\locale_facets.tcc:41,               from C:\Dev-Cpp\include\c++\locale
In file included from C:/Dev-Cpp/include/c++/bits/locale_facets.tcc:41,               from C:/Dev-Cpp/include/c++/locale

Le dernier :
C:\Documents and Settings\thy\Mes documents\_projets_devcpp\br3d\Makefile.win
[Build Error]  [_MAIN.o] Error 1

J'utilise devcpp 4.9.8.10, si ça peut servir...

Commentaire de Funto66 le 26/08/2004 01:09:07

dsl les erreurs que t'as recopiées là ne peuvent pas m'aider vraiment; tu pourrais me les envoyer en entier si possible à funto [at] nomade.fr stp (sinon ben une capture d'écran lol), je verrai ce que je peux faire ^^ (normalement ça compile aussi avec Dev-C++).

Commentaire de gimli123 le 24/10/2004 17:49:48

J'ai essayer de charger une image avec cette lib et voici le raport de visual :
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\stdlib.h(256) : error C2381: 'exit' : redéfinition ; __declspec(noreturn) est différent
        c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\GL\glut.h(146) : voir la déclaration de 'exit'
c:\documents and settings\propriétaire\mes documents\visual studio projects\tga\main.cpp(49) : error C2664: 'TGALoader::LoadOpenGLTexture' : impossible de convertir le paramètre 2 de 'int' en 'GLuint *'
        La conversion d'un type intégral en type pointeur nécessite reinterpret_cast, un cast de style C ou un cast de style fonction

Je suis debutant et je ne sais pas du tout ceque ça veut dire

Commentaire de gimli123 le 24/10/2004 18:56:54

Re j'ai trouver la solution :D
il faut inclure glut.h apres tgaloader.h
voila sinon excelent !!

Commentaire de Funto66 le 17/02/2005 12:56:11

Merci :) (dsl j'avais jamais vu ton commentaire alors chuis "un peu" en retard :p)

Nouvelle version !
TGALoader 1.2 permet, comme l'explique la présentation du code, de charger des images embarquées directement dans l'exécutable, grâce aux fonctions du type Load*FromData().
J'ai aussi mis un exemple et le programme bin2h qui permet de transformer un binaire en fichier textuel pouvant être "#includé" dans une source.
Pour ceux que ça intéresse...;)

Commentaire de Tsun le 01/03/2005 10:36:23

Tres bonne librairie, vraiment complete.
De plus le code est tres propre, j'adore!!!

Juste une precision, si on veut l'utiliser avec OpenGL,
il faut prealable avoir un context OpenGL...
C'est a dire qu'il faut l'utiliser apres le "glutCreateWindow()".

J'ai eu le malheur de vouloir m'en servir avant cette fonction
et a chaque fois, "gluBuilt2DMipmaps()" plantait puisqu'il lui
manquait le context OpenGL.
(j'y ai passé 2 jours avant de comprendre :'( )

Bonne continuation

Commentaire de Funto66 le 01/03/2005 20:06:29

Merci ça fait plaisir de voir que mon travail et apprécié et sert à qq1 :)

Commentaire de Funto66 le 28/04/2005 15:51:35

Nouvelle version 1.3, quelques changements minimes; Cf la présentation du code pour ceux que ça intéresserait ;)

Commentaire de Mattpbem le 13/10/2005 19:12:25

Merci Beaucoup pour le code: je me suis permis d'en faire une Version Bmp qui s'appelle donc BmpLoader et je trouvais que le tableau m_data n'était vraiment pas pratique à utiliser donc j'ai crée une Fonction GeneratePixMap qui transforme le tableau m_data[données] en Pixmap[channel(R,G,B et A,Position X,Position Y)

Commentaire de Mattpbem le 13/10/2005 19:17:19

j'ai oublié de donnée le lien
http://matt2000.free.fr/prog/BmpLoader.rar

Commentaire de Funto66 le 24/10/2005 01:52:47

Héhé bah ça peut être sympa :) Par contre reste peut-être des printfs en trop non?

(dsl de répondre si tard mais j'ai pas touché un PC depuis si longtemps...prépa oblige)

Commentaire de psykocrash le 04/01/2006 20:16:11

Salut :)
Bah moi j'arrive pas à l'utiliser cette classe, et c'est pas faute d'avoir essayer..
Est ce qu'il serait possible d'avoir un exemple "SIMPLE" (:p) d'utilisation ? Genre une application qui charge une texture 2D et l'affiche au milieu de la fenêtre.
Ce serait vraiment sympa de votre part parce que je sèche là dessus depuis quelques jours, et je pense que ça servira à plusieurs débutants en graphisme comme moi.
Merci d'avance,
Psykocrash.

Commentaire de gimli123 le 05/01/2006 18:32:31

void ChargerTGA(char *Chemin, int id)
{
TGALoader tga_loader;
        tga_loader.LoadOpenGLTextureWithID(Chemin, id, TGA_LINEAR);
}

tu fais genre ensuite avant de dessiner : ChargerTGA("mon_image.tga", 1);
Sinon voici une fonction pour dessiner que j'avais faite, que je recopie telle qu'elle ...

void Dessiner(ind Id, int X, int Y, int Largeur, int Hauteur, int X_src, int Y_src, int Largeur_src, int Hauteur_src, float Transparence)
{
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1.0f, 1.0f, 1.0f, Transparence);

glBindTexture(GL_TEXTURE_2D, Id);
    glBegin(GL_QUADS);
    glTexCoord2d(X_src, Y_src);
    glVertex2i(X, Y);
    glTexCoord2d(X_src + Largeur_src, Y_src);
    glVertex2i(X+Largeur, Y);
    glTexCoord2d(X_src + Largeur_src, Y_src + Hauteur_src);
    glVertex2i(X+Largeur, Y+Hauteur);
    glTexCoord2d(X_src, Y_src + Hauteur_src);
    glVertex2i(X, Y+Hauteur);
    glEnd();

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
}

pour dessiner donc par exemple ton image tu fais :
Dessiner(1, 0, 0, 100, 100, 0, 0, 1, 1, 1);

Commentaire de psykocrash le 06/01/2006 01:13:03

Ca ne marche pas... Ca me dessine un carré effectivement, sauf qu'il est vide :/ (blanc).
Je met mon code source ici, si quelqu'un peut me dire où je me suis planté ça m'aiderais :)

//----------------------------------------
#ifdef WIN32
    #include <windows.h>
#endif
#include <stdio.h>
#include <gl/gl.h>
#include <gl/glut.h>
#include <TGALoader/TGALoader.cpp>
#define TEXTURE_HERO 1

void Display(void);
void Reshape(int, int);
void ChargerTexture(char *Chemin, int id);
void DessinerTexture(int Id, int X, int Y, int Largeur, int Hauteur, int X_src, int Y_src, int Largeur_src, int Hauteur_src, float Transparence);

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(50, 50);
    glutCreateWindow("Fenetre OpenGL");

    ChargerTexture("C:\\hero.tga", TEXTURE_HERO);
    
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    
    glutMainLoop();
    
    return 0;
}

void ChargerTexture(char *Chemin, int id)
{
    TGALoader tga_loader;
    tga_loader.LoadOpenGLTextureWithID(Chemin, id, TGA_LINEAR);
}

void DessinerTexture(int Id, int X, int Y, int Largeur, int Hauteur, int X_src, int Y_src, int Largeur_src, int Hauteur_src, float Transparence)
{
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(1.0f, 1.0f, 1.0f, Transparence);
    
    glBindTexture(GL_TEXTURE_2D, Id);
        glBegin(GL_QUADS);
        glTexCoord2d(X_src, Y_src);
        glVertex2i(X, Y);
        glTexCoord2d(X_src + Largeur_src, Y_src);
        glVertex2i(X+Largeur, Y);
        glTexCoord2d(X_src + Largeur_src, Y_src + Hauteur_src);
        glVertex2i(X+Largeur, Y+Hauteur);
        glTexCoord2d(X_src, Y_src + Hauteur_src);
        glVertex2i(X, Y+Hauteur);
        glEnd();
    
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
}


void Display()
{
    glClearColor(0,  0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    
    DessinerTexture(TEXTURE_HERO, 0, 0, 100, 100, 0, 0, 1, 1, 1);
        
    glFlush();
}

void Reshape(int width, int height)
{
    glViewport(0,0,width,height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float L;
    float H;
    if (width <= height)
    {
     H=(GLfloat) (10*height/width);
     L=10.0;
    }
    else
    {
     H=10.0;
     L=(GLfloat) (10*width/height);
    }
    gluOrtho2D(-L/2,L/2,-H/2,H/2);
}
//---------------------------------

Merci :)

Commentaire de Funto66 le 28/01/2006 17:12:03

J'ai rajouté un glEnable(GL_TEXTURE_2D);, changé la taille de ton carré de 100x100 en 2x2, chargé la texture test_coucou_rle.tga et ça marche...

Je t'envoie le prog corrigé par mail, si ça te sert encore...

++

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

texture opengl [ par lapal ] salutje dois texturer une partie d' un fond marin(celui-ci etant affiche avec pleins de petits triangles). je n'arrive pas a texturer seulement une p problème de texture opengl [ par kidpigeyre ] J'ai beau regardé je ne trouve pourquoi l'affichage de ma texture ne marche pas, Pouvez-vous m'aider?J'ai commenté au max mon projet pour qu'il soit c lire la couleur d'un point d'une texture opengl [ par kawito ] Bonjour,j'ai crée des texture opengl a partir de fichier TGA.une fois les textures crées comment puis je reccuperer les information d'un pixel de la t texture opengl [ par smoove5198 ] bonjour, me suis remi sur un petit projet utilisant opengl et en essayant d'afficher des textures j'ai eu aucun résultat... mon problème c'est que je Couleur et texture en opengl [ par smoove5198 ] bonjour, je suis un peu newbie en opengl et je n'ai toujours pas bien compris comment faire pour colorer les objets qu'on affiche sans que cela influ [Opengl] Texture disparait [ par goutbouyo ] Salut,Lorsque je m'éloigne trop d'un mur que j'ai créée il disparait.Vous me direz que c'est normal, mais là en fait je suis pas beaucoup éloigné qua [OpenGL]Ajuster texture à l'objet [ par goutbouyo ] Salut,Je prend un texture MUR.BMPLorsque je la "colle" sur un rectangle de 50*50 ça va.Mais si je la colle sur un rectangle de 10*50 elle est toute dé Besoin d'Aide en C++/OpenGL pour RTS 3D [ par ionstorm356 ] Bonjour tout le monde, je cherche des programmeurs en C++ (API Windows sans MFC) et OpenGL, motiver pour participer à un VRAI projet de Real Time Stra Redimensionner un tableau [ par gilimcce ] Je dois plaquer une texture sur un corps quelconque, sous OpenGL.Je dispose d'une image jpeg de 1440*720 ou tout format quelconque.OpenGL nécessite un opengl texture [ par niketou ] Salut a tous.Quelqu'un peu m'expliquer comment appeler et appliquer une texture en format .bmp svp.avec un exemple si possible.Merci.


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 0,546 sec (3)

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