IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Texture sur un objet 3D (openGL+glut)


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut Texture sur un objet 3D (openGL+glut)
    Bonjour tout le monde,

    Je suis débutant en openGL et je suis en train d'apprendre les textures via le site suivant: "http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06"

    Malheureusement, j'ai du mal à y comprendre le code.

    Entre temps j'ai trouvé un autre site en français qui donne le code suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     GLubyte Texture[16] =
    {
    0,0,0,0, 0xFF,0xFF,0xFF,0xFF,
    0xFF,0xFF,0xFF,0xFF, 0,0,0,0
    };
     //Image (2x2) 
    GLuint Nom; 
     
    void InitGL() 
    {  
     glClearColor(.5,.5,.5,0); //Change la couleur du fond 
    glEnable(GL_DEPTH_TEST); //Active le depth test 
    glEnable(GL_TEXTURE_2D); //Active le texturing 
    glGenTextures(1,&Nom); //Génère un n° de texture 
    glBindTexture(GL_TEXTURE_2D,Nom); //Sélectionne ce n° 
    glTexImage2D ( 
     GL_TEXTURE_2D, //Type : texture 2D 
    0, //Mipmap : aucun 
    4, //Couleurs : 4 
    2, //Largeur : 2 
    2, //Hauteur : 2 
    0, //Largeur du bord : 0 
    GL_RGBA, //Format : RGBA 
    GL_UNSIGNED_BYTE, //Type des couleurs 
    Texture  //Addresse de l'image 
    );  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    }

    Cette partie est bien détaillée alors je comprends assez bien à part peut être le GLubyte Texture[16] et ce qu'il renvoie.
    Après, on applique la texture à un objet 3D comme tel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    void Draw() 
    {  
     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Efface le framebuffer et le depthbuffer 
    glMatrixMode(GL_MODELVIEW); //Un petit gluLookAt()... 
    glLoadIdentity(); 
    gluLookAt(3,2,3,0,0,0,0,1,0); 
    glBegin(GL_QUADS); //Et c'est parti pour le cube ! 
    glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
    glTexCoord2i(1,0);glVertex3i(+1,-1,-1);
    glTexCoord2i(1,1);glVertex3i(+1,+1,-1); 
    glTexCoord2i(0,1);glVertex3i(-1,+1,-1);
     //1 face 
    glTexCoord2i(0,0);glVertex3i(-1,-1,+1);
    glTexCoord2i(1,0);glVertex3i(+1,-1,+1); 
    glTexCoord2i(1,1);glVertex3i(+1,+1,+1); 
    glTexCoord2i(0,1);glVertex3i(-1,+1,+1); 
     //2 faces 
    glTexCoord2i(0,0);glVertex3i(+1,-1,-1); 
    glTexCoord2i(1,0);glVertex3i(+1,-1,+1);
    glTexCoord2i(1,1);glVertex3i(+1,+1,+1);
    glTexCoord2i(0,1);glVertex3i(+1,+1,-1);
     //3 faces 
    glTexCoord2i(0,0);glVertex3i(-1,-1,-1); 
    glTexCoord2i(1,0);glVertex3i(-1,-1,+1); 
    glTexCoord2i(1,1);glVertex3i(-1,+1,+1);
    glTexCoord2i(0,1);glVertex3i(-1,+1,-1); 
     //4 faces 
    glTexCoord2i(1,0);glVertex3i(-1,+1,-1); 
    glTexCoord2i(1,1);glVertex3i(+1,+1,-1); 
    glTexCoord2i(0,1);glVertex3i(+1,+1,+1);
    glTexCoord2i(0,0);glVertex3i(-1,+1,+1);
     //5 faces 
    glTexCoord2i(1,0);glVertex3i(-1,-1,+1); 
    glTexCoord2i(1,1);glVertex3i(+1,-1,+1);
    glTexCoord2i(0,1);glVertex3i(+1,-1,-1);
    glTexCoord2i(0,0);glVertex3i(-1,-1,-1);
     //6 faces 
    glEnd();  
    SwapBuffers(DC); //glutSwapBuffers(); pour GLUT 
    glutPostRedisplay(); //Uniquement pour GLUT


    Ici, je ne comprends pas le gluLookAt et ses paramètres.

    Et puis, ici, la personne créée elle-même son image en échéquier. Comment faire pour importer une image sur mon ordinateur à la place ? et faut-il l'importer en chemin absolu ?

    Merci d'avance pour votre aide !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Par défaut
    Bonsoir,
    qu'est ce que tu ne comprends pas exactement dans la page de manuel de gluLookAt ?

    Sinon pour GLubyte Texture[16] il s'agit des données correspondant à une image en RGBA de dimensions 2x2. C'est à dire larqeur 2 pixels et hauteur 2 pixels, et RGBA signifie que tu as 4 valeurs pour définir une couleur : 3 pour les 3 couleurs primaires rouge, vert et bleu et une composante pour la transparence que l'on appelle dans le jargon le canal alpha. Donc 2 x 2 x 4 = 16 ce qui explique que le tableau Texture contient 16 éléments, ces éléments étant de type GLubyte c'est à dire une valeur comprise dans l'interval [0 - 255].

    Pour savoir comment charger une texture de type JPEG, utilise les mots clefs suivants dans google : { opengl texture jpeg }

    voilà

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    Juste au cas où, les tutoriels de NeHe sont traduits ici: http://nehe.developpez.com/
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Je vous remercie pour vos réponses!

    Merci pour le lien LittleWhite je ne savais pas qu'il avait été traduit. Cependant, je l'ai bien compris en anglais donc c'est pas une erreur de compréhension de la langue mais du code :p
    Aussi, en recherchant, j'ai appris qu'il y avait deux moyens de charger un fichier pour ensuite appliquer une texture :

    - faire son propre code de chargement de fichier ( comme ce que propose de faire Nehe d'ailleurs)
    - utiliser une librairie adéquate (comme DeviL).

    Je pense qu'étant débutant, cette deuxième méthode me parait plus appropriée. J'ai d'ailleurs le code qu'il me reste à comprendre du chargement en DeviL d'un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    ILboolean success;
    	ILuint iltexID;
     
    	ilGenImages(1, &iltexID);
    	ilBindImage(iltexID);
    	success = ilLoadImage(fich); 
     
    	if (success)
      	{
    		glGenTextures(1,&texId);
     
    		width = ilGetInteger(IL_IMAGE_WIDTH);
    		height = ilGetInteger(IL_IMAGE_HEIGHT);
    		internalFormat = ilGetInteger(IL_IMAGE_BPP);
    		format = ilGetInteger(IL_IMAGE_FORMAT);
    		type = ilGetInteger(IL_IMAGE_TYPE);
     
        	        glBindTexture(GL_TEXTURE_2D, texId);
     
    		gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat, width,             height, format, type, ilGetData());
     
    		glBindTexture(GL_TEXTURE_2D, 0);
     
     }
      else
      {
    		perror("Erreur de chargement avec devIL : ");
    		exit(45);
      }
     
      	ilDeleteImages(1, &iltexID);
     
    	printf("Texture chargée\n");
    Cependant, dans ce code, je ne comprends pas bien à quel moment le fichier est recherché dans windows en chemin absolu (ou non d'ailleurs). Pourquoi il ne semble pas y avoir de recherches du fichier avant le chargement de ce dernier ?

  5. #5
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    J'ai toujours plusieurs problèmes :s :

    J'ai téléchargé un fichier zip qui contient :

    dans le repertoire "lib" les fichiers suivant :

    - DevIL.dll
    - DevIL.lib
    - ILU.dll
    - ILU.lib
    - ILUT.dll
    - ILUT.lib

    (Il y a aussi un sous-repertoire "unicode" avec les mêmes fichiers donc je sais pas lesquels sont utiles :s).

    Aussi, il y a un autre repertoire "include/IL" avec :

    - config.h
    - config.h.win
    - devil_internal_ex...
    - il.h
    - il_wrap.h
    - ilu.h
    - ilu_region.h
    - ilut.h
    - ilut_config.h

    *** Seulement, j'ai du mal à comprendre l'utilité de ces fichiers et comment les utiliser pour pouvoir intégrer complétement la librairie deviL à un projet openGL.

    -------------------------------------------------------------------------------------------------------------------

    Aussi, une fois ceci fait, j'ai le code suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GLuint Texture; 
     
    ilInit(); 
    ilutEnable(ILUT_OPENGL_CONV);  
     
    ilutRenderer(ILUT_OPENGL); 
    Texture = ilutGLLoadImage("superimageavecunecape.jpg");

    Puis enfin pour l'application sur le cube :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    glPushMatrix(); 
      glEnable(GL_TEXTURE_2D); 
      glBindTexture(GL_TEXTURE_2D, Texture); 
     
      glBegin(GL_QUADS); 
        glTexCoord2i(1,0);glVertex3f(-1,-1,1); 
        glTexCoord2i(0,0);glVertex3f(1,-1,1); 
        glTexCoord2i(0,1);glVertex3f(1,1,1); 
        glTexCoord2i(1,1);glVertex3f(-1,1,1); 
     
        glColor3f(0,1,0); glVertex3f(1,1,-1); 
        glColor3f(0,0,1); glVertex3f(-1,1,-1); 
        glColor3f(1,0,0); glVertex3f(-1,1,1); 
        glColor3f(1,0,0); glVertex3f(1,1,1); 
     
        glColor3f(0,0,1); glVertex3f(-1,-1,-1); 
        glColor3f(0,1,0); glVertex3f(1,-1,-1); 
        glColor3f(1,0,0); glVertex3f(1,1,-1); 
        glColor3f(1,0,0); glVertex3f(-1,1,-1); 
     
        glColor3f(0,1,0); glVertex3f(1,-1,-1); 
        glColor3f(0,0,1); glVertex3f(1,-1,1); 
        glColor3f(1,0,0); glVertex3f(1,1,1); 
        glColor3f(1,0,0); glVertex3f(1,1,-1); 
     
        glColor3f(0,0,1); glVertex3f(-1,-1,-1); 
        glColor3f(0,1,0); glVertex3f(-1,-1,1); 
        glColor3f(1,0,0); glVertex3f(-1,1,1); 
        glColor3f(1,0,0); glVertex3f(-1,1,-1); 
     
        glColor3f(0,1,0); glVertex3f(1,-1,-1); 
        glColor3f(0,0,1); glVertex3f(-1,-1,-1); 
        glColor3f(0,1,0); glVertex3f(-1,-1,1); 
        glColor3f(0,0,1); glVertex3f(1,-1,1); 
      glEnd(); 
     
      glEnable(GL_BLEND); 
      glPopMatrix();

    Ici, j'ai du mal à comprendre comment la fonction ilutGLLoadImage va chercher l'image jpg sans chemin absolu (pour la retrouver sur ton ordi) ?

    Enfin, pourquoi cette fonction est-elle si simple et des personnes s'embêtent à écrire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    ILboolean success;
    	ILuint iltexID;
     
    	ilGenImages(1, &iltexID);
    	ilBindImage(iltexID);
    	success = ilLoadImage(fich); 
     
    	if (success)
      	{
    		glGenTextures(1,&texId);
     
    		width = ilGetInteger(IL_IMAGE_WIDTH);
    		height = ilGetInteger(IL_IMAGE_HEIGHT);
    		internalFormat = ilGetInteger(IL_IMAGE_BPP);
    		format = ilGetInteger(IL_IMAGE_FORMAT);
    		type = ilGetInteger(IL_IMAGE_TYPE);
     
        	        glBindTexture(GL_TEXTURE_2D, texId);
     
    		gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat, width,             height, format, type, ilGetData());
     
    		glBindTexture(GL_TEXTURE_2D, 0);
     
     }
      else
      {
    		perror("Erreur de chargement avec devIL : ");
    		exit(45);
      }
     
      	ilDeleteImages(1, &iltexID);
     
    	printf("Texture chargée\n");


    Je sais ce message est long :s j'éspère qu'il ne vous effrayera pas trop ...
    J'attends vos réponses avec impatience !

    Merci d'avance

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    Je sais ce message est long :s j'éspère qu'il ne vous effrayera pas trop ...
    Nous avons déjà vu des messages long, ne vous inquiétez pas ... ( et long, avec que du texte ).

    Pour les gens qui recode les fonctions de chargement d'image, c'est parce que certains ne veuille pas utiliser une bibliothèque externe ( comme Devil ). ( Et aussi parce qu'ils ont besoin de géré qu'un seul format ).
    Enfin bref, il peut y avoir plusieurs raisons ( dont l'une qui peut être, juste parce que c'est marrant de recoder la roue )

    Dans la théorie de la configuration de projet ( que ce soit avec Code::Blocks ou Visual Studio ), on doit ajouter les bibliothèques au projet ( les .lib / .a ), et le répertoire des include au projet ( pour avoir les entêtes ).
    Il doit y avoir pleins d'explication partout, vu que c'est un problème courant.

    Pour le répertoire Unicode, c'est juste les même bibliothèque, mais qui gère plus de caractères ( nom de fichier, je pense ) ( encodage Unicode ).

    Finalement, pour les chemins relatifs, ils se basent en partant de l'endroit ou est le programme.
    Donc si on charge un fichier qui a pour chemin ceci:
    "data/image.jpg"
    Il va regarder dans le repertoire du programme, un dossier data, puis un fichier image.jpg dans ce dossier.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. WebGL : appliquer des textures sur les objets
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 20/07/2015, 21h22
  2. Comment plaquer une texture 2D sur un objet GLUT ?
    Par zak62000 dans le forum GLUT
    Réponses: 2
    Dernier message: 03/03/2009, 15h37
  3. Ajouter une textures sur des objets 3D openGL
    Par rere56 dans le forum 3D
    Réponses: 1
    Dernier message: 27/07/2007, 11h08
  4. [Java3D] Textures sur un objet
    Par vero55 dans le forum 3D
    Réponses: 3
    Dernier message: 18/04/2007, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo