Когда очистить объект буфера вершин
Мне просто интересно: когда (и, возможно, как) очистить данные от VBO. Нужно ли его очищать всегда, прежде чем переписывать данные? Зачем это очищать?
Очистка буфера (т.е. установка каждого байта на 0) не слишком полезна. Недействительным является буфер.
Недействительность раздела буфера означает, что содержимое этого раздела становится недействительным, и перед его использованием вы должны написать новый контент. Это позволяет OpenGL-реализации избежать ожидания до тех пор, пока объект-буфер больше не будет использоваться для загрузки данных на него, предоставив вам полностью "новый" буфер для записи (под тем же именем). Этот метод называется буферным сиротством.
Чтобы недействить буфер, вы можете вызвать glBufferData
с glBufferData
же подсказками по размеру и использованию, но с указателем данных NULL
используйте glMapBufferRange
с GL_MAP_INVALIDATE_BUFFER_BIT
или glInvalidateBufferData
если ваш GPU поддерживает его.
Статья Wiki OpenGL для потоковой передачи буфера охватывает это более подробно, а также предлагает несколько других решений.
Чтобы напрямую ответить на ваш вопрос, вам не требуется, чтобы вы аннулировали или очищали буфер перед его обновлением. Вы можете вызвать glBufferSubData
всякий раз, когда вы хотите обновить любое содержимое. Тем не менее, без аннулирования может возникнуть срыв конвейера, поскольку OpenGL ожидает, что буфер будет использоваться до его безопасного обновления.