From cfa23b1758b5e40db34e90f3af6960776a4b008b Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Wed, 9 Aug 2017 12:32:32 +0200 Subject: [PATCH] Writing out depth buffer of outlined objects to texture working --- libraries/render-utils/src/OutlineEffect.cpp | 15 ++++++--------- libraries/render-utils/src/RenderDeferredTask.cpp | 4 +++- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/OutlineEffect.cpp b/libraries/render-utils/src/OutlineEffect.cpp index 45bf9c7d81..758783760d 100644 --- a/libraries/render-utils/src/OutlineEffect.cpp +++ b/libraries/render-utils/src/OutlineEffect.cpp @@ -48,10 +48,11 @@ void OutlineFramebuffer::allocate() { auto width = _frameSize.x; auto height = _frameSize.y; - auto colorFormat = gpu::Element::VEC4F_COLOR_RGBA; // TODO : find a more compact format + auto format = gpu::Element(gpu::SCALAR, gpu::FLOAT, gpu::RED); - _depthFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("outlineDepth", colorFormat, width, height)); - _depthTexture = _depthFramebuffer->getRenderBuffer(0); + _depthTexture = gpu::TexturePointer(gpu::Texture::createRenderBuffer(format, width, height)); + _depthFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("outlineDepth")); + _depthFramebuffer->setRenderBuffer(0, _depthTexture); } gpu::FramebufferPointer OutlineFramebuffer::getDepthFramebuffer() { @@ -72,9 +73,9 @@ void PrepareOutline::run(const render::RenderContextPointer& renderContext, cons auto outlinedItems = input.get1(); if (!outlinedItems.empty()) { - glm::uvec2 frameSize(renderContext->args->_viewport.z, renderContext->args->_viewport.w); auto args = renderContext->args; auto deferredFrameBuffer = input.get0(); + auto frameSize = deferredFrameBuffer->getFrameSize(); if (!_outlineFramebuffer) { _outlineFramebuffer = std::make_shared(); @@ -99,9 +100,6 @@ void PrepareOutline::run(const render::RenderContextPointer& renderContext, cons } gpu::doInBatch(args->_context, [&](gpu::Batch& batch) { - auto depthBuffer = deferredFrameBuffer->getPrimaryDepthTexture(); - - // Copy depth to texture as we will overwrite batch.enableStereo(false); batch.setViewportTransform(args->_viewport); @@ -111,7 +109,7 @@ void PrepareOutline::run(const render::RenderContextPointer& renderContext, cons batch.setFramebuffer(_outlineFramebuffer->getDepthFramebuffer()); batch.setPipeline(_copyDepthPipeline); - batch.setResourceTexture(0, depthBuffer); + batch.setResourceTexture(0, deferredFrameBuffer->getPrimaryDepthTexture()); batch.draw(gpu::TRIANGLE_STRIP, 4); // Restore previous frame buffer @@ -199,7 +197,6 @@ const gpu::PipelinePointer& DebugOutline::getDebugPipeline() { auto state = std::make_shared(); state->setDepthTest(gpu::State::DepthTest(false)); - state->setColorWriteMask(true, false, false, false); _debugPipeline = gpu::Pipeline::create(program, state); } diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 8740b767f6..ba045dfff9 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -88,7 +88,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren task.addJob("PrepareStencil", primaryFramebuffer); // Select items that need to be outlined - const auto outlinedOpaques = task.addJob("PickOutlined", opaques); + const auto outlinedOpaques = task.addJob("PickOutlined", opaques, + // Pick only shapes so exclude meta + render::ItemKey::Builder().withTypeShape().build()._flags, render::ItemKey::Builder().withTypeMeta().build()._flags); // Render opaque outline objects first in DeferredBuffer const auto opaqueOutlineInputs = DrawStateSortDeferred::Inputs(outlinedOpaques, lightingModel).hasVarying();