Probléme de textures pour un loader 3DS [OpenGl,DevIl]

Résolu
juliendemomaker Messages postés 7 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 12 mars 2006 - 11 nov. 2005 à 14:14
juliendemomaker Messages postés 7 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 12 mars 2006 - 11 nov. 2005 à 22:08
Bonjour !



Voici mon probléme, je conçois actuellement un loader .3ds en C++ avec
OpenGl, le probléme est que quand je charge un model 3D quelconque
ayant une texture et que je l'affiche, un énorme bug de texture se faît
et bien sur je ne comprend vraiment pas d'ou ca peut venir ! Je pense
que le loader en lui même applique bien la texture car pour les
material (bleu,rouge etc...) appliqué aux objets ca marche parfaitement
! J'ai uploadé 2 screenshoot ! 1 étant la texture normal tel quelle
devrait etre et l'autre est un screen d'une map charger via mon loader
et afficher avec la texture du lien n°1 :)



Pour vous fournir aussi plus d'information possible je poste du code
(c'est la ou je charge et je configure ma texture pour la passer à
OpenGl via gluBuil2Dmipmap(..);



Voici le morceau du code qui sert à charger la texture et à passer à opengl les params :



Voici aussi les 2 screens permettant de vous faire une idée du probléme :



L'affichage d'une map chargé via le loader et l'application d'une texture :

http://div0.free.fr/TEMP/mapwodk.jpg



La texture tel qu'elle devrait etre :

http://div0.free.fr/TEMP/sandwest.jpg







[code]CTexture::CTexture(void)

{

// Initialisation des attributs

m_uiID = 0;

m_uiDimX = 0;

m_uiDimY = 0;

m_ucpBuffer = 0;

m_ucpPixel = 0;

}





CTexture::~CTexture(void)

{

Detruire();

}





void CTexture::Detruire(void)

{

glDeleteTextures(1, &m_uiID);

}







// Creer

// -> Méthode de création de la texture dans une unité de texture

//---------------------------------------------------------------//

void CTexture::Creer(void)

{

// Si le tableau de pixel est vide ...

// if (!m_ucpPixel)

// return;



// Création d'un nouvel identifiant

glGenTextures(1, &m_uiID);

glBindTexture(GL_TEXTURE_2D, m_uiID);



// Paramétrage du filtre

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);

glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_LINEAR);





// Construction des mipmaps

unsigned int temp = GL_RGB;

if (m_uiComposante == 4)

temp = GL_RGBA;

gluBuild2DMipmaps(GL_TEXTURE_2D,
/*m_uiComposante*/4,ilGetInteger(IL_IMAGE_HEIGHT),ilGetInteger(IL_IMAGE_WIDTH),


/*temp*/GL_RGB,
GL_UNSIGNED_BYTE, ilGetData());

ilDeleteImages(1, &texid);

}







// Charger

// -> Méthode de chargement

//---------------------------------------------------------------//

void CTexture::Charger(char * fichier)

{

// Récupération de l'extension du fichier pour déterminer la

// méthode de chargement.

char * extension = strrchr(fichier, '.');



// Ouverture du fichier

FILE * f;

if (!(f = fopen(fichier, "rb")))

return;



// Calcul de la longueur du fichier

fseek(f, 0, SEEK_END);

int iFin = ftell(f);

fseek(f, 0, SEEK_SET);

int iDebut = ftell(f);

unsigned int longeur = iFin - iDebut;



// Lecture des données

m_ucpBuffer = new unsigned char[longeur];

fread(m_ucpBuffer, 1, longeur, f);

fseek(f, 0, SEEK_SET);



// Si le format du fichier est ..

/* if (memcmp(m_ucpBuffer, BMP_ENTETE, 2) == 0)

ChargerBMP();

else

{*/

/* ilInit();

ilGenImages(1, &texid);

ilBindImage(texid);

success = ilLoadImage(fichier);

success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE);



m_uiDimX = ilGetInteger(IL_IMAGE_WIDTH);

m_uiDimY = ilGetInteger(IL_IMAGE_HEIGHT);*/

ChargerDevIl(fichier);

//}



// Fermeture du fichier

if (f)

fclose(f);



// Création

Creer();

}







// Activer

// -> Méthode d'activation

//---------------------------------------------------------------//

void CTexture::Activer(void)

{glBindTexture(GL_TEXTURE_2D, m_uiID);}



void CTexture::ChargerDevIl(char * file)

{

ilInit();

ilGenImages(1, &texid);

ilBindImage(texid);

success = ilLoadImage(file);

success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE);

ilOriginFunc(IL_ORIGIN_UPPER_LEFT);

ilEnable(IL_ORIGIN_SET);



m_uiDimX = ilGetInteger(IL_IMAGE_WIDTH);

m_uiDimY = ilGetInteger(IL_IMAGE_HEIGHT);

}



[code/]



Si quelqu'un pourrait m'aider... je lui en serais trés reconnaissant :)

1 réponse

juliendemomaker Messages postés 7 Date d'inscription mercredi 8 novembre 2000 Statut Membre Dernière intervention 12 mars 2006
11 nov. 2005 à 22:08
Bonsoir !



J'ai résolu le probléme ! Cela ne venait pas de mon loader mais de ma cg qui accepte que les textures ^2 donc voila !



merci à tous et bon code (pour voir le resultat maintenat avec
une texture 2048*2048 c'est par ici :
http://div0.free.fr/TEMP/etoile.jpg (bon d'accord c'est pas super sur
une carte une texture de nebuleuse ^^) )

PS : Aprés 2 ou 3 jours suivnat ce poste les images seront effacé du ftp donc les liens seront erroné...
3
Rejoignez-nous