Нет, этот код будет работать только в контексте профиля совместимости (или OpenGL ES).
См. Спецификация основного профиля API OpenGL 4.6 - 2.6.1 Управление объектами - страница 28
[...] команда GenBuffers возвращает одно или несколько ранее неиспользуемых имен объектов буфера.
Сгенерированные имена помечаются GL как используемые только для генерации имен.Имена объектов, помеченные таким образом, не будут возвращаться дополнительными вызовами для генерации имен того же типа, пока имена не будут снова помечены как неиспользуемые путем их удаления [...]
Это означает, что glGenBuffers does nothing else than reserving names (values). Further calls to
glGenBuffers will not return the same values.
If
glGenBuffers` всегда используется для получения значений имени для объектов буфера, тогда вы можете быть уверены, что это значение еще не используется для другого объекта буфера.
Но в спецификации основного профиля OpenGL для настольных компьютеров этонельзя использовать имя для glBindBuffer
, которое не было зарезервировано (возвращено) glGenBuffers
.
См. Спецификация основного профиля API OpenGL 4.6 - 6.1 Создание и привязка объектов буфера - страница62
Ошибка INVALID_OPERATION генерируется, если буфер не равен нулю или имя возвращается из предыдущего вызова GenBuffers , или если такое имя с тех пор было удалено сDeleteBuffers.
Эта часть спецификации отсутствует в спецификации профиля совместимости API OpenGL 4.6 - 6.1 Crпоедание и связывание объектов буфера - стр. 62
Это немного сбивает с толку, но это спецификация.
Это поведение подтверждается кодом вашего вопроса.Следующий код не возвращает ошибки с использованием контекста профиля совместимости, но возвращает GL_INVALID_OPERATION
с использованием контекста основного профиля:
GLuint bar = 70;
glBindBuffer(GL_ARRAY_BUFFER, bar);
GLenum error = glGetError();