mirror of
https://github.com/lubosz/overte.git
synced 2025-04-09 08:22:30 +02:00
Better groupint of the diffuseion of the curvature for easier fix for mini mirror
This commit is contained in:
parent
34f2a96888
commit
a8dd06ad38
5 changed files with 34 additions and 12 deletions
|
@ -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");
|
||||
|
||||
|
|
|
@ -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*) ¶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<Config>(renderContext->jobConfig);
|
||||
config->gpuTime = _gpuTimer.getAverage();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue