2016-05-02 18 views
0

Ich habe ein Problem mit bekam Daten zu meinem Vertex-Shader zu senden:Wie sende ich Daten mit OpenGL an Vertex Shader?

glUseProgram(m_shaderPerso.getID()); 

    glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 

     glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
     glEnableVertexAttribArray(5); 

      glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_offsetColor)); 
      glEnableVertexAttribArray(6); 

       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); 


        glUniformMatrix4fv(0, 1, GL_FALSE, glm::value_ptr(projection)); 
        glUniformMatrix4fv(1, 1, GL_FALSE, glm::value_ptr(modelview)); 

        for(auto &x : m_mapPos) 
        { 
         glUniform1f(2, x.second.getX()); 
         glUniform1f(3, x.second.getY()); 
         glUniform1ui(4, s_map->getHauteur(x.second.getXint(),x.second.getYint())); 

         glDrawElements(GL_TRIANGLES, m_tailleI, GL_UNSIGNED_BYTE, 0); 
        } 


       glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

      glDisableVertexAttribArray(6); 

     glDisableVertexAttribArray(5); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 

glUseProgram(m_shaderPerso.getID()); 

:

#version 450 core 

layout (location = 5) in vec3 in_Vertex; 
layout (location = 6) in vec3 in_Color; 

in int gl_InstanceID; 

layout (location = 0) uniform mat4 projection; 
layout (location = 1) uniform mat4 modelview; 
layout (location = 2) uniform float posX; 
layout (location = 3) uniform float posY; 
layout (location = 4) uniform uint posZ; 

out vec4 v_color; 

void main() 
{ 

    float tmpX = posX; 
    float tmpY = posY; 
    uint tmpZ = posZ; 

    gl_Position = projection * modelview * vec4(in_Vertex.x + tmpX*2, in_Vertex.y + tmpY*2, in_Vertex.z + tmpZ, 1.0) + vec4(in_Color, 0.0); 

    v_color = vec4(in_Color,1.0); 
} 

Die in_Vertex fein funktioniert, aber die in_Color scheint schlechte Werte zu haben, ich die Daten als senden und ich initialisieren die VBO mit:

glGenBuffers(1, &m_vbo); 

glBindBuffer(GL_ARRAY_BUFFER, m_vbo); //Verrouillage VBO 

    glBufferData(GL_ARRAY_BUFFER, (tailleV * sizeof(float)) + (m_tailleI*3 * sizeof(float)), 0, GL_STATIC_DRAW); //Allocation memoire 

    glBufferSubData(GL_ARRAY_BUFFER, 0, tailleV * sizeof(float), m_vertices); //Transfert données vertices 

    glBufferSubData(GL_ARRAY_BUFFER, tailleV * sizeof(float), m_tailleI*3 * sizeof(float), m_color); //Transfert données couleurs 

glBindBuffer(GL_ARRAY_BUFFER, 0); 


glGenBuffers(1, &m_ibo); //Generation IBO (indices) 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo); //Verrouillage IBO 

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_tailleI * sizeof(GLubyte), 0, GL_STATIC_DRAW); //Allocation memoire 

    glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, m_tailleI * sizeof(GLubyte), m_indices); //Transfert données 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

ich weiß wirklich nicht, wo mein Fehler ist, so habe ich Ihnen den gesamten Code, sehr nützlich sein könnte. Ich weiß, dass die Arrays m_vertices, m_color und m_indices korrekt initialisiert sind und die Scheitelpunkte korrekt angezeigt werden, so dass der VBO für die Scheitelpunkte und die Indizes im VRAM gut sind. Ich habe wahrscheinlich einen Fehler gemacht, als ich die Daten gesendet habe, aber ich kann es 2 Tage lang nicht finden, und ich denke, dass ein neues Aussehen mir helfen könnte.

Danke fürs Lesen und wahrscheinlich :)

Antwort

1

Außer dem, was @HolyBlackCat sagte zu helfen, mischen Sie interleaved mode with batch mode. Wenn Ihr Ihr Puffer füllen, verwenden Sie Batch-Modus:

glBindBuffer(GL_ARRAY_BUFFER, m_vbo); //Verrouillage VBO 
glBufferData(GL_ARRAY_BUFFER, (tailleV * sizeof(float)) + (m_tailleI*3 * sizeof(float)), 0, GL_STATIC_DRAW); //Allocation memoire 
glBufferSubData(GL_ARRAY_BUFFER, 0, tailleV * sizeof(float), m_vertices); //Transfert données vertices 
glBufferSubData(GL_ARRAY_BUFFER, tailleV * sizeof(float), m_tailleI*3 * sizeof(float), m_color); //Transfert données couleurs 

Zuerst mit den Eckpunkten Punkten füllen, und am Ende des Puffers, mit Farbattribute.

Aber wenn man den Puffer verwenden, werden Sie es in verschachtelten Modus * mit:

glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_offsetColor)); 

eine auswählen und dabei bleiben.

* in glVertexAttribPointer Funktion, stride kann einen falschen Wert haben.

glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(m_offsetColor)) 

zu:

glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), BUFFER_OFFSET(tailleV * sizeof(float))) 

Wahrscheinlich können Sie Ihr Problem lösen, indem