Bonjour,
Je débute en OpenGL et cela fait maintenant deux jours que je bloque.
J'ai fait un tutoriel pour pouvoir dessiner un triangle, jusque là ça va mais j'ai besoin de charger un .obj et l'afficher.
J'ai chargé ce .obj grâce un bout de code trouvé sur le web, cela fonctionne. Toutes les données sont stockées dans des vectors.
Dans mon code je commence par allouer la mémoire pour les deux tableaux de vertices et faces.
Ensuite je remplis ces tableaux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 GLfloat * vertices = (GLfloat*)malloc(sizeof(GLfloat) * model.object_.vertices.size() * 3); GLuint * faces = (GLuint*)malloc(sizeof(GLuint) * model.object_.faces.size() * 4); // 4 car dans le .obj il y a 4 vertices par faces.
Ensuite je crée, link mon vertex shader et fragment shader et le VBO, VAO et EBO. Je vous épargne ce code car je sais qu'il fonctionne mais si n'hésitez pas à le demander.
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 for (int i = 0; i < model.object_.vertices.size(); i++) { vertices[j] = model.object_.vertices.at(i).coords[0]; vertices[j + 1] = model.object_.vertices.at(i).coords[1]; vertices[j + 2] = model.object_.vertices.at(i).coords[2]; j += 3; } j = 0; for (int i = 0; i < model.object_.faces.size(); ++i) { faces[j] = model.object_.faces.at(i).items.at(0).vertexIndex - 1; // -1 car le tableau des vertices commence à 0 faces[j + 1] = model.object_.faces.at(i).items.at(1).vertexIndex - 1; faces[j + 2] = model.object_.faces.at(i).items.at(2).vertexIndex - 1; faces[j + 3] = model.object_.faces.at(i).items.at(3).vertexIndex - 1; j += 4; }
Voici la boucle while indispensable à GLFW.
Tout cela m'affiche seulement la couleur verdâtre du glClearColor.
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 while (!glfwWindowShouldClose(window)) { glfwPollEvents(); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); glBindVertexArray(VAO); // La taille est comme cela car il y a 4 vertices par faces dans le .obj glDrawElements(GL_TRIANGLES, model.object_.faces.size() * 4, GL_UNSIGNED_INT, 0); glBindVertexArray(0); glfwSwapBuffers(window); } Ensuite quand on quitte la boucle je free le VAO, VBO, EBO.
Quand je mets quelques valeurs du obj en dur dans un tableau et que je change la taille dans glDrawElements en conséquence cela fonctionne !
Je ne comprends vraiment pas...
De plus,
Je ne mets que ce code dans la boucle bien sûr en plus des choses indispensables de GLFW.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 glColor3f(0.0f, 0.0f, 1.0f); glBegin(GL_POLYGON);//begin drawing of polygon glVertex3f(-0.5f, 0.5f, 0.0f);//first vertex glVertex3f(0.5f, 0.5f, 0.0f);//second vertex glVertex3f(1.0f, 0.0f, 0.0f);//third vertex glVertex3f(0.5f, -0.5f, 0.0f);//fourth vertex glVertex3f(-0.5f, -0.5f, 0.0f);//fifth vertex glVertex3f(-1.0f, 0.0f, 0.0f);//sixth vertex glEnd();//end drawing of polygon
ne fonctionne pas non plus...
Si vous avez des idées, je suis preneur !
Merci
Partager