Opengl texture

niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010 - 7 sept. 2004 à 14:25
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 10 sept. 2004 à 01:16
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

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 14:48
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)
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
7 sept. 2004 à 16:06
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.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 16:14
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 );
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
7 sept. 2004 à 16:27
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
7 sept. 2004 à 16:29
J'essais glTexCoord3i
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
7 sept. 2004 à 16:30
Ca marche ,merci pour ton aide djl :)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 16:39
ok, mais pourquoi ca marchais pas avant ?
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
7 sept. 2004 à 17:23
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/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
7 sept. 2004 à 19:52
a ouai je viens de voir !

mais apres j'ai fais un c/c sans regarder
0
BeLZeL Messages postés 110 Date d'inscription mardi 10 octobre 2000 Statut Membre Dernière intervention 20 décembre 2005
8 sept. 2004 à 00:25
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
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 sept. 2004 à 09:38
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 ? )
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
8 sept. 2004 à 16:01
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/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
8 sept. 2004 à 16:42
"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
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
8 sept. 2004 à 22:13
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/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
9 sept. 2004 à 10:51
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
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
9 sept. 2004 à 18:50
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:
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
9 sept. 2004 à 18:55
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)
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
9 sept. 2004 à 19:02
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/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
9 sept. 2004 à 19:05
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
0
Funto66 Messages postés 1267 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 28 février 2007 4
9 sept. 2004 à 23:25
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:
0
Rejoignez-nous