2016-08-19 2 views
0

Ich versuche ein Netz mit mehreren Texturen zu zeichnen. Um dies zu tun, separiere ich Modell in Sub-Modelle basierend auf den Texturen.aufeinander folgende Aufrufe von glDrawElements

Hier ist der Code und Erläuterung:

  • Richten Sie machen Programm für Zeile RenderCommon und SetProjectViewModel Funktionen
  • gemeinsame Render nur initialisiert Puffer, wenn sie es nicht schon sind.

    RenderCommon(object); 
    SetProjectViewModel(m_basicProgramHandle, object, cam); 
    
  • Collect Mesh und seine submeshes durch die Brache für Schleife

    std::vector<Mesh*> meshes; 
    meshes.push_back(object->m_mesh.get()); 
    for (int i = 0; i < (int)object->m_mesh->m_subMeshes.size(); i++) 
        meshes.push_back(object->m_mesh->m_subMeshes[i]); 
    
  • als der Brache Code zeichnet Vordergrund jedes submesh mit glDrawElements

    for (auto mesh : meshes) 
        { 
        GLuint offset = 0; 
        glEnableVertexAttribArray(0); // Vertex 
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, object->m_mesh- >GetVertexSize(), 0); 
    
        offset += 3 * sizeof(float); 
        glEnableVertexAttribArray(1); // Normal 
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset); 
    
        offset += 3 * sizeof(float); 
        glEnableVertexAttribArray(2); // Texture 
        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), (const void*)offset); 
    
        glBindBuffer(GL_ARRAY_BUFFER, mesh->m_vboVertexId); 
    
        RenderState rs = mesh->m_material->m_renderState; 
        glBindTexture(GL_TEXTURE_2D, rs.m_diffuseTexture); 
    
        if (mesh->m_indexCount != 0) 
        { 
         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->m_vboIndexId); 
         glDrawElements(GL_TRIANGLES, mesh->m_indexCount, GL_UNSIGNED_INT, nullptr); 
        } 
        else 
        { 
         glDrawArrays(GL_TRIANGLES, 0, mesh->m_vertexCount); 
        } 
    

Ermöglicht es sagen ist ein Würfel und zwei Texturen für seine 6 Gesichter. 1 Gesicht hat eine Textur von 1 und eine andere Textur hat 0. Mit dieser Einstellung, wenn ich nur einen Gegenstand zeichne. Das ist gut. Wenn die for-Schleife jedoch 2 Elemente zeichnet, habe ich nur Vorder- und Rückseiten mit zwei verschiedenen Texturen gesehen. Statt 6 Gesichter. Das heißt, jedes Objekt ist nur teilweise gezeichnet.

Ich überprüfe Puffer und Textur IDs hundert Mal! Sie sind richtig. Wenn ich jeden Puffer einzeln zeichne, sind sie auch in Ordnung. Aber wenn ich sie hintereinander zeichne, erscheinen sie teilweise.

Antwort

0

Es scheint

glBindBuffer(GL_ARRAY_BUFFER, mesh->m_vboVertexId); 

, bevor eine der Brache Code erscheinen

glEnableVertexAttribArray(0); // Vertex 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, object->m_mesh->GetVertexSize(), 0); 
Verwandte Themen