Внедрение OpenGL VBO для сирот

В настоящее время я работаю над рендерером спрайтов, данные которого меняются каждый тик, поэтому я искал способы потоковой передачи объекта буфера, я натолкнулся на потерю буфера... что меня немного смутило.

  1. Во-первых, когда вы вызываете glBufferData с указателем NULL, выделяется ли новая память и имеет ли это значение, если размер буфера изменяется?
  2. Во-вторых, вам нужно вызывать glMap/glUnmap каждый раз, когда вы обновляете буфер, или работает один glMap? И делает ли GL_INVALIDATE_BUFFER то же самое, что и просто установка данных в NULL?
  3. Наконец, я что-то упустил в следующей реализации?

    Каждый тик:

    glBindBuffer(GL_ARRAY_BUFFER, ssb->buffers[1]);
    glBufferData(GL_ARRAY_BUFFER, length, NULL, GL_STREAM_DRAW);
    void* buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    memcpy(buffer, data, length);
    glUnmapBuffer(GL_ARRAY_BUFFER);
    

1 ответ

Решение

Во-первых, когда вы вызываете glBufferData с указателем NULL, выделяется ли новая память

Возможно. Это зависит от того, используется ли текущее хранилище на графическом процессоре и насколько хорошо оптимизирована реализация OpenGL.

и как так это имеет значение, если размер буфера изменяется?

Да, из-за вышеизложенного. Не изменяйте длину буфера, если вы собираетесь потерять его.

Во-вторых, вам нужно вызывать glMap / glUnmap каждый раз, когда вы обновляете буфер, или работает один glMap?

Учитывая ваш код, вы вообще не должны его отображать. Сопоставление предназначено для случаев, когда вы собираетесь генерировать данные непосредственно в память буфера (или откуда поступает указатель с отображением). Вы генерируете данные в свою память и просто копируете их. Так что, вероятно, лучше использовать glBufferSubData,

И делает ли GL_INVALIDATE_BUFFER то же самое, что и просто установка данных в NULL?

Он сохраняет длину буфера, что делает невозможным случайное изменение длины в соответствии с вышеизложенным.

Другие вопросы по тегам