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
    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

  2. #2
    Membre régulier
    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.

###raw>template_hook.ano_emploi###