Использование смещения с 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);