Afficher un bitmap en opengl

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


#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

Codes Sources

A voir également

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.