Использование смещения с VBOs в OpenGL

Что я хочу сделать, так это сделать сетку несколько раз с тем же 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

Что вы подразумеваете под "начальным индексом"? Вы могли бы означать одну из двух вещей:

Начать в другом месте в буферном объекте

Хорошо, просто сделай это. 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);