Partage
  • Partager sur Facebook
  • Partager sur Twitter

OpenGL 4.x avec classe

Sujet résolu
    7 février 2019 à 22:57:05

    Bonjour à tous,

    Depuis quelques jours je me suis mis à OpenGL "nouvelle génération" en suivant différents tutoriels que j'ai pu trouver ça et là (y compris celui de OpenClassroom). J'ai pu donc faire un peu ce que je voulais en exploitant l'orientation objet.

    Pour des raisons pratiques, je souhaite réorganiser mon code, et particulièrement séparer la partie "chargement du modèle" et la partie "affichage" sous une forme similaire au code ci-dessous :

    void CMesh::initBuffers()
    {
    	// generates buffers
    	glGenVertexArrays(1, &this->m_vao);
    	glGenBuffers(1, &this->m_vbo);
    	glGenBuffers(1, &this->m_nbo);
    	glGenBuffers(1, &this->m_cbo);
    	glGenBuffers(1, &this->m_ebo);
     
    	// generates, bind and fill buffers :
    	glBindVertexArray(this->m_vao);
    		//1) VBO
    		glBindBuffer(GL_ARRAY_BUFFER, this->m_vbo);
    			glBufferData(GL_ARRAY_BUFFER, this->m_vertex.size() * sizeof(GLfloat), &this->m_vertex[0], GL_STATIC_DRAW);
    			glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    			glEnableVertexAttribArray(0);
     
    		//2) NBO
    		glBindBuffer(GL_ARRAY_BUFFER, this->m_nbo);
    			glBufferData(GL_ARRAY_BUFFER, this->m_normal.size() * sizeof(GLfloat), &this->m_normal[0], GL_STATIC_DRAW);
    			glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    			glEnableVertexAttribArray(1);
     
    		//3) CBO
    		glBindBuffer(GL_ARRAY_BUFFER, this->m_cbo);
    			glBufferData(GL_ARRAY_BUFFER, this->m_color.size() * sizeof(GLfloat), &this->m_color[0], GL_STATIC_DRAW);
    			glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    			glEnableVertexAttribArray(2);
     
    		//3) EBO
    		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_ebo);
    			glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->m_element.size() * sizeof(GLfloat), &this->m_element[0], GL_STATIC_DRAW);
     
    	// liberates buffers
    	glBindVertexArray(0);
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    	glBindBuffer(GL_ARRAY_BUFFER, 0);
     
    }
     
    ///// CLASSE RENDER, A EXECUTER DANS LA BOUCLE PRINCIPALE /////
    void CRender::draw(const CMesh &obj)
    {
    	glBindVertexArray(this->obj.getVAO());
    	glDrawElements(GL_TRIANGLES, this->obj.getElementSize(), GL_UNSIGNED_INT, 0);
            glBindVertexArray(0);
    }

    la classe "CMesh" s'occupe donc de charger les buffer et "CRender" s'occupe uniquement, en gros, de dire "affiche moi ça". Je n'ai pas intégré la gestion des shader dans le code ci-dessus, mais en gros, c'est la classe CRender qui s'occupe, via un objet de type "CShader", de charger, compiler, linker et activer les shader.

    J'ai donc implémenté ça et..... Surprise, J'obtiens une fenêtre sans le modèle qui devrait s'y afficher !

    J'ai vérifié par rapport à mon autre version du code qui fonctionne correctement, mais les pistes à explorer pour enfin obtenir mon affichage semblent se trouver ailleurs.... Une idée ?

    Merci d'avance.

    EDIT : sujet résolu en 5 minutes.... Comme quoi il suffit parfois de poser une question pour en avoir la réponse... Les EBO sont de type uint et pas float... deux modifications mineures et le sujet est résolu...



    -
    Edité par BioKore 7 février 2019 à 23:17:11

    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2019 à 0:03:38

      Lu', 

      Ce n'est qu'un avis personnel, mais je ne pense pas que ce soit à ta classe CMesh de gérer tout ce qui VAO et consort. Ça rend ta classe très "OpenGL-dependant".  Cette classe devrait plutôt stocker tout ce qui vertices, normales, etc... côté CPU et ce serait à une classe/fonction tierce de "gerer" le mesh côté GPU. 

      • Partager sur Facebook
      • Partager sur Twitter

      Eug

      OpenGL 4.x avec classe

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown