我正在使用 OpenGL (3.x) 迈出第一步,我计划使用 VAO 和 VBO 来绘制几个图形(三角形、立方体......):
现在我得到了以下设置:
VAO --> VBO [顶点,颜色] + VBO [索引]
其中“顶点”具有 [3 * 3floats 三角形顶点,8*3 立方体浮点],“颜色”具有每个顶点的 RGB(无 alpha),“索引”具有 [三角形:0,1,2,正方形:0,1 ,2, 0,2,3, ...]
现在,如果我使用“glDrawElements”进行绘制。我只看到正确绘制的系列中的第一个图(并获得正确的颜色),第二个不能正常工作。
所以如果我先渲染三角形数据,它就像:

如果我先渲染立方体,它就像:

注意:三角形是红色的,立方体是彩色的,所以第一个图总是按我的预期显示
这可以使用“glDrawArrays”(带有偏移量 + 三角形计数)而不是 drawElements 绘制数组,但是,当然,索引会使数据数组 muuuuuch 更小。所以我想做这个动作。
我如何绘制相同的设置但使用索引?我应该调用另一种方法吗?
这是我用来准备 VBO 数据的代码,以防有疑问。
// VBOS solid
    glBindBuffer(GL_ARRAY_BUFFER, vboSolid[0]);
    glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat),&vertices[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vboSolid[1]);
    glBufferData(GL_ARRAY_BUFFER, colors.size()*sizeof(GLfloat),&colors[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vboIndex );
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLuint),&indices[0], GL_STATIC_DRAW);
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
这是我在渲染时所做的调用。在这个循环中,三角形的 indicesCount=3 和 offset=0,而立方体分别有 24 和 3。
glDrawElements(
   GL_TRIANGLES,      
   primitives[i]->indicesCount,    
   GL_UNSIGNED_INT,  
   (void*) (primitives[i]->offsetIndices*sizeof(GLuint))   
);
