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 typedef gpu::BufferView UniformBufferView;
84 LinearDepthFramebufferPointer _linearDepthFramebuffer;
86 const gpu::PipelinePointer& getLinearDepthPipeline(
const render::RenderContextPointer& renderContext);
87 gpu::PipelinePointer _linearDepthPipeline;
89 const gpu::PipelinePointer& getDownsamplePipeline(
const render::RenderContextPointer& renderContext);
90 gpu::PipelinePointer _downsamplePipeline;
92 gpu::RangeTimerPointer _gpuTimer;
98 class SurfaceGeometryFramebuffer {
100 SurfaceGeometryFramebuffer();
102 gpu::FramebufferPointer getCurvatureFramebuffer();
103 gpu::TexturePointer getCurvatureTexture();
105 gpu::FramebufferPointer getLowCurvatureFramebuffer();
106 gpu::TexturePointer getLowCurvatureTexture();
108 gpu::FramebufferPointer getBlurringFramebuffer();
109 gpu::TexturePointer getBlurringTexture();
112 void update(
const gpu::TexturePointer& linearDepthBuffer);
113 gpu::TexturePointer getLinearDepthTexture();
114 const glm::ivec2& getSourceFrameSize()
const {
return _frameSize; }
116 void setResolutionLevel(
int level);
117 int getResolutionLevel()
const {
return _resolutionLevel; }
123 gpu::TexturePointer _linearDepthTexture;
125 gpu::FramebufferPointer _curvatureFramebuffer;
126 gpu::TexturePointer _curvatureTexture;
128 gpu::FramebufferPointer _blurringFramebuffer;
129 gpu::TexturePointer _blurringTexture;
131 gpu::FramebufferPointer _lowCurvatureFramebuffer;
132 gpu::TexturePointer _lowCurvatureTexture;
134 glm::ivec2 _frameSize;
135 int _resolutionLevel{ 0 };
138 using SurfaceGeometryFramebufferPointer = std::shared_ptr<SurfaceGeometryFramebuffer>;
140 class SurfaceGeometryPassConfig :
public render::GPUJobConfig {
142 Q_PROPERTY(
float depthThreshold MEMBER depthThreshold NOTIFY dirty)
143 Q_PROPERTY(
float basisScale MEMBER basisScale NOTIFY dirty)
144 Q_PROPERTY(
float curvatureScale MEMBER curvatureScale NOTIFY dirty)
145 Q_PROPERTY(
int resolutionLevel MEMBER resolutionLevel NOTIFY dirty)
147 Q_PROPERTY(
float diffuseFilterScale MEMBER diffuseFilterScale NOTIFY dirty)
148 Q_PROPERTY(
float diffuseDepthThreshold MEMBER diffuseDepthThreshold NOTIFY dirty)
151 SurfaceGeometryPassConfig() : render::GPUJobConfig(true) {}
153 float depthThreshold{ 5.0f };
154 float basisScale{ 1.0f };
155 float curvatureScale{ 10.0f };
156 int resolutionLevel{ 1 };
157 float diffuseFilterScale{ 0.2f };
158 float diffuseDepthThreshold{ 1.0f };
164 class SurfaceGeometryPass {
166 using Inputs = render::VaryingSet3<DeferredFrameTransformPointer, DeferredFramebufferPointer, LinearDepthFramebufferPointer>;
167 using Outputs = render::VaryingSet4<SurfaceGeometryFramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
168 using Config = SurfaceGeometryPassConfig;
169 using JobModel = render::Job::ModelIO<SurfaceGeometryPass, Inputs, Outputs, Config>;
171 SurfaceGeometryPass();
173 void configure(
const Config& config);
174 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& outputs);
177 float getCurvatureDepthThreshold()
const {
return _parametersBuffer.get<Parameters>().curvatureInfo.x; }
178 float getCurvatureBasisScale()
const {
return _parametersBuffer.get<Parameters>().curvatureInfo.y; }
179 float getCurvatureScale()
const {
return _parametersBuffer.get<Parameters>().curvatureInfo.w; }
180 int getResolutionLevel()
const {
return (
int)_parametersBuffer.get<Parameters>().resolutionInfo.w; }
183 typedef gpu::BufferView UniformBufferView;
189 glm::vec4 resolutionInfo { 0.0f, 0.0f, 0.0f, 1.0f };
191 glm::vec4 curvatureInfo{ 0.0f };
195 gpu::BufferView _parametersBuffer;
198 SurfaceGeometryFramebufferPointer _surfaceGeometryFramebuffer;
200 const gpu::PipelinePointer& getCurvaturePipeline(
const render::RenderContextPointer& renderContext);
202 gpu::PipelinePointer _curvaturePipeline;
204 render::BlurGaussianDepthAware _diffusePass;
207 gpu::RangeTimerPointer _gpuTimer;