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