begin process at 2010 02 10 11:24:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > AFFICHER UN BITMAP EN OPENGL

AFFICHER UN BITMAP EN OPENGL


 Information sur la source

Note :
Aucune note
Catégorie :OpenGL Niveau :Débutant Date de création :29/06/2003 Date de mise à jour :02/11/2003 11:56:49 Vu / téléchargé :2 753 / 347

Auteur : cppdupdup34

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

 Description

ce code composé de 2 fonction permet l'affichage d'images au format "bmp" dans un code openGL (glut necessaire). ne soyez pas rebuter par la longueur du code. ce que vous aurez a fairte tient en deux lignes.  

pensez a faire des bmp de dimension 2^n de large et 2^b de large

Source

  • #include <stdio.h>
  • #include <gl/glut.h>
  • #include <iostream.h>
  • //PLACEZ LE CODE SUIVANT AU DEBUT DE VOTRE PROJET.
  • struct PropPicture {
  • unsigned char Header[0x36];
  • GLuint DataPos,DataSize;
  • GLint Components;
  • GLsizei Width,Height;
  • GLenum Format,Type;
  • GLuint Name[1];
  • unsigned char *Data;
  • };
  • //######################################
  • //definissez le nom des images a charger.
  • //exemple:
  • PropPicture palmier;
  • PropPicture balle;
  • //######################################
  • //Cette fonction se charge de recuperer l'image dans le fichier
  • // tout n'est pas de moi. Merci Antoche.
  • #define EXIT {fclose(fichier);return -1;}
  • #define CTOI(C) (*(int*)&C)
  • int LoadBMP(char *File , PropPicture *pStruct )
  • {
  • FILE *fichier;
  • //Lit le fichier et son header
  • fichier = fopen(File,"rb");if (!fichier) return -1;
  • if (fread(pStruct ->Header,1,0x36,fichier)!=0x36) EXIT;
  • if (pStruct ->Header[0]!='B' || pStruct ->Header[1]!='M') EXIT;
  • if (CTOI(pStruct ->Header[0x1E])!=0) EXIT;
  • if (CTOI(pStruct ->Header[0x1C])!=24) EXIT;
  • //Récupère les infos du fichier
  • pStruct ->DataPos = CTOI(pStruct ->Header[0x0A]);
  • pStruct ->DataSize = CTOI(pStruct ->Header[0x22]);
  • //Récupère les infos de l'image
  • pStruct ->Width = CTOI(pStruct ->Header[0x12]);
  • pStruct ->Height = CTOI(pStruct ->Header[0x16]);
  • pStruct ->Type = GL_UNSIGNED_BYTE;
  • pStruct ->Format = GL_RGB;
  • pStruct ->Components = 3;
  • //!!!!
  • if (pStruct ->DataSize==0) pStruct ->DataSize=pStruct ->Width*pStruct ->Height*pStruct ->Components;
  • if (pStruct ->DataPos==0) pStruct ->DataPos=0x36;
  • //Charge l'image
  • fseek(fichier,pStruct ->DataPos,0);
  • pStruct -> Data = new unsigned char[pStruct ->DataSize];
  • if (!pStruct ->Data) EXIT;
  • if (fread(pStruct ->Data,1,pStruct ->DataSize,fichier)!=pStruct ->DataSize)
  • {
  • delete pStruct -> Data;
  • fclose(fichier);
  • return -1;
  • }
  • fclose(fichier);
  • //Inverse R et B
  • unsigned char t;
  • for (int x=0;x<pStruct ->Width*pStruct ->Height;x++)
  • {
  • t=pStruct ->Data[x*3];
  • pStruct ->Data[x*3]=pStruct ->Data[x*3+2];
  • pStruct ->Data[x*3+2]=t;
  • }
  • return pStruct ->Name[0];
  • }
  • //###############################################################
  • //SendPicture envoit l'image a openGL.
  • void SendPicture (PropPicture *pStruct) {
  • glTexImage2D
  • (
  • GL_TEXTURE_2D, //target
  • 0, //mipmap level
  • pStruct ->Components, //nb couleurs
  • pStruct ->Width, //largeur
  • pStruct ->Height, //hauteur
  • 0, //largeur du bord
  • pStruct ->Format, //type des couleurs
  • pStruct ->Type, //codage de chaque composante
  • pStruct ->Data //Image
  • );
  • }
  • //apres avoir fait ca suffit de lancer LoadBMP avec le nom du fichier
  • //et le nom de l'image, definit en haut.
  • LoadBMP("Texture.bmp",&palmier); //n'oubliez pas le &
  • LoadBMP("balle.bmp",&balle);
  • //puis il faut charger l'image la ou vous voulez
  • //mais pas entre glBegin et glEnd
  • SendPicture(&palmier);
  • SendPicture(&balle);
  • /*
  • POURQUOI 2 FONCTION ?
  • LoadBMP fait un accé disque ... --> tres long.
  • du coup j ' en ait une fonction a part
  • Au fait si vous fait mieux ou si vous optimisez ce code, faite le savoir, ca m'interresse
  • Comment on fait pour charger une image dans une dll??
  • */
#include <stdio.h>                                              
#include <gl/glut.h>                                           
#include <iostream.h>




//PLACEZ LE CODE SUIVANT AU DEBUT DE VOTRE PROJET.


struct PropPicture {
	unsigned char	Header[0x36];
	GLuint			DataPos,DataSize;
	GLint			Components;
	GLsizei			Width,Height;
	GLenum			Format,Type;
	GLuint			Name[1];
    unsigned char	*Data;

};

//######################################
//definissez le nom des images a charger.
//exemple:

PropPicture palmier;
PropPicture balle;

//######################################
//Cette fonction se charge de recuperer l'image dans le fichier
// tout n'est pas de moi. Merci Antoche.

#define EXIT {fclose(fichier);return -1;}
#define CTOI(C) (*(int*)&C)

int LoadBMP(char *File , PropPicture *pStruct )
{


	FILE			*fichier;

//Lit le fichier et son header
	fichier = fopen(File,"rb");if (!fichier) return -1;
	if (fread(pStruct ->Header,1,0x36,fichier)!=0x36) EXIT;
	if (pStruct ->Header[0]!='B' || pStruct ->Header[1]!='M')	EXIT;
	if (CTOI(pStruct ->Header[0x1E])!=0)				EXIT;
	if (CTOI(pStruct ->Header[0x1C])!=24)				EXIT;

//Récupère les infos du fichier
	pStruct ->DataPos			= CTOI(pStruct ->Header[0x0A]);
	pStruct ->DataSize		= CTOI(pStruct ->Header[0x22]);
//Récupère les infos de l'image
	pStruct ->Width			= CTOI(pStruct ->Header[0x12]);
	pStruct ->Height			= CTOI(pStruct ->Header[0x16]);
	pStruct ->Type = GL_UNSIGNED_BYTE;
	pStruct ->Format = GL_RGB;
	pStruct ->Components = 3;
	
	//!!!!
	if (pStruct ->DataSize==0) pStruct ->DataSize=pStruct ->Width*pStruct ->Height*pStruct ->Components;
	if (pStruct ->DataPos==0)  pStruct ->DataPos=0x36;

//Charge l'image
	fseek(fichier,pStruct ->DataPos,0);
	pStruct -> Data = new unsigned char[pStruct ->DataSize];
	if (!pStruct ->Data) EXIT;

	if (fread(pStruct ->Data,1,pStruct ->DataSize,fichier)!=pStruct ->DataSize)
	{
		delete pStruct -> Data;
		fclose(fichier);
		return -1;
	}
	
	fclose(fichier);

//Inverse R et B
	unsigned char t;
	for (int x=0;x<pStruct ->Width*pStruct ->Height;x++)
	{
		t=pStruct ->Data[x*3];
		pStruct ->Data[x*3]=pStruct ->Data[x*3+2];
		pStruct ->Data[x*3+2]=t;
	}
	
	return pStruct ->Name[0];
}


//###############################################################
//SendPicture envoit l'image a openGL.


void SendPicture (PropPicture *pStruct) {
	
	glTexImage2D
	( 	
		GL_TEXTURE_2D, 	//target
		0,				//mipmap level
		pStruct ->Components,		//nb couleurs
		pStruct ->Width,			//largeur
		pStruct ->Height,			//hauteur
		0,			 	//largeur du bord
		pStruct ->Format,			//type des couleurs
		pStruct ->Type,			//codage de chaque composante
		pStruct ->Data			//Image
	);

}


//apres avoir fait ca suffit de lancer LoadBMP avec le nom du fichier
//et le nom de l'image, definit en haut.

LoadBMP("Texture.bmp",&palmier);    //n'oubliez pas le &
LoadBMP("balle.bmp",&balle);

//puis il faut charger l'image la ou vous voulez
//mais pas entre glBegin et glEnd
SendPicture(&palmier);
SendPicture(&balle);



/*
POURQUOI  2 FONCTION ?

LoadBMP fait un accé disque ... --> tres long.
du coup j ' en ait une fonction a part

Au fait si vous fait mieux ou si vous optimisez ce code, faite le savoir, ca m'interresse
Comment on fait pour charger une image dans une dll??
*/  

 Conclusion

pas de bug sur ce code mais l'optimisation reste a voir. en faisant deux fonction cela permet d'eviter le chargement de l'image plusieures fois et donc accelere le tout  

 Fichier Zip

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

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture BOITE DE VITESSE
Source avec Zip Source avec une capture MICROMACHINE
Source avec Zip Source avec une capture BEZIER OPENGL
Source avec Zip Source avec une capture ROBOT ARTICULE, TEXTURAGE BMP, MENU (OPENGL)
Source avec Zip Source avec une capture PLANE PARTY

 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

Commentaires et avis

Commentaire de Funto66 le 29/06/2003 12:42:02

Salut cppdupdup34,
La fonction LoadBMP faite par Antoche est déjà présente sur le site.
Mais je préfère la version que tu as faite; elle est + complète et simple à utiliser. Beau boulot :)
Un dernier truc; quand tu fais #include &lt;gl/glut.h&gt; tu n'as plus besoin de faire #include &lt;gl/gl.h&gt; ni #include &lt;gl/glu.h&gt;

PS : tu devrais rajouter un zip, les programmeurs sont des feignants (moi entre-autres :)  ) et ont la flemme de compiler, de créer un BMP de test... etc.
Tu devrais mettre un exécutable, la source, un BMP de test et créer une source compilable directement.
PS 2: Tu connais DevIL (ou OpenIL) ? --&gt; http://openil.sourceforge.net

Voilà, bonne prog !
@++

Commentaire de cppdupdup34 le 30/06/2003 21:11:57

je vais ajouter un exemple

Commentaire de arconius le 06/09/2003 04:58:51

Ton code est propre il se compile sans erreur mais reste juste un petit détail, chez moi il n'affiche rien (à vrai dire j'ai déjas essayer beaucoup de solution mais aucune ne marche j'ai toujours une image complètement déformée en sortie voir qui n'a plus rien à voir avec l'originale :( )

Comme tu m'as l'air de t'y intéréssé peut être tu connaitrais une solution à mon pb.

Fais moi un signe si tu trouves le temps de t'y intéresser ;).

Commentaire de cppdupdup34 le 08/11/2003 19:04:06

ca fait un bail que t'as posté ton message desolé
si ca t'interresse toujour g posté un exemple
il faut que l'image soit d'une largeur de 2^n et d'une hauteur de 2^m
voila

Commentaire de Funto66 le 08/11/2003 19:58:27

Juste une petite remarque : la contrainte d'avoir des images de dimensions 2^n et 2^m n'existe(ra?) plus à partir d'OpenGL 1.5

Commentaire de cppdupdup34 le 09/11/2003 16:47:33

funto toujour au courant de tout a ce que je vois
tu dois commencer a te balader en openGL
un maitre koi !! ;-)

Commentaire de Funto66 le 09/11/2003 20:42:22

lol ben non pas vraiment en fait :( je fais pas trop d'OpenGL ces temps-ci, mais je m'y remettrai ;)

Commentaire de NoRabbit le 16/08/2005 01:57:52

salut

j'aurais juste aimé savoir la correspondance de ces valeurs : 0x36, 0x0A,... (par ex)
et aussi CTOI (ce qu'il fait)

voilà, sinon sympa pour le code

Commentaire de Funto66 le 16/08/2005 10:33:59

S'il y a CTOI, c'est que ça doit être le loader BMP d'Antoche (petite recherche Gooogle et tu le retrouves ;)).

Pour les valeurs hexadécimales, si t'es sous Windows, la calculette en mode scientifique te permet de les retrouver en décimal.

Si tu veux une définition du format BMP, le site d'Antoche peut te renseigner dessus aussi ^^

Ceci dit je préfère le format TGA, compressé, et qui supporte la transparence ^^

Commentaire de NoRabbit le 16/08/2005 12:09:09

ok tkx
tu m'as fait découvrir la calculette scientifique...
pour CTOI, tout ce que j'ai trouvé c'est qu'il convertit un 'char' en 'int'. Le seul problème est que je ne vois pas comment ça fonctionne étant donné qu'il retire plusieurs informations (par plusieurs appels à CTOI) d'un même 'char' (le header par ex) et qu'il ne spécifie pas de longueur et/ou de début à chaque info...
j'ai bien lu une définition mais apparemment il faut passer 2 paramètres : le 'char' et l'endroit à partir duquel il faut commencer à lire.
voilà, si qqun à une réponse rapide à me donner, je suis preneur.

sinon pour le tga... non moi c png ;)
le bitmap, c juste pour comprendre.

Commentaire de Funto66 le 16/08/2005 19:50:47

Bah perso le seul truc que je reproche au PNG niveau prog c'est que son système de compression est trop compliqué pour écrire une classe simple (d'où la libpng), enfin je pense...oah remarque je pourrais essayer :)

Mais écrire une classe pr charger des fichiers TGA compressés était + simple et le RLE fonctionne bien dans les sprites de jeux ^^

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

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,702 sec (4)

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