как VBO привязывается к VAO - PullRequest
1 голос
/ 24 января 2020

VAO - это объект Vertex Array, а VBO - объект Vertex Buffer. Призывы к созданию и привязке / отмене привязки 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);    

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

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

1 Ответ

3 голосов
/ 24 января 2020

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

Он присоединяется при вызове glVertexAttribPointer.

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

Это ведет себя не так, как индексный буфер (ELEMENT_ARRAY_BUFFER). Привязка индексного буфера указывается в объекте Vertex Array. Когда буфер связан с целью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...