2015-10-15 2 views
0

Я недавно изучал opengl через учебники по http://learnopengl.com/, но я пришел к вопросу о том, что массив, который вы размещаете в GLbufferdata, должен иметь фиксированный размер, который вы объявляете при инициализации. Однако в моей программе я хочу, чтобы это было так, что динамическое число объектов, которые могут быть созданы и удалены (сделаны через список), имеют параметры, которые появляются на экране.Как изменить количество значений, помещенных в буферы вершин в opengl?

Мне удалось создать код, который берет данные из объектов и преобразует их в массив и массивы поплавков для VBO и массив целых чисел для EBO, однако этот массив, похоже, не может изменить размер, поэтому пока моя программа может установить массив в правильный размер в зависимости от того, сколько объектов на нем должно начаться. Я не могу повторно объявить массив, означающий, что если я захочу добавить больше объектов, они не будут отображаться.

Я мог бы, конечно, установить массив больше, чем он мне нужен, но это кажется неэффективным и обходящим проблему.

Спасибо за помощь, кстати :).

Редактировать: Here - это ссылка на более сжатую версию, которая должна помочь кратко описать проблему. Линия 99/100 - это то, где я создаю массив, однако при компиляции ничего не появляется.

+0

Не можете ли вы динамически распределить массивы с помощью 'new'? Что вы подразумеваете под «невозможно повторно объявить массив»? Просто освободите старую память и выделите новую. –

+0

Проблема заключается в том, что вам нужно передать указатель на массив, который затем не работает по какой-либо причине, ни одна из вершин не нарисована. Возможно, я ошибаюсь, но я не вижу, как (мне удалось нормально работать с нормальными точечными массивами). – Nesou2

+0

Затем покажите код, иначе его трудно сказать, что здесь не так. – BDL

ответ

-1

Я не уверен, но я думаю, что вы не можете динамически изменять размер буфера вершин после объявления (вы можете удалить буфер и создать еще один, который будет иметь необходимый размер).

Лучший способ - каждый объект в вашей системе должен иметь собственный буфер вершины.

+0

Каждый вызов glBufferData выделяет память при необходимости и, следовательно, может изменять размер буфера – BDL

+0

@BDL Вы имеете в виду, что я могу дважды вызвать glBufferData? В первый раз я могу выделить память для 10 объектов и второй раз для 20 объектов без удаления буфера? –

+0

Полагаю, что это повлечет за собой прохождение через каждый вао и привязку их по очереди, а затем запуск шейдера? Я так понимаю, я бы сделал список анонимных GLuint, которые затем перебираю по каждой игре. Затем, если я хочу удалить объект, я просто удалю его из списка, когда он будет удален. Это правильно? – Nesou2

Смежные вопросы