Как стать автором
Обновить

Комментарии 6

А вот такой вопрос: можно ли использовать std::vector в качестве буферов? Я попробовал — не рисует. Если размер буфера не известен заранее, было бы удобно создавать его как std::vector
Ответил ниже, извиняюсь.
Я думаю вам нужно получше изучить концепцию буфера. Буфер — это некая область в видеопамяти в данном случае. Чтоб GPU обрабатывал данные из буфера их нужно туда поместить. Вы можете каждый фрейм помещать в буфер столько данных сколько вам нужно, вам этого никто не запрещает. Другой вопрос — что копирование операция медленная, поэтому злоупотреблять не стоит. А как вы храните данные до этого — это уже ваше дело. Можно и в векторе, возможен такой вариант:
std::vector<GLfloat> vertices {...}; 
...
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW);

Обратите внимание на вычисление размера. Довольно распространена ошибка именно в этом месте.
Спасибо, заработало. Я почти всё делал правильно, в том числе размер, но писал &vertices вместо &vertices[0] и при этом рисовался только фон. Я посмотрел примеры кода из этих уроков — массив vertices так и передаётся как vertices
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
Массив quadVertices (поменьше размером) передаётся как &quadVertices
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
А std::vector положено передавать как &vertices[0]
Если не трудно, объясните, в чём разница.
Что-то я все время промахиваюсь.
Когда вы объявляете vertices как массив float, вы можете использовать sizeof для вычисления его размера. В случае с std::vector — вы получаете таким образом размер объекта класса std::vector. Этим обусловлена разница в определении размера.
А по поводу &vertices[0] и vertices вам лучше почитать первоисточники о работе с массивами и указателями, лучше чем они я вряд ли объясню. Но если вкратце: имя массива является указателем на его первый элемент. Равно как и &vertices[0] — адрес первого элемента. В случае с массивом это равнозначно. А в случае с std::vector нам нужен именно &vertices[0] — поскольку именно он вернет указатель на 1 элемент массива данных, хранящихся в контейнере.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории