Bonjour a tous !
Ca fait 2-3 jour que je regarde a droite a gauche , comment on fait pour texturer des objets en openGL .

Histoire de ne pas partir sur de mauvaises base, et avant de coder une premiére classe "test" qui se chargera pour moi de charger mes textures.
Je préfére vous soumettre ce que je sais / crois savoir avant de mettre véritablement les mains dans le camboui .

On distingue 2 étapes :
- le chargement de la texture a partir d'un fichier sur le HD ( je fait abstraction des texture procédurale ... je n'en suis pas encore la )
- l'utilisation de celle-ci sur de la géométrie de base ( je me limiterai la, car pour un monde en 2D, je n'aurais pas besoin de grand choses ^^ )

-> 1ére partie : le chargement de texture et son " enregistrement " sous openGL .

Il faut d'abord faire attention au format de notre image . j'ai vu qu'une fonction simple permetetai en natif de se débrouiller avec le format "bmp" . Pour les autres formats, j'ai vu que la pluspart du temps des librairie annexes étaient utilisés .

Le tout consiste donc a receuillir les donné de notre images ( largeur / hauteur / valeurs des pixel ( RGB+A ) ect ...

Pour simplifier on va se ramener au bmp ; pour receuillir ces information on va procéder comme suit :
- déclaration d'un tableau pour stocker le numero d'identification de chaque texture ( id )
- déclaration d'un "objet" texture
- on affecte a notre objet texture toutes les données necessaire a son exploitation ( issu de notre image au format bmp )

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
GLuint textureId[1] ;// pour 1 texture
AUX_RGBImageRec * texture ;
texture = auxDIBImageLoad("chemin vers notre image") ;
Ensuite on indique a openGL qu'on va "enregistrer" véritablement une texture :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
glGenTextures (param1, param2);
ou param1 est un entier correspondant au nombres de texture qu'on va créer
param2 correspond a notre tableau de GLuint ; si j'ai bien comprit en utilisant cette fonction, openGL va attribuer tout seul un id a la texture, si on voulais en préciser un nous même, il nous faudrait juste ne pas utiliser cette fonction, et indiqué un entier en deuxiemes paramétre de la fonction que l'on va voir dans peu de tps ( glBindTexture )
En ce qui nous concerne, avec atribution d'une id par oepnGL on obtient :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
glGenTextures(1,&textureId[0]) ;
Puis on indique a openGL que la texture dont l'id est "param2" doit être assimilé en tant que "param1"

param1 prenant les valeur suivantes :
GL_TEXTURE_1D
GL_TEXTURE_2D
GL_TEXTURE_3D

Dans notre exemple on aura :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
glBindTexture(GL_TEXTURE_2D, textureId[0] );
OU
int id = 4 ;
glBindTexture(GL_TEXTURE_2D, id) ; // si on a pas fait appel a glGenTextures(...) avant
Ensuite on peut préciser des paramétres liée au traitement de la texture par openGL.
Pour le moment, je n'en utilise que 2 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
Ils précisent le comportement ( GL_LINEAR ) qui va être apliqué lorsque la texture sera réduite ou agrandit pour 'être affiché a l'écran .

Enfin, on va utiliser les données receuillit dans la variable texture pour finalement "uploader" notre texture dans la mémoire video. Et c'est aprés ca qu'elle sera véritablement utilisable dans notre programme .

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, texture->sizeX, texture->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->data);
Et voila ! notre texture dont l'id est " textureId[0]" est prête a etre utilisé dans notre programme !

Il nous reste a libéré la mémoire prise par la variable " texture "
( la je ne suis pas trés sur de moi )

Il reste a ajouter pas mal de code pour traquer les erreurs mais bon, l'idée est la je pense !

La suite prochainement , si vous avez des remarques / suggestion / idées / conseils , je suis trés vivement preneur , car je n'ai sans doute pas encore tout comprit et j'ai encore énormément a aprendre !
a bientot !

edit: bon je part en vacances, donc la suite dans 5-6 jours :/ mais je lirai tout vos msg avec la plus grande joie et attention en rentrant ! bonne fin de fêtes a tous !