Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 3 files). Show all
Unified · Split
| @@ -211,6 +211,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren · 210 unmodified lines | ||
| 211 | 211 | const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN<FilterLayeredItems::Outputs>(0); |
| 212 | 212 | const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN<FilterLayeredItems::Outputs>(0); |
| 213 | 213 | |
| 214 | + // We don't want the overlay to clear the deferred frame buffer depth because we would like to keep it for debugging visualisation | |
| 215 | + task.addJob<SetSeparateDeferredDepthBuffer>("SeparateDepthForOverlay", deferredFramebuffer); | |
| 216 | + | |
| 214 | 217 | const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying(); |
| 215 | 218 | const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying(); |
| 216 | 219 | task.addJob<DrawOverlay3D>("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true); |
| @@ -451,3 +454,26 @@ void DrawStateSortDeferred::run(const RenderContextPointer& renderContext, const · 234 unmodified lines | ||
| 451 | 454 | |
| 452 | 455 | config->setNumDrawn((int)inItems.size()); |
| 453 | 456 | } |
| 457 | + | |
| 458 | +void SetSeparateDeferredDepthBuffer::run(const render::RenderContextPointer& renderContext, const Inputs& inputs) { | |
| 459 | + assert(renderContext->args); | |
| 460 | + | |
| 461 | + const auto deferredFramebuffer = inputs->getDeferredFramebuffer(); | |
| 462 | + const auto frameSize = deferredFramebuffer->getSize(); | |
| 463 | + const auto renderbufferCount = deferredFramebuffer->getNumRenderBuffers(); | |
| 464 | + | |
| 465 | + if (!_framebuffer || _framebuffer->getSize() != frameSize || _framebuffer->getNumRenderBuffers() != renderbufferCount) { | |
| 466 | + auto depthFormat = deferredFramebuffer->getDepthStencilBufferFormat(); | |
| 467 | + auto depthStencilTexture = gpu::TexturePointer(gpu::Texture::createRenderBuffer(depthFormat, frameSize.x, frameSize.y)); | |
| 468 | + _framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("deferredFramebufferSeparateDepth")); | |
| 469 | + _framebuffer->setDepthStencilBuffer(depthStencilTexture, depthFormat); | |
| 470 | + for (decltype(deferredFramebuffer->getNumRenderBuffers()) i = 0; i < renderbufferCount; i++) { | |
| 471 | + _framebuffer->setRenderBuffer(i, deferredFramebuffer->getRenderBuffer(i)); | |
| 472 | + } | |
| 473 | + } | |
| 474 | + | |
| 475 | + RenderArgs* args = renderContext->args; | |
| 476 | + gpu::doInBatch("SetSeparateDeferredDepthBuffer::run", args->_context, [this](gpu::Batch& batch) { | |
| 477 | + batch.setFramebuffer(_framebuffer); | |
| 478 | + }); | |
| 479 | +} | |