Bonjours à tous,

Je suis actuellement en train de me former à openGL et essaye de créer une carte en utilisant un heightmap, mon gestionnaire de fenêtre est SFML2 qui me permet aussi de charger les images (heightmap + textures)

malheureusement, je coince un peu sur l'utilisation des vbo, ou plutot de texturer les terrain qui est stocké dans un vbo.

Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
struct Vertex
{
    GLfloat x, y, z;        // position
    GLfloat nx, ny, nz;     // normale
    GLfloat s, t;           // texCoord
    GLubyte r, g, b;        // couleur
    GLubyte padding[29];    // alignement sur 32 bits (http://www.opengl.org/wiki/VBO)
};
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
void Terrain::setVBO()
{
    m_vbo = new Vertex[ m_height * m_width ];
    if( !m_vbo )
    {
        cerr << "Allocation de m_vbo impossible";
        exit(1);
    }
 
    uint index = 0;
    for(uint i=0; i<m_width; i++)
    {
        for(uint j=0; j<m_height; j++)
        {
            m_vbo[index].x = (GLfloat) i * m_pas_x;
            m_vbo[index].y = (GLfloat) m_heightmap.GetPixel(i, j).r * m_pas_y;
            m_vbo[index].z = (GLfloat) j * m_pas_z;
 
            m_vbo[index].r = m_heightmap.GetPixel(i, j).r;
            m_vbo[index].g = m_heightmap.GetPixel(i, j).r;
            m_vbo[index].b = m_heightmap.GetPixel(i, j).r;
 
            m_vbo[index].s = ((GLfloat) i)/m_width; 
            m_vbo[index].t = ((GLfloat) j)/m_height;
 
            index++;
        }
    }
 
    glGenBuffers(1, &m_id_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, m_id_vbo);
    glBufferData(GL_ARRAY_BUFFER, m_width*m_height*sizeof(Vertex), m_vbo, GL_STATIC_DRAW);
 
    /***************************************/
//    m_texture = new sf::Image(); 
//    m_texture->LoadFromFile("textures/Text_main.gif");
//
//    GLuint m_id_tex;
//    glGenTextures(1, &m_id_tex);
//    glBindTexture(GL_TEXTURE_2D, m_id_tex);
//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
//    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_texture->GetWidth(), m_texture->GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_texture->GetPixelsPtr());
 
    /***************************************/
 
    // le tableau est chargé dans la RAM du GPU, on en a plus besoin
    delete[] m_vbo; m_vbo = NULL;
}
j'ai mis en commentaire ce que j'ai tenté de faire et qui ne fonctionne pas

et voici 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
void Terrain::draw() const
{
    glBindBuffer(GL_ARRAY_BUFFER, m_id_vbo);
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));
    glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(Vertex), BUFFER_OFFSET(32)); // les couleurs sont au 32ieme byte de la structure Vertex
//    glTexCoordPointer( 2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(24)); // les coordonnées de texture sont au 32ieme byte de la structure Vertex
 
    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_COLOR_ARRAY );
//    glEnableClientState( GL_TEXTURE_COORD_ARRAY );
 
    glDrawElements(m_modeDessin, 6*(m_height-1)*(m_width-1), GL_UNSIGNED_INT, BUFFER_OFFSET(0));
 
//    glDisableClientState( GL_TEXTURE_COORD_ARRAY );
    glDisableClientState( GL_COLOR_ARRAY );
    glDisableClientState( GL_VERTEX_ARRAY );
}
Malgré mes différents tests, je n'arrive pas à texturer ma map :-(
J'en appel donc à votre aide pour m'expliquer comment faire ou me donner un lien. Merci d'avance.

ps: si mon code est buggé ou mauvais, j'aimerais tous les conseils dessus