在OpenGL中使用VBO的偏移量

时间:2012-02-24 13:56:26

标签: c++ opengl vbo

我想要做的是使用相同的vbo多次渲染网格但具有不同的偏移。例如:

//Load VBO
glGenBuffers(2, &bufferObjects[0]);
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*size(vertices)*3, &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*size(indices), &indices[0], GL_STATIC_DRAW);

//Render VBO
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
glDrawElements(renderFlag, nrIndices, GL_UNSIGNED_INT, 0);

如果我同时绘制孔网格没有问题,但是是否可以使用不同的起始索引绘制相同的网格,如下所示:

glDrawElements(renderFlag, 20, GL_UNSIGNED_INT, "WHAT TO WRITE HERE"?);

1 个答案:

答案 0 :(得分:24)

“起始索引”是什么意思?你可能意味着两件事之一:

从缓冲区对象中的其他位置开始

嗯,就这样做吧。 glDrawElements在缓冲区对象中取一个偏移量,以便从中开始拉取索引。所以添加一个值。

glDrawElements(renderFlag, 20, GL_UNSIGNED_INT, (void*)(ixStart * sizeof(GLuint)));

抵消从缓冲区获取的索引

这意味着您要绘制相同范围的索引,但是您希望将偏移量应用于这些索引值本身。因此,如果您的索引缓冲区如下所示:(1,4,2,0,5,...),并且您应用偏移量20,那么它将获取这些索引:(21,24,22,20,25) ,...)。

这是通过glDrawElementsBaseVertex完成的。它看起来像这样:

glDrawElementsBaseVertex(renderFlag, 20, GL_UNSIGNED_INT, 0, offset);