Действительно ли "glGenBuffers" важен, если у нас есть glBindBuffer? - PullRequest
4 голосов
/ 06 апреля 2019

Ну, я начинаю с OpenGl, и, читая документацию о glBindBuffer, я немного запутался.

"glBindBuffer привязывает объект буфера к указанной точке привязки буфера. Вызов glBindBufferс target , установленным на одну из принятых символических констант, и buffer , установленным на имя объекта буфера, привязывает это имя объекта буфера кцель. Если буферный объект с именем buffer не существует, создается один с этим именем. Когда буферный объект привязан к цели, предыдущая привязка для этой цели автоматически нарушается«.Источник: http://docs.gl/gl4/glBindBuffer

Означает ли это, что если я не создаю буферный объект с именем "foo", но я вызываю glBindBuffer, он создаст для меня это имя ("foo")?

Если это так, то следующий код должен работать нормально:

GLuint bar = 70;
glBindBuffer(GL_ARRAY_BUFFER, bar);

-> Создать буферный объект, «соединить» его с bar (70) и связать с GL_ARRAY_BUFFER.

Ответы [ 2 ]

5 голосов
/ 06 апреля 2019

Нет, этот код будет работать только в контексте профиля совместимости (или OpenGL ES).

См. Спецификация основного профиля API OpenGL 4.6 - 2.6.1 Управление объектами - страница 28

[...] команда GenBuffers возвращает одно или несколько ранее неиспользуемых имен объектов буфера.
Сгенерированные имена помечаются GL как используемые только для генерации имен.Имена объектов, помеченные таким образом, не будут возвращаться дополнительными вызовами для генерации имен того же типа, пока имена не будут снова помечены как неиспользуемые путем их удаления [...]

Это означает, что glGenBuffers does nothing else than reserving names (values). Further calls toglGenBuffers 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();
2 голосов
/ 06 апреля 2019

Состояние OpenGL 4.6 в разделе 6.1 гласит, что glBindBuffer должен выдать исключение GL_INVALID_OPERATION, когда буфер не указывает на имя, ранее зарезервированное glGenBuffers:

Ошибка INVALID_OPERATION генерируется, если буфер не равен нулю или имя возвращено из предыдущего вызова GenBuffers, или если такое имя с тех пор было удалено с помощью DeleteBuffers.

Та же информацияуказано в официальных документах .

Я не уверен, почему docs.GL не сообщает эту информацию.Возможно, мы неверно интерпретируем предложение, поскольку в нем говорится, что буфер создан.Технически, при вызове glGenBuffers создается только имя буфера, но объект буфера создается, когда имя связывается впервые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...