Как мне изменить данные буфера с помощью std ::vector?

#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 Буфер не перезаписывается. Создается новый объект буфера и выделяется новое хранилище данных.