使用不同的缓冲区在OpenGL中绘制多个对象

使用不同的缓冲区在OpenGL中绘制多个对象,opengl,Opengl,使用OpenGL着色器,我想渲染两个对象。每个都由三角形的一组顶点位置和顶点索引定义。当我创建缓冲区时,我使用以下代码: //对象1顶点位置 glBindBuffer(GL_数组_BUFFER,object1_顶点_BUFFER); glBufferData(GL_数组_缓冲区、object1_顶点_大小、object1_顶点、GL_静态_绘制); glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0); //对象1顶点索引 glBindBuffe

使用OpenGL着色器,我想渲染两个对象。每个都由三角形的一组顶点位置和顶点索引定义。当我创建缓冲区时,我使用以下代码:

//对象1顶点位置
glBindBuffer(GL_数组_BUFFER,object1_顶点_BUFFER);
glBufferData(GL_数组_缓冲区、object1_顶点_大小、object1_顶点、GL_静态_绘制);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0);
//对象1顶点索引
glBindBuffer(GL元素数组缓冲区、object1索引缓冲区);
glBufferData(GL元素数组缓冲区、object1索引大小、object1索引、GL静态绘图);
//对象2顶点位置
glBindBuffer(GL_数组_BUFFER,object2_顶点_BUFFER);
glBufferData(GL_数组_缓冲区、object2_顶点_大小、object2_顶点、GL_静态_绘制);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,0);
//对象2顶点索引
glBindBuffer(GL元素数组缓冲区、object2索引缓冲区);
glBufferData(GL元素数组缓冲区、object2索引大小、object2索引、GL静态绘图);
然后在渲染场景时,我使用以下代码:

//对象1
glBindBuffer(GL元素数组缓冲区、object1索引缓冲区);
GLD元素(GL_三角形,object1_num_索引,GL_无符号_INT,(void*)0);
//对象2
glBindBuffer(GL元素数组缓冲区、object2索引缓冲区);
GLD元素(GL_三角形,object2_num_索引,GL_无符号_INT,(void*)0);

但是,这只会导致绘制对象2。我做错了什么?

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

  • 必须通过调用
    GlenableVertexAttributeArray
    来启用顶点属性
  • 在图形代码中,仅重新绑定索引缓冲区,而不是顶点缓冲区。
    glBindBuffer(GL\u ARRAY\u BUFFER,
    glVertexAttribPointer
    都会更改当前状态,因此您将用第二个对象覆盖第一个对象设置。如果您确实想在没有VAOs的情况下工作,则必须在每次绘图调用之前绑定正确的缓冲区,并更新
    glVertexAttribPointer
  • 没有使用VAO(在核心配置文件中工作时必须使用VAO,但我建议在兼容模式下也使用VAO)

如果您有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);
否则,需要在绘图之间重复bind和
glvertexattributepointer
调用:

// 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);

谢谢。这是有道理的,我尝试了一下,但它仍然不能正常工作……我在网站上发布了一个新问题,更新了代码:你是如何在这里使用着色器的?