mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 20:44:14 +02:00
Writing out depth buffer of outlined objects to texture working
This commit is contained in:
parent
0fb4e42e1f
commit
cfa23b1758
2 changed files with 9 additions and 10 deletions
|
@ -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<OutlineFramebuffer>();
|
||||
|
@ -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<gpu::State>();
|
||||
state->setDepthTest(gpu::State::DepthTest(false));
|
||||
state->setColorWriteMask(true, false, false, false);
|
||||
_debugPipeline = gpu::Pipeline::create(program, state);
|
||||
}
|
||||
|
||||
|
|
|
@ -88,7 +88,9 @@ void RenderDeferredTask::build(JobModel& task, const render::Varying& input, ren
|
|||
task.addJob<PrepareStencil>("PrepareStencil", primaryFramebuffer);
|
||||
|
||||
// Select items that need to be outlined
|
||||
const auto outlinedOpaques = task.addJob<PickItemsJob>("PickOutlined", opaques);
|
||||
const auto outlinedOpaques = task.addJob<PickItemsJob>("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();
|
||||
|
|
Loading…
Reference in a new issue