#c #opengl #vector
#c #opengl #вектор
Вопрос:
Итак, моя идея состоит в том, чтобы добавить больше данных в буфер. Моей первой идеей было использовать std::vector, чтобы у меня был нефиксированный массив, в который я мог добавлять данные. При генерации данных:
void initData()
{
std::vector<float> vertices;
std::array<float, 12> verts = {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
for(int i = 0; i < verts.size(); i )
vertices.push_back(verts[i]);
glGenBuffers(1, amp;VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices), amp;vertices[0], GL_DYBAMIC_DRAW);
glGenVertexArrays(1, amp;VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
}
это работает просто отлично!
но потом, когда я захочу добавить больше данных:
void render()
{
std::vector<float> newVertices;
// Generates new vertices with more data, like I did in the initData()
// for-loop adding it to the new vector (newVertices)
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, newVertices.size() * sizeof(newVertices), amp;newVertices[0]);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLE, 0, 6 * theAmountIveGeneratedBefore);
}
это та часть, с которой я, похоже, не могу приступить к работе…
что я делаю не так??
Комментарии:
1.
vertices.size() * sizeof(vertices)
не имеет смысла (то же самое относится и к версии newVertices во втором случае)2.
glBufferSubData
обновляет подмножество хранилища данных объекта buffer. Это не изменяет размер буфера. Если вам нужен буфер большего размера, вам нужно создать новый буфер с помощьюglBufferData
3. может быть, вы имели в виду
vertices.size() * sizeof(vertices[0])
? если целью является размер в байтах хранения векторного содержимого?4.
vertices.size() * sizeof(*newVertices.data())
илиvertices.size() * sizeof(vertices[0])
5. Не связано: создание
array
значений, а затем ввод их вvector
, кажется странным выбором. По какой-либо причине вы не можете создатьvector
со значениями, которые уже есть в нем? Например,std::vector<float> vertices = {0.0f, 0.0f, ...};
Ответ №1:
РЕДАКТИРОВАТЬ: как указано в комментариях, вы НЕ можете добавить больше данных в буфер с помощью glBufferSubData()
. Итак, этот ответ указывает только на ошибку при вычислении размера переданных данных.
sizeof(newVertices)
не дает вам того, что вам нужно. Это std::vector
класс, и он сложнее, чем простой массив. Кроме того, на самом деле вам не нужен весь его размер. На самом деле вам нужен только размер a float
, поскольку вы умножаете его на количество элементов. Так что просто:
newVertices.size() * sizeof(float)
или
newVertices.size() * sizeof(newVertices[0])
Комментарии:
1. Это тоже, но я полагаю, что новые вершины имеют одинаковое число, то есть я полагаю, что он пытается их заменить…
2. ах, так к чему я клоню, я не должен использовать «glBufferSubData», но использовать glBufferData для больших данных, которые я хочу добавить??
3. ДА. Вы можете повторно заполнить тот же буфер, используя
glBufferData()
. Затем буфер перезаписывается новыми данными и при необходимости изменяется.4. @LyubomirVasilev Буфер не перезаписывается. Создается новый объект буфера и выделяется новое хранилище данных.