2015-12-03 59 views
1

在OpenGL中着色器,我想呈现两个对象。每个由三角形的一组顶点位置和顶点索引定义。当我把我的缓冲区,我使用下面的代码:绘制在OpenGL多个对象用不同的缓冲区

// Object 1 vertex positions 
glBindBuffer(GL_ARRAY_BUFFER, object1_vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, object1_vertices_size, object1_vertices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

// Object 1 vertex indices 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object1_index_buffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, object1_indices_size, object1_indices, GL_STATIC_DRAW); 

// Object 2 vertex positions 
glBindBuffer(GL_ARRAY_BUFFER, object2_vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, object2_vertices_size, object2_vertices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

// Object 2 vertex indices 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object2_index_buffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, object2_indices_size, object2_indices, GL_STATIC_DRAW); 

,然后当我使我的场景,我使用下面的代码:

// Object 1 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object1_index_buffer); 
glDrawElements(GL_TRIANGLES, object1_num_indices, GL_UNSIGNED_INT, (void*)0); 

// Object 2 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object2_index_buffer); 
glDrawElements(GL_TRIANGLES, object2_num_indices, GL_UNSIGNED_INT, (void*)0); 

然而,这仅导致物体2被抽。我究竟做错了什么?

回答

1

如果你有openGL的3.3+你应该使用VAO:

glBindVertexArray(vao1); 
// Object 1 vertex positions 
glBindBuffer(GL_ARRAY_BUFFER, object1_vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, object1_vertices_size, object1_vertices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

// Object 1 vertex indices 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object1_index_buffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, object1_indices_size, object1_indices, GL_STATIC_DRAW); 

glBindVertexArray(vao2); 
// Object 2 vertex positions 
glBindBuffer(GL_ARRAY_BUFFER, object2_vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, object2_vertices_size, object2_vertices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

// Object 2 vertex indices 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object2_index_buffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, object2_indices_size, object2_indices, GL_STATIC_DRAW); 

,然后你只需要正确的VAO结合绘图时:

// Object 1 
glBindVertexArray(vao1); 
glDrawElements(GL_TRIANGLES, object1_num_indices, GL_UNSIGNED_INT, (void*)0); 

// Object 2 
glBindVertexArray(vao2); 
glDrawElements(GL_TRIANGLES, object2_num_indices, GL_UNSIGNED_INT, (void*)0); 

否则就需要重复绑定和调用glVertexAttribPointer之间绘制:

// Object 1 
glBindBuffer(GL_ARRAY_BUFFER, object1_vertex_buffer); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object1_index_buffer); 
glDrawElements(GL_TRIANGLES, object1_num_indices, GL_UNSIGNED_INT, (void*)0); 

// Object 2 
glBindBuffer(GL_ARRAY_BUFFER, object2_vertex_buffer); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, object2_index_buffer); 
glDrawElements(GL_TRIANGLES, object2_num_indices, GL_UNSIGNED_INT, (void*)0); 
+0

感谢。这是有道理的,我给它一个去,但它仍然不能正常工作....我已经发布了一个新的问题,我的更新代码在:http://stackoverflow.com/questions/34072056/rendering-two-对象 - 与的OpenGL和 - 顶点数组的对象 – Karnivaurus

1

如果这是所有本代码,那么有几个问题:

  • 一个人,使顶点致电glEnableVertexAttribArray属性。
  • 在绘图代码中,您只重新绑定索引缓冲区,而不是顶点缓冲区。 glBindBuffer(GL_ARRAY_BUFFER,...glVertexAttribPointer都改变了当前状态,所以你将覆盖第一个对象设置和第二个对象设置。如果你真的想不VAOs工作,你就必须结合每个绘图调用之前正确的缓冲和更新glVertexAttribPointer
  • 没有使用任何VAO(VAOs在核心配置文件工作时是强制性的,但我会建议使用它们还兼容模式)
相关问题