Подтвердить что ты не робот

VBOs с std::vector

Я написал загрузчик модели в С++ OpenGL. Я использовал std::vector для хранения данных вершин, но теперь я хочу передать его в glBufferData(), однако типы данных сильно отличаются. Я хочу знать, есть ли способ конвертировать между std::vector в документированный const GLvoid * для glBufferData().

Тип вершин

typedef struct
{
    float x, y, z;
    float nx, ny, nz;
    float u, v;
}
Vertex;

vector<Vertex> vertices;

вызов glBufferData()

glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), vertices, GL_STATIC_DRAW);

Я получаю следующую (ожидаемую) ошибку:

error: cannot convert ‘std::vector<Vertex>’ to ‘const GLvoid*’ in argument passing

Как преобразовать вектор в тип, совместимый с glBufferData()?

NB. На данный момент меня не волнует правильное распределение памяти; vertices.size() * 3 * sizeof(float) скорее всего будет segfault, но я хочу сначала решить проблему с типом.

4b9b3361

Ответ 1

Если у вас есть std::vector<T> v, вы можете получить T*, указывающий на начало смежных данных (это то, что после OpenGL) с выражением &v[0].


В вашем случае это означает, что вы передаете Vertex* в glBufferData:

glBufferData(
   GL_ARRAY_BUFFER,
   vertices.size() * sizeof(Vertex),
   &vertices[0],
   GL_STATIC_DRAW
);

Или как это, что то же самое:

glBufferData(
   GL_ARRAY_BUFFER,
   vertices.size() * sizeof(Vertex),
   &vertices.front(),
   GL_STATIC_DRAW
);

Вы можете полагаться на неявное преобразование от Vertex* до void const* здесь; это не должно представлять проблемы.

Ответ 2

Это должно сделать трюк:

&vertices[0]

Некоторые предпочитают &vertices.front(), но это больше набирает текст и я ленив.

Чтобы быть еще более ленивым, вы можете перегрузить glBufferData таким образом:

template <class T>
inline void glBufferData(GLenum target, const vector<T>& v, GLenum usage) {
    glBufferData(target, v.size() * sizeof(T), &v[0], usage);
}

Затем вы можете написать:

glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);

а также избегайте ошибок (ваша структура больше, чем 3 * sizeof(float)).