VBOs с std :: vector - PullRequest
       4

VBOs с std :: vector

35 голосов
/ 24 августа 2011

Я написал загрузчик моделей на C ++ и OpenGL.Я использовал std::vector s для хранения моих данных вершин, но теперь я хочу передать их в 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, но сначала я хочу решить ошибку типа.

Ответы [ 2 ]

45 голосов
/ 24 августа 2011

Если у вас есть 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* здесь;это не должно создавать проблемы.

26 голосов
/ 24 августа 2011

Это должно сработать:

&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)).

...