Я пытаюсь создать простую программу OpenGL, в которой на экране рисуются два красных квадрата.
Проблема в том, что мне приходится заново создавать буфер вершин в каждом кадре, чтобы квадраты появлялись. Это также означает, что массив вершин должен быть связан с макетом в каждом кадре. Я новичок в OpenGL, но, насколько я могу судить, в этом нет необходимости. Итак, часть моего вопроса заключается в том, почему воссоздание буфера вершин для каждого кадра работает как исправление и почему квадраты не появляются только из кода, показанного ниже? Код находится в классе с конструктором и методом onUpdate.
Конструктор:
auto vb = VertexBuffer{ m_positions.data(), static_cast(m_positions.size() *
sizeof(float)) };
vb.bind();
// m_vb.bind(); // Should work instead of the two lines above
m_va.bind();
// This should only include one of the squares
GLCall( glEnableVertexAttribArray(0) );
GLCall( glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, (const void*)0) );
m_shader.bind();
m_va.bind();
m_ib.bind();
GLCall(glDrawElements(GL_TRIANGLES, m_ib.getCount(), GL_UNSIGNED_INT, nullptr));
m_shader.unbind();
m_va.unbind();
m_ib.unbind();
m_shader и m_ib (индексный буфер) создаются в списке инициализаторов. Я попытался предоставить минимальный рабочий пример, но часть логики абстрагируется в другие классы. Если для понимания проблемы потребуется дополнительный код, я с радостью его предоставлю
Я пытаюсь создать простую программу OpenGL, в которой на экране рисуются два красных квадрата. Проблема в том, что мне приходится заново создавать буфер вершин в каждом кадре, чтобы квадраты появлялись. Это также означает, что массив вершин должен быть связан с макетом в каждом кадре. Я новичок в OpenGL, но, насколько я могу судить, в этом нет необходимости. Итак, часть моего вопроса заключается в том, почему воссоздание буфера вершин для каждого кадра работает как исправление и почему квадраты не появляются только из кода, показанного ниже? Код находится в классе с конструктором и методом onUpdate. Конструктор: [code]m_positions = { 0.1f, 0.1f, 0.2f, 0.1f, 0.2f, 0.2f, 0.1f, 0.2f,
m_va.addBuffer(m_vb, m_layout); [/code] при обновлении: [code]auto vb = VertexBuffer{ m_positions.data(), static_cast(m_positions.size() * sizeof(float)) }; vb.bind(); // m_vb.bind(); // Should work instead of the two lines above
m_va.bind(); // This should only include one of the squares GLCall( glEnableVertexAttribArray(0) ); GLCall( glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, (const void*)0) );
m_shader.unbind(); m_va.unbind(); m_ib.unbind(); [/code] m_shader и m_ib (индексный буфер) создаются в списке инициализаторов. Я попытался предоставить минимальный рабочий пример, но часть логики абстрагируется в другие классы. Если для понимания проблемы потребуется дополнительный код, я с радостью его предоставлю