OpenGL игнорирует связанный буфер вершин - PullRequest
0 голосов
/ 27 октября 2018

Я столкнулся с чем-то действительно раздражающим в отношении объектов массива вершин и объектов буфера вершин.

Вот код:

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.Любая помощь или разъяснения?

1 Ответ

0 голосов
/ 27 октября 2018

Связывание между атрибутом в шейдере и буфером для чтения выполняется в glVertexAttribPointer с текущим связанным буфером (то есть, после yourBuffer.Bind () ).

Эти привязки (атрибут-буфер) хранятся в VAO.

Таким образом, перед вызовом glDrawXXX вызовите glBindVertexArray и используются правильные буферы. Связывание буфера после связывания с VAO не имеет никакого эффекта.

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