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; }
void OsmAnd::AtlasMapRendererDebugStage_OpenGL::render() { GL_PUSH_GROUP_MARKER(QLatin1String("debug")); renderRects2D(); renderLines2D(); renderLines3D(); renderQuads3D(); GL_POP_GROUP_MARKER; }
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; }
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; }