IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

OpenGL Discussion :

Impossible d'afficher un .obj ou glVertex3f même après chargement


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Par défaut Impossible d'afficher un .obj ou glVertex3f même après chargement
    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.

    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 remplis ces 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
     
    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;	
    }
    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.

    Voici la boucle while indispensable à GLFW.

    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.
    Tout cela m'affiche seulement la couleur verdâtre du glClearColor.
    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,

    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
    Je ne mets que ce code dans la boucle bien sûr en plus des choses indispensables de GLFW.

    ne fonctionne pas non plus...

    Si vous avez des idées, je suis preneur !

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par j_sb12 Voir le message
    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.

    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.
    C'est très bien les vector, pourquoi allouer des tableaux manuellement ?

    Si tu veux une copie c'est simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<GLfloat> vertices = model.object_.vertices;
    std::vector<GLuint> faces = model.object_.faces;
    Citation Envoyé par j_sb12 Voir le message
    Ensuite je remplis ces tableaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    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;
    }
    Ça c'est bon (une simple copie).

    Citation Envoyé par j_sb12 Voir le message
    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
     
    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;	
    }
    [...]
    // 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); // des triangles composés de 4 vertices ? :o
    Çà c'est plus suspect, tu devrais triangulariser ton modèle (que ce soit sous Blender, lors de l'export, ou lors de l'import).
    Si tu ne triangularise pas, il faut dessiner des GL_QUADS et non des GL_TRIANGLES.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Par défaut
    Salut,

    C'est très bien les vector, pourquoi allouer des tableaux manuellement ?
    Parce DrawElements demande un GLVoid* et je ne pense pas qu'un vector fonctionne dans cette fonction.

    Çà c'est plus suspect, tu devrais triangulariser ton modèle (que ce soit sous Blender, lors de l'export, ou lors de l'import).
    Si tu ne triangualise pas, il faut dessiner des GL_QUADS et non des GL_TRIANGLES.
    J'ai triangualisé le .obj sous Blender. J'ai modifié le code en conséquence. J'ai passé j à j += 3 pour le décalage et supprimé la dernière ligne d'ajout.

    Dans drawElements j'ai mis GL_TRIANGLES et une taille de 10 pour tester sur peu de points. Toujours rien.

    En ce qui concerne le glVertex3f, je sais que c'est du vieuw openGL mais il fallait bien que je teste au moins un affichage..

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    vector fonctionne tout à fait avec glDrawElements grâce à son utilisation de mémoire continue.
    Tu peux donc utiliser &monvector[0] ou monvector.data()
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Par défaut
    Je pensais que c'était justement le contraire, je pensais qu'ils n'étaient pas à la suite.

    J'ai dû mal écouter en cours... haha

    Je teste ça et je vous dis !

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Par défaut
    Bon j'ai tout mis dans deux vectors.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (int i = 0; i < model.object_.vertices.size(); i++)
    {
    	vertices.push_back(model.object_.vertices.at(i).coords[0]);
    	vertices.push_back(model.object_.vertices.at(i).coords[1]);
    	vertices.push_back(model.object_.vertices.at(i).coords[2]);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (int i = 0; i < model.object_.faces.size(); ++i)
    {
    	faces.push_back(model.object_.faces.at(i).items.at(0).vertexIndex - 1);
    	faces.push_back(model.object_.faces.at(i).items.at(1).vertexIndex - 1);
    	faces.push_back(model.object_.faces.at(i).items.at(2).vertexIndex - 1);	
    }
    Ensuite j'ai modifié les glBufferData mais je suis sceptique. Dois-je mettre faces.data() ou alors &faces ? idem pour vertices.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices.data(), GL_STATIC_DRAW);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(faces), faces.data(), GL_STATIC_DRAW);

    Pour drawElements j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glDrawElements(GL_TRIANGLES, faces.size(), GL_UNSIGNED_INT, faces.data());
    Toujours rien.

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/12/2011, 20h09
  2. Réponses: 3
    Dernier message: 27/02/2009, 13h57
  3. impossible d'afficher
    Par cyrill.gremaud dans le forum Flash
    Réponses: 3
    Dernier message: 19/12/2005, 12h56
  4. Réponses: 2
    Dernier message: 21/07/2005, 14h20
  5. [EasyPHP]"impossible d'afficher la page"
    Par Nip dans le forum Apache
    Réponses: 3
    Dernier message: 07/04/2005, 21h23

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