diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index ce42725ae..50dfd93ab 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -72,7 +72,6 @@ public: void setRenderPass(mbgl::RenderPass value) { renderPass = value; } /// Test whether to draw this drawable in a given render pass. - /// If multiple render pass bits are set, all must be present. bool hasRenderPass(const mbgl::RenderPass value) const { return (mbgl::underlying_type(renderPass) & mbgl::underlying_type(value)) != 0; } diff --git a/src/mbgl/gl/layer_group_gl.cpp b/src/mbgl/gl/layer_group_gl.cpp index c19c803f3..43ec8e6e6 100644 --- a/src/mbgl/gl/layer_group_gl.cpp +++ b/src/mbgl/gl/layer_group_gl.cpp @@ -42,8 +42,15 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) if (!drawable.hasRenderPass(parameters.pass)) { return; } - if (drawable.hasRenderPass(RenderPass::Opaque) && parameters.currentLayer >= parameters.opaquePassCutoff) { - return; + + // If this drawable can render either opaque or translucent... + if (drawable.hasAllRenderPasses(RenderPass::Opaque | RenderPass::Translucent)) { + // Render it only in the translucent pass if we're below the cutoff, and only in the opaque pass otherwise + // (parameters.currentLayer >= parameters.opaquePassCutoff) ? RenderPass::Opaque : RenderPass::Translucent; + if ((parameters.currentLayer < parameters.opaquePassCutoff && parameters.pass != RenderPass::Translucent) || + (parameters.currentLayer >= parameters.opaquePassCutoff && parameters.pass != RenderPass::Opaque)) { + return; + } } #if !defined(NDEBUG)