OpenGL mehrere Vertex-Attribute



  • Hi,

    ich rendere momentan mit glDrawElementsInstanced(). (Das Instanced ist hier aber eigentlich egal.)
    Bisher hatte ich zwei Puffer: Einen Vertex und einen Index Puffer. (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER)
    Jetzt möchte ich aber noch Normalen und Texturkoordinaten an meine Shader übergeben. Die Frage ist jetzt: Wie? Ich habe die Normalen und Texturkoordinaten genau so wie die Vertexe vorliegen, also als Punkt/Index Kombination. Das Einzige, was mir einfallen würde, ist das Index-System aufzulösen und die Daten direkt hintereinander zu schreiben. Aber dann müsste ich wieder glDrawArraysInstanced() nutzen und irgendwie habe ich das Gefühl, dass das doch auch anders funktionieren muss.

    Also mein Vertex Shader erwartet:

    in vec3 vertex_position;
    in vec2 vertex_texture_coord;
    in vec3 vertex_normal;
    

    Bisher habe ich die Position halt so "übertragen":

    glEnableVertexAttribArray(shader_vertex_pos_);
    glBindBuffer(GL_ARRAY_BUFFER, ...);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...);
    glVertexAttribPointer(shader_vertex_pos_, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawElementsInstanced(...)
    glDisableVertexAttribArray(shader_vertex_pos_);
    

    Jemand eine Idee dazu? Denn hier z.B. hat der die Daten halt hintereinandergeschrieben. (Und nutzt trotzdem glDrawElements(), aber ich glaube das ist bei mir so nicht möglich, ich bekomme die Daten aus einer Wavefront Obj Datei.)



  • Du kannst mehrere ARRAY_BUFFER aktivieren. Der erste Parameter von glVertexAttribPointer gibt an an welche Variable der ARRAY_BUFFER gebunden wird. Vielleicht hilft dir folgender Code-Ausschnitt von mir:

    GLuint vao;
    glGenVertexArrays(1,&vao);
    glBindVertexArray(vao);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffers[indexBuffer]);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffers[vertexBuffer]);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffers[textureVertexBuffer]);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,0);
    

    Die Indexe müssen aber bei allen ARRAY_BUFFER gleich sein.



  • Das sieht schon mal interessant aus, aber

    Gruum schrieb:

    Die Indexe müssen aber bei allen ARRAY_BUFFER gleich sein.

    ist leider etwas doof, denn die Indexe sind halt nicht gleich. Sonst könnte ich ja auch alles hintereinander in einen Puffer schreiben, so wie im verlinkten Beispiel. Hm.. ich fürchte langsam, dass ich doch wieder auf glDrawArrays zurückgreifen muss..


Log in to reply