Overte C++ Documentation
DeferredLightingEffect.h
1 //
2 // DeferredLightingEffect.h
3 // interface/src/renderer
4 //
5 // Created by Andrzej Kapolka on 9/11/14.
6 // Copyright 2014 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_DeferredLightingEffect_h
13 #define hifi_DeferredLightingEffect_h
14 
15 #include <QVector>
16 
17 #include <DependencyManager.h>
18 #include <NumericalConstants.h>
19 
20 #include "graphics/Light.h"
21 #include "graphics/Geometry.h"
22 
23 #include <procedural/ProceduralSkybox.h>
24 
25 #include <render/CullTask.h>
26 
27 #include "DeferredFrameTransform.h"
28 #include "DeferredFramebuffer.h"
29 #include "LightingModel.h"
30 
31 #include "LightStage.h"
32 #include "LightClusters.h"
33 #include "BackgroundStage.h"
34 #include "HazeStage.h"
35 
36 #include "SurfaceGeometryPass.h"
37 #include "SubsurfaceScattering.h"
38 #include "AmbientOcclusionEffect.h"
39 
40 // THis is where we currently accumulate the local lights, let s change that sooner than later
41 class DeferredLightingEffect : public Dependency {
42  SINGLETON_DEPENDENCY
43 
44 public:
45  void init();
46 
47  static void setupKeyLightBatch(const RenderArgs* args, gpu::Batch& batch);
48  static void setupKeyLightBatch(const RenderArgs* args, gpu::Batch& batch, const LightStage::Frame& lightFrame);
49  static void unsetKeyLightBatch(gpu::Batch& batch);
50 
51  static void setupLocalLightsBatch(gpu::Batch& batch, const LightClustersPointer& lightClusters);
52  static void unsetLocalLightsBatch(gpu::Batch& batch);
53 
54 private:
55  DeferredLightingEffect() = default;
56 
57  graphics::MeshPointer _pointLightMesh;
58  graphics::MeshPointer getPointLightMesh();
59  graphics::MeshPointer _spotLightMesh;
60  graphics::MeshPointer getSpotLightMesh();
61 
62  gpu::PipelinePointer _directionalSkyboxLight;
63  gpu::PipelinePointer _directionalAmbientSphereLight;
64 
65  gpu::PipelinePointer _directionalSkyboxLightShadow;
66  gpu::PipelinePointer _directionalAmbientSphereLightShadow;
67 
68  gpu::PipelinePointer _localLight;
69  gpu::PipelinePointer _localLightOutline;
70 
71  friend class LightClusteringPass;
72  friend class RenderDeferredSetup;
73  friend class RenderDeferredLocals;
74  friend class RenderDeferredCleanup;
75 };
76 
77 class PrepareDeferred {
78 public:
79  // Inputs: primaryFramebuffer and lightingModel
80  using Inputs = render::VaryingSet2 <gpu::FramebufferPointer, LightingModelPointer>;
81  // Output: DeferredFramebuffer, LightingFramebuffer
82  using Outputs = render::VaryingSet2<DeferredFramebufferPointer, gpu::FramebufferPointer>;
83 
84  using JobModel = render::Job::ModelIO<PrepareDeferred, Inputs, Outputs>;
85 
86  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs);
87 
88  DeferredFramebufferPointer _deferredFramebuffer;
89 };
90 
91 class RenderDeferredSetup {
92 public:
93 
94  void run(const render::RenderContextPointer& renderContext,
95  const DeferredFrameTransformPointer& frameTransform,
96  const DeferredFramebufferPointer& deferredFramebuffer,
97  const LightingModelPointer& lightingModel,
98  const LightStage::FramePointer& lightFrame,
99  const LightStage::ShadowFramePointer& shadowFrame,
100  const HazeStage::FramePointer& hazeFrame,
101  const SurfaceGeometryFramebufferPointer& surfaceGeometryFramebuffer,
102  const AmbientOcclusionFramebufferPointer& ambientOcclusionFramebuffer,
103  const SubsurfaceScatteringResourcePointer& subsurfaceScatteringResource);
104 };
105 
106 class RenderDeferredLocals {
107 public:
108  using JobModel = render::Job::ModelI<RenderDeferredLocals, DeferredFrameTransformPointer>;
109 
110  void run(const render::RenderContextPointer& renderContext,
111  const DeferredFrameTransformPointer& frameTransform,
112  const DeferredFramebufferPointer& deferredFramebuffer,
113  const LightingModelPointer& lightingModel,
114  const SurfaceGeometryFramebufferPointer& surfaceGeometryFramebuffer,
115  const LightClustersPointer& lightClusters);
116 
117  gpu::BufferView _localLightsBuffer;
118 
119  RenderDeferredLocals();
120 };
121 
122 
123 class RenderDeferredCleanup {
124 public:
125  using JobModel = render::Job::Model<RenderDeferredCleanup>;
126 
127  void run(const render::RenderContextPointer& renderContext);
128 };
129 
130 using RenderDeferredConfig = render::GPUJobConfig;
131 
132 class RenderDeferred {
133 public:
134  using ExtraDeferredBuffer = render::VaryingSet3<SurfaceGeometryFramebufferPointer, AmbientOcclusionFramebufferPointer, SubsurfaceScatteringResourcePointer>;
135  using Inputs = render::VaryingSet8<
136  DeferredFrameTransformPointer, DeferredFramebufferPointer, ExtraDeferredBuffer, LightingModelPointer, LightClustersPointer, LightStage::FramePointer, LightStage::ShadowFramePointer, HazeStage::FramePointer>;
137 
138  using Config = RenderDeferredConfig;
139  using JobModel = render::Job::ModelI<RenderDeferred, Inputs, Config>;
140 
141  RenderDeferred();
142 
143  void configure(const Config& config);
144 
145  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
146 
147  RenderDeferredSetup setupJob;
148  RenderDeferredLocals lightsJob;
149  RenderDeferredCleanup cleanupJob;
150 
151 protected:
152  gpu::RangeTimerPointer _gpuTimer;
153 
154 private:
155 };
156 
157 class DefaultLightingSetup {
158 public:
159  using JobModel = render::Job::Model<DefaultLightingSetup>;
160 
161  void run(const render::RenderContextPointer& renderContext);
162 
163 protected:
164  graphics::LightPointer _defaultLight;
165  LightStage::Index _defaultLightID{ LightStage::INVALID_INDEX };
166  graphics::SunSkyStagePointer _defaultBackground;
167  BackgroundStage::Index _defaultBackgroundID{ BackgroundStage::INVALID_INDEX };
168  graphics::HazePointer _defaultHaze{ nullptr };
169  HazeStage::Index _defaultHazeID{ HazeStage::INVALID_INDEX };
170  graphics::SkyboxPointer _defaultSkybox { new ProceduralSkybox() };
171  NetworkTexturePointer _defaultSkyboxNetworkTexture;
172  NetworkTexturePointer _defaultAmbientNetworkTexture;
173  gpu::TexturePointer _defaultAmbientTexture;
174 };
175 
176 #endif // hifi_DeferredLightingEffect_h