Например, у меня есть BO под названием bo_vertex с данными вершин 4*4, сначала я визуализирую все вершины, затем мне нужны только первые четыре вершины для следующего кадра, поэтому я аннулирую данные после четырех вершин. Теперь, что OpenGL сделает для часть, указанная в glInvalidateBufferSubData()? Если мне снова понадобится BO для данных 16 вершин, могу ли я повторно использовать bo_vertex напрямую или должен вызвать glBufferData(), чтобы перераспределить хранилище для bo_vertex?





Стоит прочитать исходную спецификацию расширения для этого ARB_invalidate_subdata. Аннулирование буферного объекта (или его области), а также вложения объекта кадрового буфера или области текстуры не приведет к "уменьшению" размера соответствующего ресурса. Драйвер OpenGL автоматически вставляет его между вызовами OpenGL для записи и/или чтения из этих ресурсов только для того, чтобы сигнализировать реализации OpenGL о том, что конкретная (суб)область этого ресурса не может выжить через несколько барьеров памяти. Это очень похоже на явные барьеры памяти Vulkan, однако всегда считалось, что OpenGL делает это автоматически, и в большинстве случаев OpenGL должен был быть консервативным, когда угадывал, нужен ли пользователю ресурс через определенные границы (например, буферы подкачки).
С ARB_invalidate_subdata предполагается, что пользовательское/клиентское приложение может подсказать драйверу OpenGL, что определенные барьеры памяти не нужно вставлять в поток команд, например. переместите память из встроенного буфера кадра или локальной памяти в другие области памяти, предназначенные для другого доступа к этим ресурсам.
Кажется, что наибольшая польза от этих функций заключается в повышении эффективности, если мне нужно преобразовать данные в объекты буфера. Если да, то в чем преимущество glInvalidateBufferData()? Если все данные недействительны, почему бы не удалить их?
Да, я ошибся, glInvalidateBufferData() здесь должно быть glInvalidateBufferSubData(). В документе говорится, что содержимое указанного диапазона хранилища данных буфера становится неопределенным, я хочу знать, доступна ли память недействительной части после вызова glInvalidateBufferSubData(), или OpenGL освобождает память части, что делает незаконным ее использование снова.