我是否必须为每个渲染的网格在每一帧调用 glVertexAttribPointer()?
Do I have to call glVertexAttribPointer() each frame, for each rendered mesh?
我看过其他人的代码,他们在初始化 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() 吗?
顶点属性指针和索引缓冲区是 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);
我看过其他人的代码,他们在初始化 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() 吗?
顶点属性指针和索引缓冲区是 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);