Layer Rendering: order / depth buffer (#1290)
Co-authored-by: Bart Louwers <bart@emeel.net> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Tim Sylvester <tim@wetdogweather.com> Co-authored-by: Alex Cristici <alex.cristici@gmail.com>
This commit is contained in:
committed by
Bart Louwers
parent
8f6bab98c1
commit
b73f101d11
@@ -72,16 +72,6 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters)
|
||||
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)
|
||||
std::string label_tile;
|
||||
if (const auto& tileID = drawable.getTileID()) {
|
||||
@@ -128,45 +118,13 @@ void LayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (getDrawableCount()) {
|
||||
#if !defined(NDEBUG)
|
||||
const auto label = getName() + (getName().empty() ? "" : "-") + "tile-clip-masks";
|
||||
const auto debugGroup = parameters.encoder->createDebugGroup(label.c_str());
|
||||
#endif
|
||||
|
||||
// Collect the tile IDs relevant to stenciling and update the stencil buffer, if necessary.
|
||||
std::set<UnwrappedTileID> tileIDs;
|
||||
observeDrawables([&](const gfx::Drawable& drawable) {
|
||||
if (drawable.getEnabled() && drawable.getNeedsStencil() && drawable.getTileID() &&
|
||||
drawable.hasRenderPass(parameters.pass)) {
|
||||
tileIDs.emplace(drawable.getTileID()->toUnwrapped());
|
||||
}
|
||||
});
|
||||
parameters.renderTileClippingMasks(tileIDs);
|
||||
}
|
||||
|
||||
observeDrawables([&](gfx::Drawable& drawable) {
|
||||
if (!drawable.getEnabled() || !drawable.hasRenderPass(parameters.pass)) {
|
||||
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)
|
||||
std::string label;
|
||||
if (const auto& tileID = drawable.getTileID()) {
|
||||
label = drawable.getName() + "/" + util::toString(*tileID);
|
||||
}
|
||||
const auto labelPtr = (label.empty() ? drawable.getName() : label).c_str();
|
||||
const auto debugGroup = parameters.encoder->createDebugGroup(labelPtr);
|
||||
const auto debugGroup = parameters.encoder->createDebugGroup(drawable.getName().c_str());
|
||||
#endif
|
||||
|
||||
drawable.draw(parameters);
|
||||
|
||||
@@ -447,7 +447,8 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders,
|
||||
std::inserter(newTileIDs, newTileIDs.begin()),
|
||||
[](const auto& renderTile) -> OverscaledTileID { return renderTile.get().getOverscaledTileID(); });
|
||||
|
||||
const auto renderPass = static_cast<RenderPass>(evaluatedProperties->renderPasses);
|
||||
const RenderPass renderPass = static_cast<RenderPass>(evaluatedProperties->renderPasses &
|
||||
~mbgl::underlying_type(RenderPass::Opaque));
|
||||
|
||||
tileLayerGroup->observeDrawables([&](gfx::UniqueDrawable& drawable) {
|
||||
// If the render pass has changed or the tile has dropped out of the cover set, remove it.
|
||||
@@ -463,8 +464,8 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders,
|
||||
std::unique_ptr<gfx::DrawableBuilder> builder = context.createDrawableBuilder(name);
|
||||
builder->setShader(std::static_pointer_cast<gfx::ShaderProgramBase>(shader));
|
||||
builder->setRenderPass(renderPass);
|
||||
builder->setDepthType((renderPass == RenderPass::Opaque) ? gfx::DepthMaskType::ReadWrite
|
||||
: gfx::DepthMaskType::ReadOnly);
|
||||
builder->setSubLayerIndex(0);
|
||||
builder->setDepthType(gfx::DepthMaskType::ReadOnly);
|
||||
builder->setCullFaceMode(gfx::CullFaceMode::disabled());
|
||||
builder->setNeedsStencil(true);
|
||||
builder->setVertexAttrName("a_pos_normal");
|
||||
|
||||
@@ -381,7 +381,8 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(
|
||||
for (size_t i = 0; i < orderedLayers.size(); ++i) {
|
||||
RenderLayer& layer = orderedLayers[i];
|
||||
layer.markLayerRenderable(
|
||||
layerRenderItems.find(LayerRenderItem(layer, nullptr, static_cast<uint32_t>(i))) != layerRenderItems.end(),
|
||||
layerRenderItems.find(LayerRenderItem(layer, nullptr, static_cast<uint32_t>(layer.getLayerIndex()))) !=
|
||||
layerRenderItems.end(),
|
||||
changes);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user