Как синхронизировать все команды рендеринга было завершено в один вызов отрисовки? - PullRequest
0 голосов
/ 26 июня 2019

Существует три вида рендеринга (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();
    ...
}

Однако отрисованные вещи не так обильны, как я ожидал: enter image description here Когда я останавливаюсь через секунду после вызова отрисовки:

while(1)
{
    updateVerticesData();
    updateSurfaceDate();
    ...
    draw();
    sleep(1000); //halt one second
    ...
}

было обработано больше материала (в моем случае, больше поверхностей): enter image description here я уверен, что проблема в том, что не все команды рендеринга были выполнены или выполнены за один вызов отрисовки, потому что каждое обновлениедобавит многочисленные данные в буфер.
На этой странице рекомендуется две команды синхронизации: glFlush и glFinish, но все равно у меня не работает.Кто может помочь?

...