Я столкнулся с чем-то действительно раздражающим в отношении объектов массива вершин и объектов буфера вершин.
Вот код:
float vertex_data[] =
{
0.f, 0.5f, 0.f, 0.f, 1.f,
0.5f, -0.5f, 0.f, 1.f, 0.f,
-0.5f, -0.5f, 1.f, 0.f, 0.f
};
float vertex_data_2[] =
{
0.f, 0.5f, 1.f, 0.f, 0.f,
0.5f, -0.5f, 1.f, 0.f, 0.f,
-0.5f, -0.5f, 1.f, 0.f, 0.f
};
unsigned int indices[] =
{
0, 1, 2
};
unsigned int vertex_array, vertex_array_2;
glGenVertexArrays(1, &vertex_array);
glGenVertexArrays(1, &vertex_array_2);
IndexBuffer index_buffer(3 * sizeof(unsigned int), 3, GL_UNSIGNED_INT, indices);
glBindVertexArray(vertex_array);
VertexBuffer vertex_buffer(3 * 5 * sizeof(float), vertex_data);
vertex_buffer.Bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(0));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(2 * sizeof(float)));
index_buffer.Bind();
glBindVertexArray(vertex_array_2);
VertexBuffer vertex_buffer_2(3 * 5 * sizeof(float), vertex_data_2);
vertex_buffer_2.Bind();
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(0));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(2 * sizeof(float)));
index_buffer.Bind();
Shader shader(Shader::FromFile("rescources/shaders/basic.vs"),
Shader::FromFile("rescources/shaders/basic.fs"));
shader.Bind();
// main loop
while (!glfwWindowShouldClose(glfw_window))
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.f, 0.f, 0.f, 1.f);
// problem is here
glBindVertexArray(vertex_array);
vertex_buffer_2.Bind();
glDrawElements(GL_TRIANGLES, index_buffer.GetCount(), index_buffer.GetType(), nullptr);
glfwSwapBuffers(glfw_window);
glfwPollEvents();
}
Sidenote: Bind () просто вызывает glBindBuffer ()
Так что в основном я связываю буфер второй вершины, но glDrawElements ()все еще используя первый буфер вершин по любой причине.Это как если бы он полностью игнорировал, какой буфер вершин связан, и заботился только о том, какой массив вершин связан.Мне это показалось странным, поскольку у меня сложилось впечатление, что объекты массива вершин не связывают буферы вершин.Еще более странным является то, что даже если объект массива вершин действительно связывал объект буфера вершин, это не имело бы значения в этом случае, так как я связываю vbo после того, как я связываю vao.Любая помощь или разъяснения?