编辑:我刚刚意识到,如果您不使用着色器,这可能不适用,但由于我不熟悉旧版 OpenGL,我不确定我的帖子对您有什么好处。您正在使用/定位哪个版本?
我最近在这里问了一个关于 glDrawElements 的问题。希望我发布的内容能提供一些解释/示例。
我理解它的方式:你的索引是由你决定的,所以如果你想从第二个顶点开始,你可以尝试(一个基本的骨架,没有 glVertexAttribPointer 调用等,但如果你愿意,我可以添加这些):
const float VBOdata = {
//Some X and Y coordinates for triangle1 (in the first quadrant)
//(z = 0, w = 1 and are not strictly necessary here)
0.0f, 1.0f, 0.0f, 1.0f //index 0
0.0f, 0.0f, 0.0f, 1.0f //1
1.0f, 0.0f, 0.0f, 1.0f //2
//Some X and Y coordinates for triangle2 (in the second quadrant)
0.0f, -1.0f, 0.0f, 1.0f //3
0.0f, 0.0f, 0.0f, 1.0f //4
-1.0f, 0.0f, 0.0f, 1.0f //5
//Now some color data (all white)
1.0f, 1.0f, 1.0f, 1.0f, //0
1.0f, 1.0f, 1.0f, 1.0f, //1
1.0f, 1.0f, 1.0f, 1.0f, //2
1.0f, 1.0f, 1.0f, 1.0f, //3
1.0f, 1.0f, 1.0f, 1.0f, //4
1.0f, 1.0f, 1.0f, 1.0f, //5
};
const GLubyte indices[] = {
3, 4, 5,
};
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, indices);
其中 GL_TRIANGLES 是原语的类型,3 是“索引”中元素的数量,GL_UNSIGNED_BYTE 是如何解释它们,“索引”只是数组的名称。
这应该只绘制第二个三角形。您也可以尝试glDrawElementsBaseVertex,但我自己没有亲自尝试过。我收集到的是,您将从 0 开始生成/显式编码您的索引,但给出一个偏移量,以便它实际上在 0+offset、1+offset 等处读取。
这有帮助吗?