12 #ifndef hifi_SurfaceGeometryPass_h
13 #define hifi_SurfaceGeometryPass_h
15 #include <DependencyManager.h>
17 #include "render/DrawTask.h"
18 #include "render/BlurTask.h"
19 #include "DeferredFrameTransform.h"
20 #include "DeferredFramebuffer.h"
25 class LinearDepthFramebuffer {
27 LinearDepthFramebuffer();
29 gpu::FramebufferPointer getLinearDepthFramebuffer();
30 gpu::TexturePointer getLinearDepthTexture();
31 gpu::TexturePointer getNormalTexture();
33 gpu::FramebufferPointer getDownsampleFramebuffer();
34 gpu::TexturePointer getHalfLinearDepthTexture();
35 gpu::TexturePointer getHalfNormalTexture();
38 void update(
const gpu::TexturePointer& depthBuffer,
const gpu::TexturePointer& normalTexture,
bool isStereo);
39 const glm::ivec2& getDepthFrameSize()
const {
return _frameSize; }
41 void setResolutionLevel(
int level) { _resolutionLevel = std::max(0, level); }
42 int getResolutionLevel()
const {
return _resolutionLevel; }
48 gpu::TexturePointer _primaryDepthTexture;
50 gpu::FramebufferPointer _linearDepthFramebuffer;
51 gpu::TexturePointer _linearDepthTexture;
52 gpu::TexturePointer _normalTexture;
54 gpu::FramebufferPointer _downsampleFramebuffer;
55 gpu::TexturePointer _halfLinearDepthTexture;
56 gpu::TexturePointer _halfNormalTexture;
59 glm::ivec2 _frameSize;
60 glm::ivec2 _halfFrameSize;
61 int _resolutionLevel{ 0 };
62 bool _isStereo{
false };
65 using LinearDepthFramebufferPointer = std::shared_ptr<LinearDepthFramebuffer>;
67 using LinearDepthPassConfig = render::GPUJobConfig;
69 class LinearDepthPass {
71 using Inputs = render::VaryingSet2<DeferredFrameTransformPointer, DeferredFramebufferPointer>;
72 using Outputs = render::VaryingSet5<LinearDepthFramebufferPointer, gpu::FramebufferPointer, gpu::TexturePointer, gpu::TexturePointer, gpu::TexturePointer>;
73 using Config = LinearDepthPassConfig;
74 using JobModel = render::Job::ModelIO<LinearDepthPass, Inputs, Outputs, Config>;
78 void configure(
const Config& config);
79 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& outputs);
82 LinearDepthFramebufferPointer _linearDepthFramebuffer;
84 static const gpu::PipelinePointer& getLinearDepthPipeline();
85 static gpu::PipelinePointer _linearDepthPipeline;
87 static const gpu::PipelinePointer& getDownsamplePipeline();
88 static gpu::PipelinePointer _downsamplePipeline;
90 gpu::RangeTimerPointer _gpuTimer;
96 class SurfaceGeometryFramebuffer {
98 SurfaceGeometryFramebuffer();
100 gpu::FramebufferPointer getCurvatureFramebuffer();
101 gpu::TexturePointer getCurvatureTexture();
103 gpu::FramebufferPointer getLowCurvatureFramebuffer();
104 gpu::TexturePointer getLowCurvatureTexture();
106 gpu::FramebufferPointer getBlurringFramebuffer();
107 gpu::TexturePointer getBlurringTexture();
110 void update(
const gpu::TexturePointer& linearDepthBuffer);
111 gpu::TexturePointer getLinearDepthTexture();
112 const glm::ivec2& getSourceFrameSize()
const {
return _frameSize; }
114 void setResolutionLevel(
int level);
115 int getResolutionLevel()
const {
return _resolutionLevel; }
121 gpu::TexturePointer _linearDepthTexture;
123 gpu::FramebufferPointer _curvatureFramebuffer;
124 gpu::TexturePointer _curvatureTexture;
126 gpu::FramebufferPointer _blurringFramebuffer;
127 gpu::TexturePointer _blurringTexture;
129 gpu::FramebufferPointer _lowCurvatureFramebuffer;
130 gpu::TexturePointer _lowCurvatureTexture;
132 glm::ivec2 _frameSize;
133 int _resolutionLevel{ 0 };
136 using SurfaceGeometryFramebufferPointer = std::shared_ptr<SurfaceGeometryFramebuffer>;
138 class SurfaceGeometryPassConfig :
public render::GPUJobConfig {
140 Q_PROPERTY(
float depthThreshold MEMBER depthThreshold NOTIFY dirty)
141 Q_PROPERTY(
float basisScale MEMBER basisScale NOTIFY dirty)
142 Q_PROPERTY(
float curvatureScale MEMBER curvatureScale NOTIFY dirty)
143 Q_PROPERTY(
int resolutionLevel MEMBER resolutionLevel NOTIFY dirty)
145 Q_PROPERTY(
float diffuseFilterScale MEMBER diffuseFilterScale NOTIFY dirty)
146 Q_PROPERTY(
float diffuseDepthThreshold MEMBER diffuseDepthThreshold NOTIFY dirty)
149 SurfaceGeometryPassConfig() : render::GPUJobConfig(true) {}
151 float depthThreshold{ 5.0f };
152 float basisScale{ 1.0f };
153 float curvatureScale{ 10.0f };
154 int resolutionLevel{ 1 };
155 float diffuseFilterScale{ 0.2f };
156 float diffuseDepthThreshold{ 1.0f };
162 class SurfaceGeometryPass {
164 using Inputs = render::VaryingSet3<DeferredFrameTransformPointer, DeferredFramebufferPointer, LinearDepthFramebufferPointer>;
165 using Outputs = render::VaryingSet4<SurfaceGeometryFramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
166 using Config = SurfaceGeometryPassConfig;
167 using JobModel = render::Job::ModelIO<SurfaceGeometryPass, Inputs, Outputs, Config>;
169 SurfaceGeometryPass();
171 void configure(
const Config& config);
172 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& outputs);
175 float getCurvatureDepthThreshold()
const {
return _parametersBuffer.get<Parameters>().curvatureInfo.x; }
176 float getCurvatureBasisScale()
const {
return _parametersBuffer.get<Parameters>().curvatureInfo.y; }
177 float getCurvatureScale()
const {
return _parametersBuffer.get<Parameters>().curvatureInfo.w; }
178 int getResolutionLevel()
const {
return (
int)_parametersBuffer.get<Parameters>().resolutionInfo.w; }
181 typedef gpu::BufferView UniformBufferView;
187 glm::vec4 resolutionInfo { 0.0f, 0.0f, 0.0f, 1.0f };
189 glm::vec4 curvatureInfo{ 0.0f };
193 gpu::BufferView _parametersBuffer;
195 SurfaceGeometryFramebufferPointer _surfaceGeometryFramebuffer;
197 static const gpu::PipelinePointer& getCurvaturePipeline();
199 static gpu::PipelinePointer _curvaturePipeline;
201 render::BlurGaussianDepthAware _diffusePass;
203 gpu::RangeTimerPointer _gpuTimer;