Существует три вида рендеринга (3D-точки, поверхности и виджеты).По сути, моя draw
функция выглядит следующим образом:
void draw()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// activate shader
shader->use();
shader->setMat4("projection", projection);
view = camera.GetViewMatrix();
shader->setMat4("view", view);
//draw 3D points
glBindVertexArray(VAO_Vert);
glBindBuffer(GL_ARRAY_BUFFER,VBO_Vert);
glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(float), vertices.data(), GL_STREAM_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
shader->setMat4("model",glm::mat4(1.0f));
glDrawArrays(GL_POINTS,0,vertices.size() / 6);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
//draw surfaces
glBindVertexArray(VAO_Sur);
glBindBuffer(GL_ARRAY_BUFFER,VBO_Sur);
glBufferData(GL_ARRAY_BUFFER, surfaces.size()*18*sizeof(float), surfaces.data(), GL_STREAM_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
shader->setMat4("model",glm::mat4(1.0f));
glDrawArrays(GL_TRIANGLES,0,surfaces.size()*3);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
//draw coordinate system widget
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(widgetVertices), widgetVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(widgetIndices),widgetIndices,GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
shader->setMat4("model",model);
glDrawElements(GL_TRIANGLES,144,GL_UNSIGNED_SHORT,0);
glBindVertexArray(0);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
// -------------------------------------------------------------------------------
glfwSwapBuffers(window);
glfwPollEvents();
}
объекты shader
и camera
являются экземплярами class Shader
и class Camera
, по отдельности.Затем мы можем сделать вызовы отрисовки:
while(1)
{
updateVerticesData();
updateSurfaceDate();
...
draw();
...
}
Однако отрисованные вещи не так обильны, как я ожидал: Когда я останавливаюсь через секунду после вызова отрисовки:
while(1)
{
updateVerticesData();
updateSurfaceDate();
...
draw();
sleep(1000); //halt one second
...
}
было обработано больше материала (в моем случае, больше поверхностей): я уверен, что проблема в том, что не все команды рендеринга были выполнены или выполнены за один вызов отрисовки, потому что каждое обновлениедобавит многочисленные данные в буфер.
На этой странице рекомендуется две команды синхронизации: glFlush
и glFinish
, но все равно у меня не работает.Кто может помочь?