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 surfaceGeometryFramebuffer = surfaceGeometryPassOutputs.getN<SurfaceGeometryPass::Outputs>(0);
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
const auto diffuseCurvaturePassInputs = BlurGaussianDepthAware::Inputs(curvatureFramebuffer, halfLinearDepthTexture).hasVarying();
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 scatteringResource = addJob<SubsurfaceScattering>("Scattering");
addJob<EndGPURangeTimer>("CurvatureRangeTimer", curvatureRangeTimer);
*/
// AO job
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;
_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 = 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<Config>(renderContext->jobConfig);
config->gpuTime = _gpuTimer.getAverage();
}

View file

@ -15,6 +15,7 @@
#include <DependencyManager.h>
#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<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 JobModel = render::Job::ModelIO<SurfaceGeometryPass, Inputs, Outputs, Config>;
@ -196,6 +197,8 @@ private:
gpu::PipelinePointer _curvaturePipeline;
render::BlurGaussianDepthAware _firstBlurPass;
render::BlurGaussianDepthAware _secondBlurPass;
gpu::RangeTimer _gpuTimer;
};

View file

@ -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<BlurParams>()))
{
_parameters = std::make_shared<BlurParams>();
}
gpu::PipelinePointer BlurGaussianDepthAware::getBlurVPipeline() {

View file

@ -138,11 +138,13 @@ public:
using Config = BlurGaussianDepthAwareConfig;
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 run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& SourceAndDepth, gpu::FramebufferPointer& blurredFramebuffer);
const BlurParamsPointer& getParameters() const { return _parameters; }
protected:
BlurParamsPointer _parameters;