Я читал немного о том, как VAO работают с VBOs. Насколько я понимаю, VAO хранит информацию о состоянии VBO только при вызове glVertexAttribPointer. Мой вопрос в том, когда он хранит состояние об EBO (для индексированного чертежа), сохраняет ли состояние для обоих при вызове glVertexAttribPointer?VAO и элементы буфера элемента
//Vertices of the rectangle
std::vector<GLfloat> vertices
{
0.5f, 0.5f, 0.0f, // Top Right
0.5f, -0.5f, 0.0f, // Bottom Right
-0.5f, 0.5f, 0.0f, // Top Left
-0.5f, -0.5f, 0.0f, // Bottom Left
};
//Indices of the triangle
std::vector<GLuint> indices
{
0, 1, 3,
0, 3, 2
};
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO); //Bind the VAO
//Bind the buffers
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(GLfloat), &vertices[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindVertexArray(0); //Unbind the VAO
//Supply Index Buffer information
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//Custom shader class that stores the program to be used at render time
Shader shader("..path_to_shader\\shaders\\vertexshader.vert", "..path_to_shader\\shaders\\fragmentshader.frag");
while (!glfwWindowShouldClose(window))
{
glUseProgram(shader.Program());
glBindVertexArray(VAO); //Bind the VAO to draw.
glClearBufferfv(GL_COLOR, 0, &color[0]);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
glfwPollEvents();
glfwSwapBuffers(window);
glBindVertexArray(0);
glUseProgram(0);
}
У вас нет привязки буфера элемента, когда вы вызываете 'glBufferData()' для индексов. Поскольку привязка является частью состояния VAO, она не привязана после того, как вы отвязали VAO. –
Так что, в отличие от VBO, чтобы модифицировать буфер массива элементов, VAO должен быть связан? – Jeffrey
Не VAO, а буфер, который вы хотите изменить. Поскольку ваши привязки сохраняются в вас VAO, в вашем случае привязка VAO или привязка вашего GL_ELEMENT_ARRAY_BUFFER одинакова для glBufferData. Однако иногда это не так. Дело в том, что вы вызываете glBufferData (GL_ELEMENT_ARRAY_BUFFER, ....), тогда GL_ELEMENT_ARRAY_BUFFER, который вы хотите изменить, должен быть связан. То же самое верно для других целей, таких как GL_ARRAY_BUFFER. – plasmacel