在OpenGL中使用带有VBO的偏移

Using an offset with VBOs in OpenGL

本文关键字:VBO OpenGL      更新时间:2023-10-16

我想做的是用相同的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"?);

"开始索引"是什么意思?你可以指两件事之一:

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

好吧,就这么做吧。CCD_ 1将偏移量带入缓冲区对象,以便从中提取索引。所以给它加一个值。

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);