Создать динамический массив объектов для VBO

Я пытаюсь создать динамический массив объектов, а затем использовать его для VBO.

Vector3f Vertices[] = new Vector3f[size];
/* 
    initialization
*/

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

Но у меня следующая ошибка: initialization with '{...}' expected for aggregate object Итак, как я могу это сделать? Я полагаю, это должно быть возможно.


person user3051029    schedule 17.01.2015    source источник


Ответы (2)


Мой предыдущий комментарий: вы хотите sizeof(Vector3f) * size, а не sizeof(Vertices), то есть размер данных в байтах, в вашем вызове glBufferData.


1/. Использование: Vector3f *vertices = new Vector3f[size];

vertices - это указатель на массив Vector3f (с подходящим дополнением между элементами, если требуется, заданным sizeof(Vector3f). Каждый элемент Vector3f создается с использованием конструктора Vector3f по умолчанию.

2/. Рассмотрите возможность управления своими данными с помощью: std::vector<Vector3f> vertices (size); — чтобы вы могли управлять и работать с вектором вместо управления указателями. Поскольку данные std::vector имеют непрерывный доступ, вы можете использовать:

glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vector3f), vertices.data(), GL_STATIC_DRAW);

Если вы измените размер контейнера вершин (Vector3f), вы позволите std::vector<>::size() позаботиться о количестве элементов.

Очевидно, что вам не нужно явное delete здесь. Как только контейнер Vector3f выходит за пределы области действия, он автоматически уничтожается. Я даже не коснулся всех преимуществ универсальных функций, которые могут работать с контейнером... слияние, реверсирование, сортировка... всего несколько вещей, которые вы получаете бесплатно.

person Brett Hale    schedule 17.01.2015
comment
@ user3051029 - не стесняйтесь принимать ответ, если он вас устраивает. Если вы еще не знаете, когда вы устанавливаете VertexAttribPointer, а между элементами Vector3f есть отступы, вам может потребоваться быть осторожным с «шагом». например, glVertexAttribPointer(index, 3, GL_FLOAT, GL_FALSE, sizeof(Vector3f), (void *) 0); - если вы знаете, что данные упакованы. - person Brett Hale; 17.01.2015

Возможно, вам придется использовать std::vector или std::list вместо традиционного массива C.

Вот ссылка

OpenGL: использование VBO с std::vector

person Vul    schedule 17.01.2015