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计算/绘制的一切,我只看到球体。所以我该怎么做?

+0

我在这里没有看到任何问题。只是为了确保,如果你注释掉3行球体渲染,地形渲染效果会好吗? – HolyBlackCat 2015-02-06 20:30:07

+0

@HolyBlackCat是的。 – user3051029 2015-02-06 20:42:42

它看起来像你误解了绑定缓冲区的意义,以及正确的调用顺序。

您预计在这个序列,绘制调用会得到它的顶点从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