Например когда я делаю

glBindBuffer(GL_ARRAY_BUFFER, _id);
glNamedBufferData(_id, size, data, static_cast<GLenum>(usage));

Тогда программа работает как положено. Но если я удалю эту первую строку, моя программа выйдет из строя и напечатает:

ОШИБКА 1282 в glNamedBufferData

Точно так же, если я сделаю

glBindVertexArray(_id);

GLuint attribIndex = 0;
GLuint offset = 0;
for(const GlslType type : layout) {
    const auto& attrib = GLSL_TYPES.at(type);
    glVertexArrayAttribFormat(_id, attribIndex, attrib.size, static_cast<GLenum>(attrib.type), GL_FALSE, offset);
    glEnableVertexArrayAttrib(_id, attribIndex);
    glVertexArrayAttribBinding(_id, attribIndex, 0);
    offset += attrib.size_bytes();
}

Он работает нормально, но если я удалю glBindVertexArray, он не будет работать и напечатает:

ОШИБКА 1282 в glVertexArrayAttribFormat
ОШИБКА 1282 в glEnableVertexArrayAttrib
ОШИБКА 1282 в привязке glVertexArrayAttribBinding

Я полагал, что, «называя» VBO или VAO при вызове этих функций, мне не нужно было бы связывать их заранее. Но если мне все равно придется выполнить привязку, какая польза от этих функций, требующих дополнительного аргумента имени?

3
mpen 27 Ноя 2021 в 05:51

1 ответ

Лучший ответ

Функции glGen* создают целочисленное имя, представляющее объект, но они не создают само состояние объекта (ну, большинство из них этого не делает). Только когда вы привязываете эти объекты, они получают свое состояние, и только после того, как у них есть состояние, может быть вызвана любая функция, которая требует от них наличия состояния. В частности, функции прямого доступа к состоянию.

Вот почему ARB_direct_state_access также включает функции glCreate*. Эти функции создают целочисленное имя и данные состояния для объектов. Следовательно, вам не нужно ничего связывать для управления функциями прямого доступа к состоянию, если вы заранее правильно создали объект.

3
genpfault 27 Ноя 2021 в 06:59
1
В этом гораздо больше смысла! Также объясняется, почему в документации glBindBuffer сказано: «Если не существует объекта-буфера с именем buffer, он создается с этим именем»; Я не думаю, что это было очень актуально до DSA, потому что вам приходилось связывать все равно.
 – 
mpen
27 Ноя 2021 в 06:15