在OpenGL中使用VBO的偏移量

hid*_*yat 14 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);
Run Code Online (Sandbox Code Playgroud)

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

glDrawElements(renderFlag, 20, GL_UNSIGNED_INT, "WHAT TO WRITE HERE"?);
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 26

你是什​​么意思"开始索引"?你可能意味着两件事之一:

从缓冲区对象中的不同位置开始

好吧,就这样做.glDrawElements将一个偏移量放入缓冲区对象中,以便从中开始拉取索引.所以添加一个值.

glDrawElements(renderFlag, 20, GL_UNSIGNED_INT, (void*)(ixStart * sizeof(GLuint)));
Run Code Online (Sandbox Code Playgroud)

偏移从缓冲区获取的索引

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

这是完成的glDrawElementsBaseVertex.它看起来像这样:

glDrawElementsBaseVertex(renderFlag, 20, GL_UNSIGNED_INT, 0, offset);
Run Code Online (Sandbox Code Playgroud)