Я изучаю OpenGL в течение трех дней, и я могу сделать что-то, но мне нравится копировать вставку, не зная, что я делаю. Я серьезно думаю, что мне не хватает базового понимания того, когда именно это (VBO, атрибуты...) привязаны к объекту вершинного массива (VAO) и не нашли никаких ресурсов, которые подробно разъясняют эти аспекты.
В частности, это некоторые из моих проблем. Если я создаю VAO:
GLuint vao;
glGenVertexArrays(1, &vao);
может ли что-нибудь связать его, прежде чем я свяжу VAO? (если я создаю VBO сейчас, он связан с VAO?)
glBindVertexArray(vao);
После привязки VAO, если я создаю VBO:
GLuint vbo;
glGenBuffers(1, &vbo);
связано ли это с VAO? Или это происходит, когда я связываю его?
glBindVertexArray(vbo);
Или, может быть, когда я что-то копирую?
Если я получаю местоположение атрибута:
att = glGetAttribLocation(program_id, "name");
связано ли это с VAO? Или это происходит после его включения:
glEnableVertexAttribArray(att);
... или после его установки:
glVertexAttribPointer(att, ...);
?
Я думаю, что EBO ведут себя точно так же, как VBOs, поэтому я надеюсь, что применяются те же "правила".
Униформы должны вести себя как глобальные, поэтому они не должны подвергаться воздействию VAO вообще.
Теперь о развязывании:
Если я "свяжу" VBO с VAO, а затем отвяжу VBO, он отсоединяется от VAO?
Если у меня есть VBO, связанный с несколькими VAO, что происходит, когда я отвязываю VBO?
И об освобождении ресурсов:
Что происходит, когда я удаляю VBO? Удаляется ли из всех ВАО? Или у них все еще есть "болтающиеся ссылки" на этот VBO?
А о программах:
IIUC Я могу повторно использовать VBOs между программами. Однако, если VAO связывают атрибуты и VBOs, а атрибуты принимают программный параметр, могу ли я повторно использовать VAO между программами? Почему атрибуты принимают параметр программы вообще?
А насчет отладки:
Есть ли способ распечатать конечный автомат OpenGL? Мне хотелось бы узнать, какие программы были связаны между собой, с какими шейдерами, в которых существуют VAO, какие VBOs привязаны к каким VAO, какие атрибуты связаны с VAO и VBOs, были ли они установлены? разрешены ли они? какие формы существуют...
И о вызовах вызова:
Предположим, кто-то дает мне VAO, и я должен его нарисовать. Есть ли способ узнать, следует ли мне звонить glDrawArrays или glDrawElements? Могу ли я как-то запросить эту информацию из ВАО? Может быть, наряду с размерами моих VBOs, хранящихся там?