OpenGL绘制多个对象
问题描述:
通常人们在OpenGL 3.3+中通常绘制多个对象吗? 我有2个对象:地形和球体。对于每个对象我有2个数组(顶点和索引)。我试着设置不同的VBO和国际文凭组织(像这样):OpenGL绘制多个对象
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_VBOsphere);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBOsphere);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
,但看起来只有这个功能关闭后像GPU计算/绘制的一切,我只看到球体。所以我该怎么做?
答
它看起来像你误解了绑定缓冲区的意义,以及正确的调用顺序。
您预计在这个序列,绘制调用会得到它的顶点从VBO ID为m_VBO
:
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0);
这不是它的工作方式。当前的GL_ARRAY_BUFFER
绑定对绘制调用完全没有影响。
当调用glVertexAttribPointer()
时,您需要有正确的VBO绑定。除了指定设置相应属性(格式,步长等)的值的直接参数外,此调用还指定将当前绑定的VBO用作属性数据的源。
因此,您需要为每个对象调用glVertexAttribPointer()
,并在之后调用它们绑定相应的VBO。
调用顺序则是:
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, (size-1)*(size-1)*6, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, m_VBOsphere);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)12);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid*)20);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBOsphere);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
如果你想减少设置的叫你每次绘制调用之前需要数,查找顶点数组对象(VAO)。
+0
非常感谢您的回答! – user3051029 2015-02-07 19:31:59
我在这里没有看到任何问题。只是为了确保,如果你注释掉3行球体渲染,地形渲染效果会好吗? – HolyBlackCat 2015-02-06 20:30:07
@HolyBlackCat是的。 – user3051029 2015-02-06 20:42:42