Loader tga opengl (textures + transparence)

Soyez le premier à donner votre avis sur cette source.

Vue 16 399 fois - Téléchargée 1 261 fois

Description

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 / Exemple :


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

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
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...

++
Messages postés
240
Date d'inscription
vendredi 14 juin 2002
Statut
Membre
Dernière intervention
17 mars 2009

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 :)
Messages postés
78
Date d'inscription
samedi 18 septembre 2004
Statut
Membre
Dernière intervention
5 janvier 2007

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);
Messages postés
240
Date d'inscription
vendredi 14 juin 2002
Statut
Membre
Dernière intervention
17 mars 2009

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.
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
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)
Afficher les 33 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.