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 mesh chargé [OpenGL 4.x]


Sujet :

OpenGL

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 56
    Points
    56
    Par défaut Impossible d'afficher un mesh chargé
    Bonsoir à tous;

    J'essaie désespérément d'afficher une simple cube avec un fichier .obj. Ce fichier contient les vertices, les normals et les uvs.

    Le chargement des valeurs ne pose pas de problème (les valeurs affichés dans la console correspondent aux fichier) mais je n'arrive pas à afficher ce petit cube
    Le problème ne vient pas de la caméra puisque j'arrive à faire le rendu d'un cube avec les anciennes fonctions (glBegin etc...) et la position de la camera semble correspondre au rendu.
    Donc j'en déduis qu'il y a de la casse au niveau de la VAO/VBO ou du shader...

    //Upload des VBO et attribution des pointer au VAO:
    (Les buffers sont de simple vector<GLfloat> avec les valeurs des vertices à la suite)
    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
    //VBO Vertex
    	glGenBuffers(1, &VertexBufferID);
    	glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buffer_vertices.size(), &buffer_vertices, GL_STATIC_DRAW);
    	//VBO Normals
    	glGenBuffers(1, &NormalBufferID);
    	glBindBuffer(GL_ARRAY_BUFFER, NormalBufferID);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buffer_normals.size(), &buffer_normals, GL_STATIC_DRAW);
    	//VBO UV
    	glGenBuffers(1, &UVBufferID);
    	glBindBuffer(GL_ARRAY_BUFFER, UVBufferID);
    	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buffer_uvs.size(), &buffer_uvs, GL_STATIC_DRAW);
     
    	//VAO
    	glGenVertexArrays(1, &VertexArrayID);
    	glBindVertexArray(VertexArrayID);
    	//Configurer la VAO
     
    	//Vertices
    	glEnableVertexAttribArray(0);
    	glBindBuffer(GL_ARRAY_BUFFER, VertexBufferID);
    	glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    	//UVs
    	glEnableVertexAttribArray(1);
    	glBindBuffer(GL_ARRAY_BUFFER, UVBufferID);
    	glVertexAttribPointer((GLuint)1, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    	//Normals
    	glEnableVertexAttribArray(2);
    	glBindBuffer(GL_ARRAY_BUFFER, NormalBufferID);
    	glVertexAttribPointer((GLuint)2, 3, GL_FLOAT, GL_FALSE, 0, 0); 
     
     
     
    	//Desactiver le VAO et VBO
    	glEnableVertexAttribArray(0);
    	glBindBuffer(GL_ARRAY_BUFFER, 0);
    	glBindVertexArray(0);
    //DrawCall:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //m_staticmesh[i]->GetMaterial()->shader->Use();
    				GLuint ProgramID = m_staticmesh[i]->GetMaterial()->shader->GetProgram();
    				glUseProgram(ProgramID);
    				GLuint MVPid = glGetUniformLocation(ProgramID, "MVP");
    				glUniformMatrix4fv(MVPid, 1, GL_FALSE, &m_activecamera->MVP()[0][0]);
     
    				Mesh* mesh = m_staticmesh[i]->GetMesh();
    				glBindVertexArray(m_staticmesh[i]->GetMesh()->GetVAO()); //GetVAO() retourne l'id de la vao du mesh
    				glDrawArrays(GL_TRIANGLES, 0, mesh->vertices.size());
    				glBindVertexArray(0);
    				glUseProgram(0);
    Et les shaders,
    Vertex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #version 400 core
     
    layout(location = 0) in vec3 VertexPosition;
    layout(location = 1) in vec2 UV;
    layout(location = 2) in vec3 Normal;
     
    uniform mat4 MVP;
     
    void main()
    {
    	gl_Position = MVP * vec4(VertexPosition,1);
    }
    Fragment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #version 400 core
     
    out vec4 color;
     
    void main()
    {
    	color = vec4(1,0,0,1);
    }
    Merci !

  2. #2
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Salut!

    Quel est le rendu final?
    As-tu fait des appels à glGetError pour savoir s'il y a un quelconque problème, au niveau initialisation comme au niveau rendu?
    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).

  3. #3
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Je suis sûr que ça viens des lignes du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buffer_vertices.size(), &buffer_vertices, GL_STATIC_DRAW);
    il faut soit utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buffer_vertices.size(), &buffer_vertices[0], GL_STATIC_DRAW);
    Soit utiliser (en c++11 voir vector::data)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * buffer_vertices.size(), buffer_vertices.data(), GL_STATIC_DRAW);
    EDIT: J'ai vérifiée en remplaçant mes vertices.data() par &vertices et j'obtiens bien des résultats inattendu.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 56
    Points
    56
    Par défaut
    Ok, désolé pour la réponse tardive, remplacer le &vertices par vertices.data() à corrigé le problème
    Par contre je ne comprend pas pourquoi on doit spécifier à OpenGL un point d'entré du tableau :/
    Je veux dire ça serai peut être plus simple de donner la taille de son tableau et l'adresse du tableau ...
    Il doit surement y avoir des raisons plus obscures à cela ^^
    Merci pour votre aide !

  5. #5
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    De rien.
    Un std::vector n'est pas juste un simple tableau, donc quand tu fais &vertices tu donne l'adresse de l'objet std::vector ce qui revient à peu près à donner l'adresse d'une structure qui ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
       int tailleTotale;
       int tailleAllouee;
       value_type* tab;
    };
    Alors que donner un pointeur sur le premier élément permet de parcourir le tableau sachant la taille car std::vector stocke les valeurs dans un tableau continu. Pour être plus précis, vertices.data(); retourne un pointeur sur le tableau.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. impossible d'afficher la page
    Par illegalsene dans le forum Apache
    Réponses: 1
    Dernier message: 17/01/2006, 10h07
  2. impossible d'afficher
    Par cyrill.gremaud dans le forum Flash
    Réponses: 3
    Dernier message: 19/12/2005, 12h56
  3. Réponses: 2
    Dernier message: 21/07/2005, 14h20
  4. [EasyPHP]"impossible d'afficher la page"
    Par Nip dans le forum Apache
    Réponses: 3
    Dernier message: 07/04/2005, 21h23
  5. Impossible de charger un mesh...
    Par wikers dans le forum DirectX
    Réponses: 2
    Dernier message: 09/12/2004, 19h33

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