Использование смещения с VBO в OpenGL - PullRequest
13 голосов
/ 24 февраля 2012

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

25 голосов
/ 24 февраля 2012

Что вы подразумеваете под «индексом старта»? Вы можете иметь в виду одну из двух вещей:

Начать с другой позиции в буферном объекте

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