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

#opengl #vbo

#opengl #vbo

Вопрос:

Мне просто интересно: когда (и, возможно, как) очистить данные из VBO. Обязательно ли вам всегда очищать его перед перезаписью данных? Зачем его очищать?

Ответ №1:

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

Аннулирование раздела буфера означает, что содержимое этого раздела становится недействительным, и вы должны записать новое содержимое в этот раздел перед его использованием. Это позволяет реализации OpenGL избежать ожидания, пока объект buffer больше не будет использоваться, чтобы загрузить в него данные, предоставляя вам совершенно «новый» буфер для записи (под тем же именем). Этот метод называется удалением буфера.

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

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

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

Комментарии:

1. Для людей, ищущих современный подход, рассмотрите такие функции, как glClearNamedBufferSubData