Почему VAO может использовать данные VBO, которые их не связывают? - PullRequest
1 голос
/ 20 июня 2019

Почему VAO может использовать данные VBO, не связывая их?

https://learnopengl.com/Advanced-OpenGL/Instancing я нахожу это с этой веб-страницы. кодовая страница: https://learnopengl.com/code_viewer_gh.php?code=src/4.advanced_opengl/10.3.asteroids_instanced/asteroids_instanced.cpp

    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, amount * sizeof(glm::mat4), &modelMatrices[0], GL_STATIC_DRAW);


    for (unsigned int i = 0; i < rock.meshes.size(); i++)
    {
        unsigned int VAO = rock.meshes[i].VAO;
        glBindVertexArray(VAO);
        // set attribute pointers for matrix (4 times vec4)
        glEnableVertexAttribArray(3);
        glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)0);
        glEnableVertexAttribArray(4);
        glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(sizeof(glm::vec4)));
        glEnableVertexAttribArray(5);
        glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(2 * sizeof(glm::vec4)));
        glEnableVertexAttribArray(6);
        glVertexAttribPointer(6, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (void*)(3 * sizeof(glm::vec4)));

        glVertexAttribDivisor(3, 1);
        glVertexAttribDivisor(4, 1);
        glVertexAttribDivisor(5, 1);
        glVertexAttribDivisor(6, 1);

        glBindVertexArray(0);
    }

rock.meshes [i] .VAO использовать данные буфера без привязки? я думаю, что это должно быть так:

   for (unsigned int i = 0; i < rock.meshes.size(); i++)
    {
        unsigned int VAO = rock.meshes[i].VAO;
        GLuint buffer;
        glBindVertexArray(VAO);
        glGenBuffers(1, &buffer);
        glBindBuffer(GL_ARRAY_BUFFER, buffer);
        glBufferData(GL_ARRAY_BUFFER, amount * sizeof(glm::mat4), &modelMatrices[0], GL_STATIC_DRAW);
    ......
   }

1 Ответ

2 голосов
/ 20 июня 2019

Нет, buffer все еще привязан к цели GL_ARRAY_BUFFER.
OpenGL - это механизм состояний, и последняя инструкция, которая привязывает буферный объект к цели GL_ARRAY_BUFFER, была:

glBindBuffer(GL_ARRAY_BUFFER, buffer); 

Таким образом, buffer все еще привязан, когда вы определяете общие данные атрибута вершины.

Когда указан массив общих данных атрибута вершины (glVertexAttribPointer),тогда спецификация вершины (индекс, размер кортежа, формат, шаг, смещение, ...) и «имя» текущего объекта буфера, который привязан к цели GL_ARRAY_BUFFER, устанавливается равным Vertex ArrayОбъекты вектор состояния.
См. Объект буфера вершин .

Обратите внимание, что Индексный буфер будет указан непосредственно в объекте Vertex Array.Таким образом, объект Vertex Array должен быть привязан до того, как буфер будет привязан к цели GL_ELEMENT_ARRAY_BUFFER.

Привязка объекта буфера к цели GL_ARRAY_BUFFER не не изменяет текущийСостояния объекта массива вершины, но привязка буферного объекта к цели GL_ELEMENT_ARRAY_BUFFER изменяет состояния VAO.

Объект Vertex Array может ссылаться только на один индексный буфер, но он может ссылаться на отдельный буфер массива для каждого атрибута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...