как VBO присоединяется к VAO

VAO является объектом массива вершин, а VBO - объектом буфера вершин. Призывы к созданию и привязке / отмене привязки VAO и VBO имеют общий формат, как показано ниже:

GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);

        glGenBuffers(1, &VBO);
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
            glBufferData(GL_ARRAY_BUFFER, 
                            sizeof(GLfloat)* 9,
                            vertices,
                            GL_STATIC_DRAW);
            glVertexAttribPointer(0,
                    3, GL_FLOAT, GL_FALSE,
                    0, 0);
            glEnableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);    

Я следил за некоторыми учебниками в Интернете, и они говорят, что VBO привязан к VAO, но в приведенном выше коде я не понимаю, как устанавливается "соединение" или "привязка" между VBO и VAO.? Я имею в виду, как мы узнаем, какой VBO связан с каким VAO и что, если VBO должен быть привязан к нескольким VAO?

Итак, основной вопрос: что означает привязка VBO к VAO, как мы узнаем, какой VBO привязан к какому VAO и как устанавливается эта привязка?

1 ответ

Решение

как VBO присоединяется к VAO

Он прикрепляется, когда glVertexAttribPointer называется.

Каждый атрибут, указанный в векторе состояния объектов массива вершин, может относиться к другому объекту буфера вершин. Эта ссылка сохраняется, когда glVertexAttribPointer называется. Затем буфер, который в настоящее время привязан к целиARRAY_BUFFERсвязан с атрибутом, а имя (значение) объекта сохраняется в векторе состояния VAO. ВARRAY_BUFFER привязка - это глобальное состояние.

Это отличается от индексного буфера (ELEMENT_ARRAY_BUFFER). Привязка буфера индекса указывается в объекте массива вершин. Когда буфер привязан к целиELEMENT_ARRAY_BUFFER, то этот буфер связывается с объектом массива вершин, который в данный момент привязан.


Это означает, что когда вы звоните glBindBuffer(GL_ARRAY_BUFFER, VBO);, то устанавливается глобальное состояние, в котором хранятся VBO. glVertexAttribPointer извлекает VBO из глобального состояния и связывает его с VAO. когдаglBindBuffer(GL_ARRAY_BUFFER, ...) вызывается снова, тогда предыдущая привязка теряется, но, конечно, это не меняет никакого состояния VAO.

glBindVertexArray(VAO);              # bind VAO (global state)

glBindBuffer(GL_ARRAY_BUFFER, VBO1); # bind VBO1 (global state)
glVertexAttribPointer(0, ...);       # associate VBO1 to attribute 0 in VAO

glBindBuffer(GL_ARRAY_BUFFER, VBO2); # bind VBO2 (change global state, VBO1 binding is lost)
glVertexAttribPointer(1, ...);       # associate VBO2 to attribute 1 in VAO
Другие вопросы по тегам