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) };j'ai mis en commentaire ce que j'ai tenté de faire et qui ne fonctionne pas
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; }
et voici le code d'affichage:
Malgré mes différents tests, je n'arrive pas à texturer ma map :-(
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 ); }
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![]()
Partager