bool OsmAnd::AtlasMapRendererDebugStage_OpenGL::render(IMapRenderer_Metrics::Metric_renderFrame* const metric_)
{
    const auto metric = dynamic_cast<AtlasMapRenderer_Metrics::Metric_renderFrame*>(metric_);

    bool ok = true;

    GL_PUSH_GROUP_MARKER(QLatin1String("debug"));

    Stopwatch rects2dStopwatch(metric != nullptr);
    ok = ok && renderRects2D();
    if (metric)
        metric->elapsedTimeForDebugRects2D = rects2dStopwatch.elapsed();

    Stopwatch lines2dStopwatch(metric != nullptr);
    ok = ok && renderLines2D();
    if (metric)
        metric->elapsedTimeForDebugLines2D = lines2dStopwatch.elapsed();

    Stopwatch lines3dStopwatch(metric != nullptr);
    ok = ok && renderLines3D();
    if (metric)
        metric->elapsedTimeForDebugLines3D = lines3dStopwatch.elapsed();

    Stopwatch quads3dStopwatch(metric != nullptr);
    ok = ok && renderQuads3D();
    if (metric)
        metric->elapsedTimeForDebugQuad3D = quads3dStopwatch.elapsed();

    GL_POP_GROUP_MARKER;

    return ok;
}
コード例 #2
0
void OsmAnd::AtlasMapRendererDebugStage_OpenGL::render()
{
    GL_PUSH_GROUP_MARKER(QLatin1String("debug"));

    renderRects2D();
    renderLines2D();
    renderLines3D();
    renderQuads3D();

    GL_POP_GROUP_MARKER;
}
コード例 #3
0
void OsmAnd::AtlasMapRendererSkyStage_OpenGL::render()
{
    const auto gpuAPI = getGPUAPI();

    GL_PUSH_GROUP_MARKER(QLatin1String("sky"));

    GL_CHECK_PRESENT(glUseProgram);
    GL_CHECK_PRESENT(glUniformMatrix4fv);
    GL_CHECK_PRESENT(glUniform1f);
    GL_CHECK_PRESENT(glUniform2f);
    GL_CHECK_PRESENT(glUniform3f);
    GL_CHECK_PRESENT(glDrawElements);

    // Set sky plane VAO
    gpuAPI->glBindVertexArray_wrapper(_skyplaneVAO);
    GL_CHECK_RESULT;

    // Activate program
    glUseProgram(_program.id);
    GL_CHECK_RESULT;

    // Set projection*view*model matrix:
    const auto mFogTranslate = glm::translate(glm::vec3(0.0f, 0.0f, -internalState.correctedFogDistance));
    const auto mModel = internalState.mAzimuthInv * mFogTranslate;
    const auto mProjectionViewModel = internalState.mPerspectiveProjection * internalState.mCameraView * mModel;
    glUniformMatrix4fv(_program.vs.param.mProjectionViewModel, 1, GL_FALSE, glm::value_ptr(mProjectionViewModel));
    GL_CHECK_RESULT;

    // Set size of the skyplane
    glUniform2f(_program.vs.param.planeSize, internalState.skyplaneSize.x, internalState.skyplaneSize.y);
    GL_CHECK_RESULT;

    // Set sky parameters
    glUniform4f(_program.fs.param.skyColor, currentState.skyColor.r, currentState.skyColor.g, currentState.skyColor.b, 1.0f);
    GL_CHECK_RESULT;

    // Draw the skyplane actually
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
    GL_CHECK_RESULT;

    // Deactivate program
    glUseProgram(0);
    GL_CHECK_RESULT;

    // Deselect VAO
    gpuAPI->glBindVertexArray_wrapper(0);
    GL_CHECK_RESULT;

    GL_POP_GROUP_MARKER;
}
コード例 #4
0
bool OsmAnd::AtlasMapRenderer_OpenGL::doRenderFrame()
{
    GL_PUSH_GROUP_MARKER(QLatin1String("OsmAndCore"));

    GL_CHECK_PRESENT(glViewport);
    GL_CHECK_PRESENT(glEnable);
    GL_CHECK_PRESENT(glDisable);
    GL_CHECK_PRESENT(glBlendFunc);
    GL_CHECK_PRESENT(glClear);

#if OSMAND_DEBUG
    _debugStage.clear();
#endif

    // Setup viewport
    glViewport(
        currentState.viewport.left,
        currentState.windowSize.y - currentState.viewport.bottom,
        currentState.viewport.width(),
        currentState.viewport.height());
    GL_CHECK_RESULT;

    // Clear buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    GL_CHECK_RESULT;

    // Turn off blending for sky and map stages
    glDisable(GL_BLEND);
    GL_CHECK_RESULT;

    // Turn on depth testing for sky stage (since with disabled depth test, write to depth buffer is blocked),
    // but since sky is on top of everything, accept all fragments
    glEnable(GL_DEPTH_TEST);
    GL_CHECK_RESULT;
    glDepthFunc(GL_ALWAYS);
    GL_CHECK_RESULT;

    // Render the sky
    _skyStage.render();

    // Change depth test function prior to raster map stage and further stages
    glDepthFunc(GL_LEQUAL);
    GL_CHECK_RESULT;

    // Raster map stage is rendered without blending, since it's done in fragment shader
    _rasterMapStage.render();

    // Turn on blending since now objects with transparency are going to be rendered
    glEnable(GL_BLEND);
    GL_CHECK_RESULT;
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GL_CHECK_RESULT;

    // Render map symbols without writing depth buffer, since symbols use own sorting and intersection checking
    //NOTE: Currently map symbols are incompatible with height-maps
    glDepthMask(GL_FALSE);
    GL_CHECK_RESULT;
    _symbolsStage.render();
    glDepthMask(GL_TRUE);
    GL_CHECK_RESULT;

    //TODO: render special fog object some day

#if OSMAND_DEBUG
    glDisable(GL_DEPTH_TEST);
    GL_CHECK_RESULT;

    _debugStage.render();

    glEnable(GL_DEPTH_TEST);
    GL_CHECK_RESULT;
#endif

    GL_POP_GROUP_MARKER;

    return true;
}