Better groupint of the diffuseion of the curvature for easier fix for mini mirror

This commit is contained in:
samcake 2016-07-18 19:24:43 -07:00
parent 34f2a96888
commit a8dd06ad38
5 changed files with 34 additions and 12 deletions

View file

@ -134,18 +134,21 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) {
const auto surfaceGeometryPassOutputs = addJob<SurfaceGeometryPass>("SurfaceGeometry", surfaceGeometryPassInputs); const auto surfaceGeometryPassOutputs = addJob<SurfaceGeometryPass>("SurfaceGeometry", surfaceGeometryPassInputs);
const auto surfaceGeometryFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(0); const auto surfaceGeometryFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(0);
const auto curvatureFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(1); const auto curvatureFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(1);
const auto midCurvatureNormalFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(2);
const auto lowCurvatureNormalFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(3);
const auto curvatureRangeTimer = addJob<BeginGPURangeTimer>("BeginCurvatureRangeTimer"); const auto scatteringResource = addJob<SubsurfaceScattering>("Scattering");
/* const auto curvatureRangeTimer = addJob<BeginGPURangeTimer>("BeginCurvatureRangeTimer");
// TODO: Push this 2 diffusion stages into surfaceGeometryPass as they are working together // TODO: Push this 2 diffusion stages into surfaceGeometryPass as they are working together
const auto diffuseCurvaturePassInputs = BlurGaussianDepthAware::Inputs(curvatureFramebuffer, halfLinearDepthTexture).hasVarying(); const auto diffuseCurvaturePassInputs = BlurGaussianDepthAware::Inputs(curvatureFramebuffer, halfLinearDepthTexture).hasVarying();
const auto midCurvatureNormalFramebuffer = addJob<render::BlurGaussianDepthAware>("DiffuseCurvatureMid", diffuseCurvaturePassInputs); const auto midCurvatureNormalFramebuffer = addJob<render::BlurGaussianDepthAware>("DiffuseCurvatureMid", diffuseCurvaturePassInputs);
const auto lowCurvatureNormalFramebuffer = addJob<render::BlurGaussianDepthAware>("DiffuseCurvatureLow", diffuseCurvaturePassInputs, true); // THis blur pass generates it s render resource const auto lowCurvatureNormalFramebuffer = addJob<render::BlurGaussianDepthAware>("DiffuseCurvatureLow", diffuseCurvaturePassInputs, true); // THis blur pass generates it s render resource
const auto scatteringResource = addJob<SubsurfaceScattering>("Scattering");
addJob<EndGPURangeTimer>("CurvatureRangeTimer", curvatureRangeTimer); addJob<EndGPURangeTimer>("CurvatureRangeTimer", curvatureRangeTimer);
*/
// AO job // AO job
addJob<AmbientOcclusionEffect>("AmbientOcclusion"); addJob<AmbientOcclusionEffect>("AmbientOcclusion");

View file

@ -319,7 +319,10 @@ void SurfaceGeometryFramebuffer::setResolutionLevel(int resolutionLevel) {
} }
} }
SurfaceGeometryPass::SurfaceGeometryPass() { SurfaceGeometryPass::SurfaceGeometryPass() :
_firstBlurPass(false),
_secondBlurPass(true, _firstBlurPass.getParameters())
{
Parameters parameters; Parameters parameters;
_parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) &parameters)); _parametersBuffer = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(Parameters), (const gpu::Byte*) &parameters));
} }
@ -365,7 +368,7 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c
// auto normalTexture = deferredFramebuffer->getDeferredNormalTexture(); // auto normalTexture = deferredFramebuffer->getDeferredNormalTexture();
auto normalTexture = linearDepthFramebuffer->getHalfNormalTexture(); auto normalTexture = linearDepthFramebuffer->getHalfNormalTexture();
auto curvatureFBO = _surfaceGeometryFramebuffer->getCurvatureFramebuffer(); auto curvatureFramebuffer = _surfaceGeometryFramebuffer->getCurvatureFramebuffer();
#ifdef USE_STENCIL_TEST #ifdef USE_STENCIL_TEST
if (curvatureFBO->getDepthStencilBuffer() != deferredFramebuffer->getPrimaryDepthTexture()) { if (curvatureFBO->getDepthStencilBuffer() != deferredFramebuffer->getPrimaryDepthTexture()) {
curvatureFBO->setDepthStencilBuffer(deferredFramebuffer->getPrimaryDepthTexture(), deferredFramebuffer->getPrimaryDepthTexture()->getTexelFormat()); curvatureFBO->setDepthStencilBuffer(deferredFramebuffer->getPrimaryDepthTexture(), deferredFramebuffer->getPrimaryDepthTexture()->getTexelFormat());
@ -374,7 +377,7 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c
auto curvatureTexture = _surfaceGeometryFramebuffer->getCurvatureTexture(); auto curvatureTexture = _surfaceGeometryFramebuffer->getCurvatureTexture();
outputs.edit0() = _surfaceGeometryFramebuffer; outputs.edit0() = _surfaceGeometryFramebuffer;
outputs.edit1() = curvatureFBO; outputs.edit1() = curvatureFramebuffer;
auto curvaturePipeline = getCurvaturePipeline(); auto curvaturePipeline = getCurvaturePipeline();
@ -396,7 +399,7 @@ void SurfaceGeometryPass::run(const render::SceneContextPointer& sceneContext, c
batch.setUniformBuffer(SurfaceGeometryPass_ParamsSlot, _parametersBuffer); batch.setUniformBuffer(SurfaceGeometryPass_ParamsSlot, _parametersBuffer);
// Curvature pass // 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 // 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); _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<Config>(renderContext->jobConfig); auto config = std::static_pointer_cast<Config>(renderContext->jobConfig);
config->gpuTime = _gpuTimer.getAverage(); config->gpuTime = _gpuTimer.getAverage();
} }

View file

@ -15,6 +15,7 @@
#include <DependencyManager.h> #include <DependencyManager.h>
#include "render/DrawTask.h" #include "render/DrawTask.h"
#include "render/BlurTask.h"
#include "DeferredFrameTransform.h" #include "DeferredFrameTransform.h"
#include "DeferredFramebuffer.h" #include "DeferredFramebuffer.h"
@ -162,7 +163,7 @@ signals:
class SurfaceGeometryPass { class SurfaceGeometryPass {
public: public:
using Inputs = render::VaryingSet3<DeferredFrameTransformPointer, DeferredFramebufferPointer, LinearDepthFramebufferPointer>; using Inputs = render::VaryingSet3<DeferredFrameTransformPointer, DeferredFramebufferPointer, LinearDepthFramebufferPointer>;
using Outputs = render::VaryingSet2<SurfaceGeometryFramebufferPointer, gpu::FramebufferPointer>; using Outputs = render::VaryingSet4<SurfaceGeometryFramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
using Config = SurfaceGeometryPassConfig; using Config = SurfaceGeometryPassConfig;
using JobModel = render::Job::ModelIO<SurfaceGeometryPass, Inputs, Outputs, Config>; using JobModel = render::Job::ModelIO<SurfaceGeometryPass, Inputs, Outputs, Config>;
@ -196,6 +197,8 @@ private:
gpu::PipelinePointer _curvaturePipeline; gpu::PipelinePointer _curvaturePipeline;
render::BlurGaussianDepthAware _firstBlurPass;
render::BlurGaussianDepthAware _secondBlurPass;
gpu::RangeTimer _gpuTimer; gpu::RangeTimer _gpuTimer;
}; };

View file

@ -258,10 +258,10 @@ void BlurGaussian::run(const SceneContextPointer& sceneContext, const RenderCont
BlurGaussianDepthAware::BlurGaussianDepthAware(bool generateOutputFramebuffer) : BlurGaussianDepthAware::BlurGaussianDepthAware(bool generateOutputFramebuffer, const BlurParamsPointer& params) :
_inOutResources(generateOutputFramebuffer) _inOutResources(generateOutputFramebuffer),
_parameters((params ? params : std::make_shared<BlurParams>()))
{ {
_parameters = std::make_shared<BlurParams>();
} }
gpu::PipelinePointer BlurGaussianDepthAware::getBlurVPipeline() { gpu::PipelinePointer BlurGaussianDepthAware::getBlurVPipeline() {

View file

@ -138,11 +138,13 @@ public:
using Config = BlurGaussianDepthAwareConfig; using Config = BlurGaussianDepthAwareConfig;
using JobModel = Job::ModelIO<BlurGaussianDepthAware, Inputs, gpu::FramebufferPointer, Config>; using JobModel = Job::ModelIO<BlurGaussianDepthAware, Inputs, gpu::FramebufferPointer, Config>;
BlurGaussianDepthAware(bool generateNewOutput = false); BlurGaussianDepthAware(bool generateNewOutput = false, const BlurParamsPointer& params = BlurParamsPointer());
void configure(const Config& config); void configure(const Config& config);
void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer); void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer);
const BlurParamsPointer& getParameters() const { return _parameters; }
protected: protected:
BlurParamsPointer _parameters; BlurParamsPointer _parameters;