Внедрение OpenGL VBO для сирот
В настоящее время я работаю над рендерером спрайтов, данные которого меняются каждый тик, поэтому я искал способы потоковой передачи объекта буфера, я натолкнулся на потерю буфера... что меня немного смутило.
- Во-первых, когда вы вызываете glBufferData с указателем NULL, выделяется ли новая память и имеет ли это значение, если размер буфера изменяется?
- Во-вторых, вам нужно вызывать glMap/glUnmap каждый раз, когда вы обновляете буфер, или работает один glMap? И делает ли GL_INVALIDATE_BUFFER то же самое, что и просто установка данных в NULL?
Наконец, я что-то упустил в следующей реализации?
Каждый тик:
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?
Он сохраняет длину буфера, что делает невозможным случайное изменение длины в соответствии с вышеизложенным.