From a8dd06ad38914045f282a63bcf1be1b5552f3ae9 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 18 Jul 2016 19:24:43 -0700 Subject: [PATCH] Better groupint of the diffuseion of the curvature for easier fix for mini mirror --- .../render-utils/src/RenderDeferredTask.cpp | 9 +++++--- .../render-utils/src/SurfaceGeometryPass.cpp | 22 +++++++++++++++---- .../render-utils/src/SurfaceGeometryPass.h | 5 ++++- libraries/render/src/render/BlurTask.cpp | 6 ++--- libraries/render/src/render/BlurTask.h | 4 +++- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 32c6cab40d..aa226e60bc 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -134,18 +134,21 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { const auto surfaceGeometryPassOutputs = addJob("SurfaceGeometry", surfaceGeometryPassInputs); const auto surfaceGeometryFramebuffer = surfaceGeometryPassOutputs.getN(0); const auto curvatureFramebuffer = surfaceGeometryPassOutputs.getN(1); + const auto midCurvatureNormalFramebuffer = surfaceGeometryPassOutputs.getN(2); + const auto lowCurvatureNormalFramebuffer = surfaceGeometryPassOutputs.getN(3); - const auto curvatureRangeTimer = addJob("BeginCurvatureRangeTimer"); + const auto scatteringResource = addJob("Scattering"); + +/* const auto curvatureRangeTimer = addJob("BeginCurvatureRangeTimer"); // TODO: Push this 2 diffusion stages into surfaceGeometryPass as they are working together const auto diffuseCurvaturePassInputs = BlurGaussianDepthAware::Inputs(curvatureFramebuffer, halfLinearDepthTexture).hasVarying(); const auto midCurvatureNormalFramebuffer = addJob("DiffuseCurvatureMid", diffuseCurvaturePassInputs); const auto lowCurvatureNormalFramebuffer = addJob("DiffuseCurvatureLow", diffuseCurvaturePassInputs, true); // THis blur pass generates it s render resource - const auto scatteringResource = addJob("Scattering"); addJob("CurvatureRangeTimer", curvatureRangeTimer); - +*/ // AO job addJob("AmbientOcclusion"); diff --git a/libraries/render-utils/src/SurfaceGeometryPass.cpp b/libraries/render-utils/src/SurfaceGeometryPass.cpp index f60fd3f3f8..3e1930f6ba 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.cpp +++ b/libraries/render-utils/src/SurfaceGeometryPass.cpp @@ -319,7 +319,10 @@ void SurfaceGeometryFramebuffer::setResolutionLevel(int resolutionLevel) { } } -SurfaceGeometryPass::SurfaceGeometryPass() { +SurfaceGeometryPass::SurfaceGeometryPass() : + _firstBlurPass(false), + _secondBlurPass(true, _firstBlurPass.getParameters()) +{ Parameters parameters; _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); } @@ -365,7 +368,7 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c // auto normalTexture = deferredFramebuffer->getDeferredNormalTexture(); auto normalTexture = linearDepthFramebuffer->getHalfNormalTexture(); - auto curvatureFBO = _surfaceGeometryFramebuffer->getCurvatureFramebuffer(); + auto curvatureFramebuffer = _surfaceGeometryFramebuffer->getCurvatureFramebuffer(); #ifdef USE_STENCIL_TEST if (curvatureFBO->getDepthStencilBuffer() != deferredFramebuffer->getPrimaryDepthTexture()) { curvatureFBO->setDepthStencilBuffer(deferredFramebuffer->getPrimaryDepthTexture(), deferredFramebuffer->getPrimaryDepthTexture()->getTexelFormat()); @@ -374,7 +377,7 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c auto curvatureTexture = _surfaceGeometryFramebuffer->getCurvatureTexture(); outputs.edit0() = _surfaceGeometryFramebuffer; - outputs.edit1() = curvatureFBO; + outputs.edit1() = curvatureFramebuffer; auto curvaturePipeline = getCurvaturePipeline(); @@ -396,7 +399,7 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c batch.setUniformBuffer(SurfaceGeometryPass_ParamsSlot, _parametersBuffer); // Curvature pass - batch.setFramebuffer(curvatureFBO); + batch.setFramebuffer(curvatureFramebuffer); // We can avoid the clear by drawing the same clear vallue from the makeCurvature shader. same performances or no worse @@ -416,6 +419,17 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c _gpuTimer.end(batch); }); + const auto diffuseCurvaturePassInputs = render::BlurGaussianDepthAware::Inputs(curvatureFramebuffer, linearDepthTexture); + gpu::FramebufferPointer midBlurredFramebuffer; + _firstBlurPass.run(sceneContext, renderContext, diffuseCurvaturePassInputs, midBlurredFramebuffer); + + gpu::FramebufferPointer lowBlurredFramebuffer; + _secondBlurPass.run(sceneContext, renderContext, diffuseCurvaturePassInputs, lowBlurredFramebuffer); + + + outputs.edit2() = midBlurredFramebuffer; + outputs.edit3() = lowBlurredFramebuffer; + auto config = std::static_pointer_cast(renderContext->jobConfig); config->gpuTime = _gpuTimer.getAverage(); } diff --git a/libraries/render-utils/src/SurfaceGeometryPass.h b/libraries/render-utils/src/SurfaceGeometryPass.h index 3f42a7ab1f..d0f79dad76 100644 --- a/libraries/render-utils/src/SurfaceGeometryPass.h +++ b/libraries/render-utils/src/SurfaceGeometryPass.h @@ -15,6 +15,7 @@ #include #include "render/DrawTask.h" +#include "render/BlurTask.h" #include "DeferredFrameTransform.h" #include "DeferredFramebuffer.h" @@ -162,7 +163,7 @@ signals: class SurfaceGeometryPass { public: using Inputs = render::VaryingSet3; - using Outputs = render::VaryingSet2; + using Outputs = render::VaryingSet4; using Config = SurfaceGeometryPassConfig; using JobModel = render::Job::ModelIO; @@ -196,6 +197,8 @@ private: gpu::PipelinePointer _curvaturePipeline; + render::BlurGaussianDepthAware _firstBlurPass; + render::BlurGaussianDepthAware _secondBlurPass; gpu::RangeTimer _gpuTimer; }; diff --git a/libraries/render/src/render/BlurTask.cpp b/libraries/render/src/render/BlurTask.cpp index 862c08bcbb..ddaaa82e31 100644 --- a/libraries/render/src/render/BlurTask.cpp +++ b/libraries/render/src/render/BlurTask.cpp @@ -258,10 +258,10 @@ void BlurGaussian::run(const SceneContextPointer& sceneContext, const RenderCont -BlurGaussianDepthAware::BlurGaussianDepthAware(bool generateOutputFramebuffer) : - _inOutResources(generateOutputFramebuffer) +BlurGaussianDepthAware::BlurGaussianDepthAware(bool generateOutputFramebuffer, const BlurParamsPointer& params) : + _inOutResources(generateOutputFramebuffer), + _parameters((params ? params : std::make_shared())) { - _parameters = std::make_shared(); } gpu::PipelinePointer BlurGaussianDepthAware::getBlurVPipeline() { diff --git a/libraries/render/src/render/BlurTask.h b/libraries/render/src/render/BlurTask.h index 7d8fb62fbc..b54e494a80 100644 --- a/libraries/render/src/render/BlurTask.h +++ b/libraries/render/src/render/BlurTask.h @@ -138,11 +138,13 @@ public: using Config = BlurGaussianDepthAwareConfig; using JobModel = Job::ModelIO; - BlurGaussianDepthAware(bool generateNewOutput = false); + BlurGaussianDepthAware(bool generateNewOutput = false, const BlurParamsPointer& params = BlurParamsPointer()); void configure(const Config& config); void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer); + const BlurParamsPointer& getParameters() const { return _parameters; } + protected: BlurParamsPointer _parameters;