mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:37:49 +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 width = _frameSize.x;
|
||||||
auto height = _frameSize.y;
|
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 = gpu::TexturePointer(gpu::Texture::createRenderBuffer(format, width, height));
|
||||||
_depthTexture = _depthFramebuffer->getRenderBuffer(0);
|
_depthFramebuffer = gpu::FramebufferPointer(gpu::Framebuffer::create("outlineDepth"));
|
||||||
|
_depthFramebuffer->setRenderBuffer(0, _depthTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
gpu::FramebufferPointer OutlineFramebuffer::getDepthFramebuffer() {
|
gpu::FramebufferPointer OutlineFramebuffer::getDepthFramebuffer() {
|
||||||
|
@ -72,9 +73,9 @@ void PrepareOutline::run(const render::RenderContextPointer& renderContext, cons
|
||||||
auto outlinedItems = input.get1();
|
auto outlinedItems = input.get1();
|
||||||
|
|
||||||
if (!outlinedItems.empty()) {
|
if (!outlinedItems.empty()) {
|
||||||
glm::uvec2 frameSize(renderContext->args->_viewport.z, renderContext->args->_viewport.w);
|
|
||||||
auto args = renderContext->args;
|
auto args = renderContext->args;
|
||||||
auto deferredFrameBuffer = input.get0();
|
auto deferredFrameBuffer = input.get0();
|
||||||
|
auto frameSize = deferredFrameBuffer->getFrameSize();
|
||||||
|
|
||||||
if (!_outlineFramebuffer) {
|
if (!_outlineFramebuffer) {
|
||||||
_outlineFramebuffer = std::make_shared<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) {
|
gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
|
||||||
auto depthBuffer = deferredFrameBuffer->getPrimaryDepthTexture();
|
|
||||||
|
|
||||||
// Copy depth to texture as we will overwrite
|
|
||||||
batch.enableStereo(false);
|
batch.enableStereo(false);
|
||||||
|
|
||||||
batch.setViewportTransform(args->_viewport);
|
batch.setViewportTransform(args->_viewport);
|
||||||
|
@ -111,7 +109,7 @@ void PrepareOutline::run(const render::RenderContextPointer& renderContext, cons
|
||||||
|
|
||||||
batch.setFramebuffer(_outlineFramebuffer->getDepthFramebuffer());
|
batch.setFramebuffer(_outlineFramebuffer->getDepthFramebuffer());
|
||||||
batch.setPipeline(_copyDepthPipeline);
|
batch.setPipeline(_copyDepthPipeline);
|
||||||
batch.setResourceTexture(0, depthBuffer);
|
batch.setResourceTexture(0, deferredFrameBuffer->getPrimaryDepthTexture());
|
||||||
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
batch.draw(gpu::TRIANGLE_STRIP, 4);
|
||||||
|
|
||||||
// Restore previous frame buffer
|
// Restore previous frame buffer
|
||||||
|
@ -199,7 +197,6 @@ const gpu::PipelinePointer& DebugOutline::getDebugPipeline() {
|
||||||
|
|
||||||
auto state = std::make_shared<gpu::State>();
|
auto state = std::make_shared<gpu::State>();
|
||||||
state->setDepthTest(gpu::State::DepthTest(false));
|
state->setDepthTest(gpu::State::DepthTest(false));
|
||||||
state->setColorWriteMask(true, false, false, false);
|
|
||||||
_debugPipeline = gpu::Pipeline::create(program, state);
|
_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);
|
task.addJob<PrepareStencil>("PrepareStencil", primaryFramebuffer);
|
||||||
|
|
||||||
// Select items that need to be outlined
|
// 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
|
// Render opaque outline objects first in DeferredBuffer
|
||||||
const auto opaqueOutlineInputs = DrawStateSortDeferred::Inputs(outlinedOpaques, lightingModel).hasVarying();
|
const auto opaqueOutlineInputs = DrawStateSortDeferred::Inputs(outlinedOpaques, lightingModel).hasVarying();
|
||||||
|
|
Loading…
Reference in a new issue