Может ли другой VAO использовать предыдущий использованный индекс индекса вершины
Может два ВАО (va01, vao2)
имеют один и тот же индекс индекса вершины?
GLuint vao1, vao2;
glGenVertexArrays(1, &vao1);
glGenVertexArrays(1, &vao2);
{
glBindVertexArray(vao1);
...
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
...
glBindVertexArray(0);
}
{
glBindVertexArray(vao2);
...
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
...
glBindVertexArray(0);
}
предполагать vbo1
а также vbo2
определены перед этим кодом, и они получили glBufferData
уже. Можно vao1
а также vao2
оба имеют один и тот же атрибут вершины с индексом 0?
1 ответ
Да, несколько VAO могут устанавливать одинаковые атрибуты вершин, указывая на разные VBO каждый.
Предположим, что vbo1 и vbo2 определены перед этим кодом, и они получили glBufferDataalready. Могут ли vao1 и vao2 иметь один и тот же индекс индекса вершины 0?
Вы путаете некоторые вещи здесь. ВАО никогда не заботятся о BufferData
, VAO хранят указатели атрибутов, атрибут разрешает и GL_ELEMENT_ARRAY_BUFFER_BINDING
, Они не хранят никаких данных вершин, они только ссылаются на них. И они ссылаются на VBO по имени - это означает, что вы можете просто сделать:
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glVertexAttribPointer(i, ...); // here, a reference to vbo1 gets part of the attrib pointer for attrib i
...
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBufferData(...); // VAO will now point into this buffer storage
(это также означает, что вы можете установить указатель до того, как создадите буферное хранилище для VBO, вам просто нужно создать объект VBO). Может быть, вы найдете мою иллюстрацию в этом ответе полезной.