我正在使用 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))
);