Когда очистить объект буфера вершин

Мне просто интересно: когда (и, возможно, как) очистить данные от VBO. Нужно ли его очищать всегда, прежде чем переписывать данные? Зачем это очищать?

1 ответ

Очистка буфера (т.е. установка каждого байта на 0) не слишком полезна. Недействительным является буфер.

Недействительность раздела буфера означает, что содержимое этого раздела становится недействительным, и перед его использованием вы должны написать новый контент. Это позволяет OpenGL-реализации избежать ожидания до тех пор, пока объект-буфер больше не будет использоваться для загрузки данных на него, предоставив вам полностью "новый" буфер для записи (под тем же именем). Этот метод называется буферным сиротством.

Чтобы недействить буфер, вы можете вызвать glBufferData с glBufferData же подсказками по размеру и использованию, но с указателем данных NULL используйте glMapBufferRange с GL_MAP_INVALIDATE_BUFFER_BIT или glInvalidateBufferData если ваш GPU поддерживает его.

Статья Wiki OpenGL для потоковой передачи буфера охватывает это более подробно, а также предлагает несколько других решений.

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

licensed under cc by-sa 3.0 with attribution.