对于每个渲染的网格,我是否必须为每个帧调用glVertexAttribPointer()?

时间:2017-02-23 09:09:32

标签: c++ opengl opengl-3

我已经看到了其他人的代码,他们在初始化vao时只调用了glVertexAttribPointer()。当我这样做时,只有我场景中的第一个对象被渲染,但是如果我每个帧调用它*每个对象,一切都会很好......这是否意味着我必须在绘制之前为每个对象设置glVertexAttribPointer()?或者我错过了什么?!

        glBindVertexArray(mesh->getVao());
        glBindBuffer(GL_ARRAY_BUFFER, mesh->getVbo());

        for(int i = 0; i < 5; i++)
            glEnableVertexAttribArray(i);

        // Vertex Positions
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
        offset++;
        // Vertex UVs
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
        offset++;
        // Vertex Normals
        glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
        offset++;
        // Vertex Tangents
        glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
        offset++;
        // Vertex Binormals
        glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);

        // Draw
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->getVbo());
        glDrawElements(GL_TRIANGLES, mesh->getNumberOfIndices(), GL_UNSIGNED_SHORT, (void*)0);

        for (int i = 0; i < 5; i++)
            glDisableVertexAttribArray(i);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);

这是每个对象1次绘制调用。它工作得很完美,但是我真的需要为每个对象调用glVertecAttribPointer()吗?

1 个答案:

答案 0 :(得分:5)

顶点属性指针和索引缓冲区是VAO状态的一部分,因此它们只需在开头调用一次。

初​​始化:

glGenVertexArray(1, &vao);
glBindVertexArray(vao);

for(int i = 0; i < 5; i++)
    glEnableVertexAttribArray(i);

// Vertex Positions
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
offset++;
// Vertex UVs
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
offset++;
// Vertex Normals
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
offset++;
// Vertex Tangents
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);
offset++;
// Vertex Binormals
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 0, (void*)*offset);

// Index Buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->getVbo());

//Unbind VAO
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //Unbind the index buffer AFTER the vao has been unbinded

在每个帧调用中

glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, mesh->getNumberOfIndices(), GL_UNSIGNED_SHORT, (void*)0);
glBindVertexArray(0);