У меня есть подфункция, которая считывает поток данных и создает на основе этого массив данных вершин. Основная функция вызывает эту подфункцию многократно и обновляет массив массивов вершин, который затем привязан к буферу и нарисован. Все идет нормально. Однако я не могу понять, как добавить вершины. C++ не позволяет переназначать или изменять размеры всех массивов. Я не могу использовать векторы, потому что функции OpenGL принимают массивы, а не векторы.
Вы можете использовать векторы для заполнения буфера вершин OpenGL. Значения в vector
гарантированно смежны. См. Например, эти обсуждения для получения подробной информации о связанных языковых стандартах:
Это означает, что код, подобный приведенному ниже, безопасен:
std::vector<GLfloat> vertexPositions;
// Populate vector with vertex positions.
GLuint bufId = 0;
glGenBuffers(1, &bufId);
glBindBuffer(GL_ARRAY_BUFFER, bufId);
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat),
&vertexPositions[0], GL_STATIC_DRAW);
Тонкая, но важная часть состоит в том, что вы передаете адрес первого элемента вектора, а не адрес векторного объекта.
Я бы сделал небольшое редактирование. Хотя вы можете использовать & vertexPositions [0] в качестве адреса начала вектора STL, я предпочитаю использовать функцию, предназначенную для возврата адреса начала векторной памяти, vertexPositions.data().
std::vector<GLfloat> vertexPositions;
// Populate vector with vertex positions.
GLuint bufId = 0;
glGenBuffers(1, &bufId);
glBindBuffer(GL_ARRAY_BUFFER, bufId);
glBufferData(GL_ARRAY_BUFFER, vertexPositions.size() * sizeof(GLfloat), vertexPositions.data(), GL_STATIC_DRAW);
Я использую векторы STL для данных OGL по ряду причин. Легко превалировать, если вы знаете размер, и они будут расти (и оставаться смежными) при добавлении предметов. Их легко прорезать. Вы можете легко создавать векторы структур, если хотите передать чередующиеся данные. Все работает одинаково.
data()
в ответе, поскольку он был представлен только в C ++ 11, тогда как другой подход работает со всеми версиями C ++. В любом случае это больше похоже на комментарий, чем на ответ.