Opengl texture

Signaler
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010
-
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
-
Salut a tous.
Quelqu'un peu m'expliquer comment appeler et appliquer une texture en format .bmp svp.
avec un exemple si possible.
Merci.

21 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
voila un exemple avec la glaux

#include <gl\glaux.h>

void LoadTexture(const char *file_name, unsigned *text_name)
{
AUX_RGBImageRec *bmp;

bmp= auxDIBImageLoad(file_name);
glGenTextures (1, text_name);

glBindTexture (GL_TEXTURE_2D, *text_name);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, bmp->sizeX, bmp->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, bmp->data);
};

apres, tu fais dans la partie init de ton code

unsigned texture_id; // l'identifiant de ta texture
LoadTexture( "image.bmp", & texture_id );

et dans la procedure de dessin

glBindTexture (GL_TEXTURE_2D, texture_id);
glBegin(GL_QUADS);
glTexCoord2i(1,0);glVertex2i(-1,-1);
glTexCoord2i(1,1);glVertex2i(-1,1);
glTexCoord2i(0,1);glVertex2i(1,1);
glTexCoord2i(0,0);glVertex2i(1,-1);
glEnd();

pour completer ca renseigne toi sur ce que font glTexCoord2i, glBindTexture, glTexParameteri, glTexImage2D et aussi glGenTextures et glDeleteTextures

avec glTexImage2D, les dimensions de ta textures doivent etre des puissance de 2 (par exemple 256*256)
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Merci de m'aider djl .
Mais j'ai une erreure:
glTextCoord2i(1.0f,0.0f);glVertex3i(-1,5,-1);
glTextCoord2i undeclared identifier.
Meme si je fais glTextCoord2f etc.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ta inclus gl.h
glTextCoord2i est déclaré dans gl.h (je suis devcpp )

moi j'ai bien ca dans gl.h

GLAPI void APIENTRY glTexCoord1d( GLdouble s );
GLAPI void APIENTRY glTexCoord1f( GLfloat s );
GLAPI void APIENTRY glTexCoord1i( GLint s );
GLAPI void APIENTRY glTexCoord1s( GLshort s );
GLAPI void APIENTRY glTexCoord2d( GLdouble s, GLdouble t );
GLAPI void APIENTRY glTexCoord2f( GLfloat s, GLfloat t );
GLAPI void APIENTRY glTexCoord2i( GLint s, GLint t );
GLAPI void APIENTRY glTexCoord2s( GLshort s, GLshort t );
GLAPI void APIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r );
GLAPI void APIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r );
GLAPI void APIENTRY glTexCoord3i( GLint s, GLint t, GLint r );
GLAPI void APIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r );
GLAPI void APIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q );
GLAPI void APIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q );
GLAPI void APIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q );
GLAPI void APIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q );
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Re salut.
Oui j'ai inclus gl.h ,j'ai essayer en 2d:
glTexCoord2i(1,0);glVertex2i(-1,-1);
et ca a l'air de passer mais moi j'ai un cube 3d
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

J'essais glTexCoord3i
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Ca marche ,merci pour ton aide djl :)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ok, mais pourquoi ca marchais pas avant ?
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Parce que vous avez marqué glTextColor2i au lieu de glTexCoord2i ^^

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
a ouai je viens de voir !

mais apres j'ai fais un c/c sans regarder
Messages postés
110
Date d'inscription
mardi 10 octobre 2000
Statut
Membre
Dernière intervention
20 décembre 2005

Ca c'est une version avec glaux.h, qui demandera la plupart du temps d'accompagner le programme avec la dll glaux.dll.

Tu pourras trouver là un loader BMP qui n'utilise pas glaux, au cas où :
http://belzel.free.fr/loadbmp/index.html

Pour info, il est préférable de remplacer la fonction glTexImage2D ( ) par la fonction gluBuild2DMipmaps ( ), qu'il faut utiliser comme suit : gluBuild2DMipmaps ( GL_TEXTURE_2D, 3, largeur, hauteur, GL_RGB, GL_UNSIGNED_BYTE, image);

BeLZeL
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oui, mieux vauut utiliser gluBuild2DMipmaps (mais la du coup on utilise la glu :) )

mais au fond la bonne habitude est d'utiliser des textures dont les dimensions respectent ces contraintes (pour la vitesse de chargement)

BeLZeL > pour ton loader, il me semble pas que tu prene compte (ou alors j'ai mal vu) les eventuels octets de bourrage en fin de lignes (pour que le nombre d'octets soit un multiple de 4 pour chaque ligne), ca te donne quoi avec une image de 459*300 par exemple ?
sinon pour le coté fonctionelle, il faudrais egalement passer l'id de la texture en parametre, sinon comment on fais pour la selectionner avant plaquage ? dans ton cas c'est un tableau globale de 1 element ? )
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
L'utilisation de la GLU c'est vraiment pas un handicap...ça doit faire carrément partie de la spécification d'OpenGL non?

Quant à la vitesse de chargement, à vrai dire dans un cas comme ça on s'en f*** un peu...une fois chargé c'est chargé, c'est tout, et à choisir entre la contrainte de textures limitées à des puissances de 2 ou un temps de chargement plus long de quelques millisecondes...^^

"il me semble pas que tu prene compte (ou alors j'ai mal vu) les eventuels octets de bourrage en fin de lignes" -> ben justement, c'est gluBuild2DMipmaps qui le fait automatiquement, grâce au fait qu'elle emploie en interne gluScaleImage.
Une image de 459*300 passerait donc sans pb.

"il faudrais egalement passer l'id de la texture en parametre, sinon comment on fais pour la selectionner avant plaquage ?" -> la texture utilisée est celle en cours : glBindTexture...

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
"ben justement, c'est gluBuild2DMipmaps qui le fait automatiquement, grâce au fait qu'elle emploie en interne gluScaleImage."

j'ai pas compris, si gluBuild2DMipmaps n'attend pas un pointeur sur une image dont l'alignement des pixels correspond a celui du format bmp (et c'est pas specifier dans la doc, ce qui est normal puisque fonctionnel) alors il y aura forcement un decalage si la largeur n'est pas un multiple de 4 ??

"la texture utilisée est celle en cours : glBindTexture..."

merci, ca repond pas a ma question, si tu dois faire un programme qui charge plus d'une texture (he oui ca arrive) comment tu selectionnes la texture si tu connais pas l'id ??
c'est pour ca que je disais de retourner l'id si tu veux que ce soit fonctionnel
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Euh...j'ai rien compris à ton histoire de décalage O_o
Et pourquoi est-ce que tu parles du bmp...bref pourrais-tu être un peu plus clair stp?

Pour l'histoire d'ID, j'ai pas regardé le loader mais s'il n'utilise que glBuild2DMipmaps tu dois pouvoir faire comme ça :

GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
loadBMP("avion.bmp");

enfin j'en sais rien j'ai pas vérifié ^^

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
pour l'id c'est pas ca que je ve dire, imagine tu charge 10 texture au debut du prog (classic quoi), comment tu fais au cour du rendu pour faire le glbind sur telle ou telle texture si tu n'a pas leur id??

pour le bmp, les donnée du bmp ne sont pas alignée si la largeur de l'image n'est pas un multiple de 4 (quand on est en bgr), et gluBuild2DMipmaps bien evidemant attend des données parfaitement alignés, d'ou decalage possible
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Aaah okkéé ! Je comprenais pas d'où venait ton histoire d'alignement, j'avais pas fait le lien avec le format BMP ^^

Pour l'histoire de l'ID, je recommence :

// En global (ouais bon je simplifie :p)
GLuint tab_ids[10];

// Au chargement (Init())
glGenTextures(10, tab_ids);

glBindTexture(GL_TEXTURE_2D, tab_ids[0]);
loadBMP("data/avion.bmp");

glBindTexture(GL_TEXTURE_2D, tab_ids[1]);
loadBMP("data/ennemi.bmp");

// A l'affichage

// Pour afficher l'avion :
glBindTexture(GL_TEXTURE_2D, tab_ids[0]);
glBegin(GL_QUADS);
// etc....
glEnd();

// Pour afficher l'ennemi :
glBindTexture(GL_TEXTURE_2D, tab_ids[1]);
glBegin(GL_QUADS);
// etc....
glEnd();

Voilà, c'est ça que je voulais dire en gros.
Maintenant je ne sais toujours pas si ça marche comme ça vu que j'ai pas regardé le loader :p

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Un concours de prog graphique, ça vous dit? c'est sur Coder-Studio : http:
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ok, c'est ce que je voulais savoir, c'est une facons de faire qui est sans doute meilleurs que la mienne (puisque moi je serais obliger de faire autant de glgentexture, mais je sais pas quel est l'impact)
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Bah je doute que l'appel de plusieurs fois glGenTextures() dans le chargement du programme ait un réel effet...d'autant plus que c'est le chargement ^^
Au fond, glGenTextures c'est juste une fonction qui utilise une liste des IDs utilisés, liste qui varie selon les appels à glGenTextures et glDeleteTextures, donc ça m'étonnerait que ça soit un appel lent.
Enfin, à moins que glGenTextures crée vraiment une texture, mais il me semble que l'on peut s'en passer et utiliser des IDs de textures arbitraires non?

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
non, c'est l'api qui doit fournir les id, ca j'en suis sur :)

enfin moi le design

unsigned loadtexture(const char *); // retourne id

me plait bien et je trouve ca fonctionnel
Messages postés
1267
Date d'inscription
mercredi 1 janvier 2003
Statut
Membre
Dernière intervention
28 février 2007
3
Hmm qu'OpenGL doive forcément fournir les IDs je ne serais pas si sûr, je testerai demain...
Sinon c'est clair que ton design est mieux, personnellement je préfère un truc du style :
ErrorCode LoadBMP(const char* str_fichier, GLuint* p_id);

---------------------------------------------------------
Patience et longueur de temps font plus que force ni que rage....
Coucous flingueurs 3D : http://www.freewebs.com/cf3d/
Un concours de prog graphique, ça vous dit? c'est sur Coder-Studio : http: