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 :

Porbleme avec les textures.


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 71
    Points : 57
    Points
    57
    Par défaut Porbleme avec les textures.
    Bonsoir tout le monde.
    j'ai un petit probleme avec les textures.
    Je suis entrain de modeliser un chateau.si j'active la texture sur un cube bien precis tout le chateau prend cette texture.

    voila un bout du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Cube mur1(Vector(0,0,0),Vector(5,290,130),"brique.bmp");
    	Cube mur2(Vector(0,0,0),Vector(-390,5,130),"terre.bmp");
    	Cube mur3(Vector(0,0,0),Vector(5,290,130),"");
    	mur1.Render(camera);
    	mur2.Render(camera);
    	mur3.Render(camera);
    tout les murs prennent la texture "terre" alors que normalement je devrais avoir trois mur differents.
    dans le rander de Cube je fais un glBindTexture et un glDisable;

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Le code que tu nous as mis ne sert pas grand chose...

    Pourrais tu mettre le de ta méthode Render() ?

    Normallement, glBindTexture doit être appelé entre chaque rendu de géometrie
    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
     
    // cube 1
    glBindTexture();
    glBegin( ... );
     ...
    glEnd()
     
    // cube 2
    glBindTexture();
    glBegin( ... );
     ...
    glEnd()
     
    // cube 3
    glBindTexture();
    glBegin( ... );
     ...
    glEnd()

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    voila la fonction render

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    void Cube::Render(const Camera& c)
    {
      // Ne dessine l'objet que s'il est visible
      if (!camera.View(box))
        return;
     
      glBindTexture(GL_TEXTURE_2D,tex_Mur[0]);
      glEnable(GL_TEXTURE_2D);
     
      glBegin(GL_QUADS);
     
      // Face z=-1
      glNormal3f(0.0f,0.0f,-1.0f);
      glVertex3f(a[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(a[0],b[1],a[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],a[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(b[0],a[1],a[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face z=+1
      glNormal3f(0.0f,0.0f,1.0f);
      glVertex3f(a[0],a[1],b[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(b[0],a[1],b[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(a[0],b[1],b[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face x=-1
      glNormal3f(-1.0f,0.0f,0.0f);
      glVertex3f(a[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(a[0],a[1],b[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(a[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(a[0],b[1],a[2]);
      glTexCoord2f(0.0f,1.0f);
     
     
      // Face x=+1
      glNormal3f(1.0f,0.0f,0.0f);
      glVertex3f(b[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(b[0],b[1],a[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(b[0],a[1],b[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face y=-1
      glNormal3f(0.0f,-1.0f,0.0f);
      glVertex3f(a[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(b[0],a[1],a[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],a[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(a[0],a[1],b[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face y=+1
      glNormal3f(0.0f,1.0f,0.0f);
      glVertex3f(a[0],b[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(a[0],b[1],b[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(b[0],b[1],a[2]);
      glTexCoord2f(0.0f,1.0f);
     
      glEnd();
      glDisable(GL_TEXTURE_2D);
    }

  4. #4
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    glBindTexture(GL_TEXTURE_2D,tex_Mur[0]);
    Tu ne prendrais pas toujours la même texture ?? vu que l'index de ton tableau est toujours 0 ??

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    Mais si je fait
    Cube mur1(Vector(0,0,0),Vector(5,290,130),"brique.bmp");
    Cube mur2(Vector(0,0,0),Vector(-390,5,130),"terre.bmp");

    normalement je devrais avoir 2 structure differentes
    mais c'est pas le cas

  6. #6
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Tout dépend de ce qu'est ton tableau "tex_Mur" ..

    Peux tu mettre le code complet de ta classe cube (.h et .cpp )?

  7. #7
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    ET juste un petit truc comme ca .. il faut définir tes coordonnées de texture pour chaque vertex ... avant glVertex()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glNormal();
    glTexCoord();
    glVertex();

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    voila le .cpp
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include "shape.h"
    #include "opengl.h"
    #include "texture.h"
     
    #include <GL/gl.h>										
    #include <GL/glu.h>
     
     
    GLuint tex_Mur[1];
    texture t2;
     
    Cube::Cube()
    {
    }
     
    Cube::Cube(const Vector& a,const Vector& b,char * Filename)
    {	
      Cube::a=a;
      Cube::b=b;
      tex_Mur[0]=t2.LoadGLTextures(Filename);
    }
     
    Cube::~Cube(){
     
    	glDeleteTextures(1,tex_Mur);	
    }
     
    void Cube::Render(const Camera& c)
    {
      // Ne dessine l'objet que s'il est visible
      if (!camera.View(box))
        return;
     
      glBindTexture(GL_TEXTURE_2D,tex_Mur[0]);
      glEnable(GL_TEXTURE_2D);
     
      glBegin(GL_QUADS);
     
      // Face z=-1
      glNormal3f(0.0f,0.0f,-1.0f);
      glVertex3f(a[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(a[0],b[1],a[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],a[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(b[0],a[1],a[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face z=+1
      glNormal3f(0.0f,0.0f,1.0f);
      glVertex3f(a[0],a[1],b[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(b[0],a[1],b[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(a[0],b[1],b[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face x=-1
      glNormal3f(-1.0f,0.0f,0.0f);
      glVertex3f(a[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(a[0],a[1],b[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(a[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(a[0],b[1],a[2]);
      glTexCoord2f(0.0f,1.0f);
     
     
      // Face x=+1
      glNormal3f(1.0f,0.0f,0.0f);
      glVertex3f(b[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(b[0],b[1],a[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(b[0],a[1],b[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face y=-1
      glNormal3f(0.0f,-1.0f,0.0f);
      glVertex3f(a[0],a[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(b[0],a[1],a[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],a[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(a[0],a[1],b[2]);
      glTexCoord2f(0.0f,1.0f);
     
      // Face y=+1
      glNormal3f(0.0f,1.0f,0.0f);
      glVertex3f(a[0],b[1],a[2]);
      glTexCoord2f(0.0f,0.0f);
      glVertex3f(a[0],b[1],b[2]);
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(b[0],b[1],b[2]);
      glTexCoord2f(1.0f,1.0f);
      glVertex3f(b[0],b[1],a[2]);
      glTexCoord2f(0.0f,1.0f);
     
      glEnd();
      glDisable(GL_TEXTURE_2D);
    }
    voila le .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    class Cube : public Shape
    {
    protected :
      Vector a,b;	 //!< Extremites du cube
    public :
      Cube();
      Cube(const Vector&,const Vector&,char *);
      ~Cube();
      void Render(const Camera&);
    };

  9. #9
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Donc voilà ton problème, c'est un problème C++ indépendant d'openGL

    tex_Mur est défini comme une variable globale à TOUT ton programme.

    Donc a chaque création d'un cube, ta valeur est écrasé par une nouvelle valeur.

    Pour avoir cette notion de tex_Mur par Cube, tu dois définir ton tableau comme attribut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Cube : public Shape
    {
    protected :
      Vector a,b;	 //!< Extremites du cube
      GLuint tex_Mur[1];
    
    public :
      Cube();
      Cube(const Vector&,const Vector&,char *);
      ~Cube();
      void Render(const Camera&);
    };
    Ainsi, tu aura un tex_Mur par instance de ta classe Cube.

    Bon courage

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    merci beaucoup raptor70 pour ton aide ça marche nickel.

    A++++++++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les textures projectives
    Par sylvain_bos dans le forum Ogre
    Réponses: 0
    Dernier message: 03/01/2011, 18h49
  2. Problème avec les textures
    Par Letinono dans le forum CUDA
    Réponses: 1
    Dernier message: 07/07/2009, 17h06
  3. DirectX / 3dsmax - Exportation et chargement .x, probleme avec les textures
    Par Nikamura dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 06/12/2007, 21h30
  4. probleme avec les textures
    Par fantazya_z dans le forum GLUT
    Réponses: 14
    Dernier message: 19/02/2007, 22h34
  5. 3D en Java. Problème avec les textures !
    Par dotrungtien dans le forum Moteurs 3D
    Réponses: 4
    Dernier message: 07/04/2006, 20h43

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