mirror of
https://github.com/overte-org/overte.git
synced 2025-08-07 17:50:42 +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 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");
|
||||||
|
|
||||||
|
|
|
@ -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*) ¶meters));
|
_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 = 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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue