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

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2007
    Messages : 25
    Points : 93
    Points
    93
    Par défaut OpenGl VBO : problème de coordonnées de texturage
    voila le problème est que les textures sembles ne pas s'afficher comme il se doit, et je tourne en rond...

    déclaration des tableaux :
    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
     
    GLfloat CubeArray[] = {
    		0.0f, 0.0f, 0.0f,
    		1.0f, 0.0f, 0.0f,
    		2.0f, 0.0f, 0.0f,
    		3.0f, 0.0f, 0.0f,
    		0.0f, 1.0f, 0.0f,
    		1.0f, 1.0f, 0.0f,
    		2.0f, 1.0f, 0.0f,
    		3.0f, 1.0f, 0.0f,
    		0.0f, 2.0f, 0.0f,
    		1.0f, 2.0f, 0.0f,
    		2.0f, 2.0f, 0.0f,
    		3.0f, 2.0f, 0.0f,
    		0.0f, 3.0f, 0.0f,
    		1.0f, 3.0f, 0.0f,
    		2.0f, 3.0f, 0.0f,
    		3.0f, 3.0f, 0.0f,
    		0.0f, 4.0f, 0.0f,
    		1.0f, 4.0f, 0.0f,
    		2.0f, 4.0f, 0.0f,
    		3.0f, 4.0f, 0.0f
    };
    GLuint IndiceArray[] = {
    	1,2,6,
    	2,3,7,
    	6,7,11,
    	4,8,9,
    	8,12,13,
    	9,13,14
    };
    GLfloat TextureArray[] = {
       1.0,0.0,   0.0,0.0,   1.0,1.0,
       1.0,0.0,   0.0,0.0,   1.0,1.0,
       1.0,0.0,   0.0,0.0,   1.0,1.0,
       1.0,0.0,   0.0,0.0,   1.0,1.0,
       1.0,0.0,   0.0,0.0,   1.0,1.0,
       1.0,0.0,   0.0,0.0,   1.0,1.0,
    };
     
    enum
    {
    	// buffer ou sont stoqué les différents point
    	kVBO_POSITION_POINT = 0x00,
    	// buffer ou sont stoqué les coordonnées des textures
    	kVBO_TEXTURE_COORDONNEES,
    	// indice liant les différents points
    	kVBO_INDICES,
    	// nombre de buffer
    	kVBO_NB_BUFFER,
    };
     
    GLuint CubeBuffers[kVBO_NB_BUFFER];
    Code le l'initialisation :
    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
     
    	// Génération des buffers
    	glGenBuffers( kVBO_NB_BUFFER, CubeBuffers );
     
    	// Buffer d'informations de vertex
    	glBindBuffer(GL_ARRAY_BUFFER, CubeBuffers[kVBO_POSITION_POINT]);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(CubeArray), CubeArray, GL_STATIC_DRAW);
     
    	// Buffer d'indices
    	glBindBuffer(GL_ARRAY_BUFFER, CubeBuffers[kVBO_TEXTURE_COORDONNEES]);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(TextureArray), TextureArray, GL_STATIC_DRAW);
     
    	// Buffer des coordonnées des textures :
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, CubeBuffers[kVBO_INDICES]);
    	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(IndiceArray), IndiceArray, GL_STATIC_DRAW);
    et le code d'affichage :
    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
     
    glTranslatef(-2.0,-2.0,-5.19);
    glEnable (GL_TEXTURE_2D);
    	glBindTexture (GL_TEXTURE_2D, id_texture );;
    		glEnableClientState(GL_VERTEX_ARRAY);
    		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    			// Bind des buffers
    			glBindBuffer(GL_ARRAY_BUFFER , CubeBuffers[kVBO_POSITION_POINT]);
    			glVertexPointer(3, GL_FLOAT , 0 , (float *) NULL);
     
    			glBindBuffer(GL_ARRAY_BUFFER , CubeBuffers[kVBO_TEXTURE_COORDONNEES]);
    			glTexCoordPointer(2 , GL_FLOAT , 0 , (float *) NULL);
     
    			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, CubeBuffers[kVBO_INDICES]);
     
    			glDrawElements(GL_TRIANGLES, 6*3, GL_UNSIGNED_INT, 0);
     
    		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    		glDisableClientState(GL_VERTEX_ARRAY);
    glDisable (GL_TEXTURE_2D);
    le système de gestion des textures fonctionne correctement chez moi car j'arrive à afficher des textures avec les accès direct de oGL.

    résultat en pièce jointe : capture-41.png
    Images attachées Images attachées   

  2. #2
    Membre régulier

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2007
    Messages : 25
    Points : 93
    Points
    93
    Par défaut
    Vive les Nuit de repos....

    et oui c'est en me réveillant en pleine nuit que j'ai trouver la solution,

    Les coordonnées de texture ne sont pas associer au liaison des triangle mais au point de la texture. je m'explique:
    quand je faisait un triangle avec les point 1, 2 et 5, j'avais mis le tableaux de texture avec les point avec les coordonnées 0;0 ; 1;0 et 1;1, ET ca ne marchais pas puisque la VBO associe les coordonnées des texture non pas au liaisons des point mais au point eux même...

    ce qui donne pour que ca marche le tableaux 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
     
    GLfloat TextureArray[] = {
       0.00,0.0,
       0.25,0.0,
       0.50,0.0,
       0.75,0.0,
       0.00,0.25,
       0.25,0.25,
       0.50,0.25,
       0.75,0.25,
       0.00,0.50,
       0.25,0.50,
       0.50,0.50,
       0.75,0.50,
       0.00,0.75,
       0.25,0.75,
       0.50,0.75,
       0.75,0.75,
       0.00,1.0,
       0.25,1.0,
       0.50,1.0,
       0.75,1.0,
    };

    Et pour ceux qui voudrait dessiner un cube, ajouter les codes suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    GLuint IndiceArray_cube[] = {
    	0,1,5,4,
    	5,6,10,9,
    	10,11,15,14,
    	12,13,17,16,
    	13,14,18,17,
    	14,15,19,18
    };
    modifier l'enum des buffers par celui la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum
    {
    	// buffer ou sont stoqué les différents point
    	kVBO_POSITION_POINT = 0x00,
    	// buffer ou sont stoqué les coordonnées des textures
    	kVBO_TEXTURE_COORDONNEES,
    	// indice liant les différents points
    	kVBO_INDICES,
    	kVBO_INDICES_cube,
    	// nombre de buffer
    	kVBO_NB_BUFFER,
    };
    ajouter a l'initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, CubeBuffers[kVBO_INDICES_cube]);
    	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(IndiceArray_cube), IndiceArray_cube, GL_STATIC_DRAW);
    et à l'affichage ajouter :
    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
     
    glEnable (GL_TEXTURE_2D);
    	glBindTexture (GL_TEXTURE_2D, ma_texture->getGlId() );
    	//glBegin (GL_TRIANGLES);
    		// Tu dois activé les vertex et texture array AVANT de binder tes buffers
    		glEnableClientState(GL_VERTEX_ARRAY);
    		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    			// Bind des buffers
    			glBindBuffer(GL_ARRAY_BUFFER , CubeBuffers[kVBO_POSITION_POINT]);
    			glVertexPointer(3, GL_FLOAT , 0 , (float *) NULL);
     
    			glBindBuffer(GL_ARRAY_BUFFER , CubeBuffers[kVBO_TEXTURE_COORDONNEES]);
    			glTexCoordPointer(2 , GL_FLOAT , 0 , (float *) NULL);
     
    			glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, CubeBuffers[kVBO_INDICES_cube]);
     
    			//glDrawArrays(GL_TRIANGLES , 0 , 100);
    			glDrawElements(GL_QUADS, 6*4, GL_UNSIGNED_INT, 0);
     
    		glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    		glDisableClientState(GL_VERTEX_ARRAY);
    	//glEnd();
    glDisable (GL_TEXTURE_2D);
    Des optimisations sont surement faisable.... mais ce code fonctionne.


    Merci a tout ceux qui on chercher la source du problème.
    Images attachées Images attachées  

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

Discussions similaires

  1. opengl/glut Probleme de coordonnées souris/écran
    Par johan_b dans le forum OpenGL
    Réponses: 5
    Dernier message: 05/12/2006, 18h42
  2. Réponses: 2
    Dernier message: 16/10/2005, 20h19
  3. [OpenGL/C++] Problème Device Opengl
    Par Bob.Killer dans le forum OpenGL
    Réponses: 3
    Dernier message: 27/09/2005, 12h04
  4. [OpenGL/C++] Problème IndexBuffer
    Par Bob.Killer dans le forum OpenGL
    Réponses: 15
    Dernier message: 14/04/2005, 13h27
  5. problème de coordonnées
    Par Yennick dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 11/03/2005, 18h32

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