OpenGL - добавить вершины

0

У меня есть подфункция, которая считывает поток данных и создает на основе этого массив данных вершин. Основная функция вызывает эту подфункцию многократно и обновляет массив массивов вершин, который затем привязан к буферу и нарисован. Все идет нормально. Однако я не могу понять, как добавить вершины. C++ не позволяет переназначать или изменять размеры всех массивов. Я не могу использовать векторы, потому что функции OpenGL принимают массивы, а не векторы.

Теги:
arrays
opengl
resize
buffer

2 ответа

3
Лучший ответ

Вы можете использовать векторы для заполнения буфера вершин 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);

Тонкая, но важная часть состоит в том, что вы передаете адрес первого элемента вектора, а не адрес векторного объекта.

  • 0
    Интересно. Исходя из фона Java, я не сразу узнал путь к массиву vector -> pointer <->. Благодарю.
1

Я бы сделал небольшое редактирование. Хотя вы можете использовать & 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 по ряду причин. Легко превалировать, если вы знаете размер, и они будут расти (и оставаться смежными) при добавлении предметов. Их легко прорезать. Вы можете легко создавать векторы структур, если хотите передать чередующиеся данные. Все работает одинаково.

  • 0
    Я не использовал метод data() в ответе, поскольку он был представлен только в C ++ 11, тогда как другой подход работает со всеми версиями C ++. В любом случае это больше похоже на комментарий, чем на ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню