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 #include "TonemappingStage.h"
36 #include "NormalMapAttenuationStage.h"
37 
38 #include "SurfaceGeometryPass.h"
39 #include "SubsurfaceScattering.h"
40 #include "AmbientOcclusionEffect.h"
41 
42 // THis is where we currently accumulate the local lights, let s change that sooner than later
43 class DeferredLightingEffect : public Dependency {
44  SINGLETON_DEPENDENCY
45 
46 public:
47  void init();
48 
49  static void setupKeyLightBatch(const RenderArgs* args, gpu::Batch& batch);
50  static void setupKeyLightBatch(const RenderArgs* args, gpu::Batch& batch, const LightStage::Frame& lightFrame);
51  static void unsetKeyLightBatch(gpu::Batch& batch);
52 
53  static void setupLocalLightsBatch(gpu::Batch& batch, const LightClustersPointer& lightClusters);
54  static void setupLocalLightsBatch(gpu::Batch& batch);
55  static void unsetLocalLightsBatch(gpu::Batch& batch);
56 
57 private:
58  DeferredLightingEffect() = default;
59 
60  graphics::MeshPointer _pointLightMesh;
61  graphics::MeshPointer getPointLightMesh();
62  graphics::MeshPointer _spotLightMesh;
63  graphics::MeshPointer getSpotLightMesh();
64 
65  gpu::PipelinePointer _directionalSkyboxLight;
66  gpu::PipelinePointer _directionalAmbientSphereLight;
67 
68  gpu::PipelinePointer _directionalSkyboxLightShadow;
69  gpu::PipelinePointer _directionalAmbientSphereLightShadow;
70 
71  gpu::PipelinePointer _localLight;
72  gpu::PipelinePointer _localLightOutline;
73 
74  LightClustersPointer _lightClusters;
75 
76  friend class LightClusteringPass;
77  friend class RenderDeferredSetup;
78  friend class RenderDeferredLocals;
79  friend class RenderDeferredCleanup;
80 };
81 
82 class PrepareDeferred {
83 public:
84  // Inputs: primaryFramebuffer and lightingModel
85  using Inputs = render::VaryingSet2 <gpu::FramebufferPointer, LightingModelPointer>;
86  // Output: DeferredFramebuffer, LightingFramebuffer, the framebuffer to be used for mirrors (same as DeferredFramebuffer)
87  using Outputs = render::VaryingSet3<DeferredFramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
88 
89  using JobModel = render::Job::ModelIO<PrepareDeferred, Inputs, Outputs>;
90 
91  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs, Outputs& outputs);
92 
93  DeferredFramebufferPointer _deferredFramebuffer;
94 };
95 
96 class RenderDeferredSetup {
97 public:
98 
99  void run(const render::RenderContextPointer& renderContext,
100  const DeferredFrameTransformPointer& frameTransform,
101  const DeferredFramebufferPointer& deferredFramebuffer,
102  const LightingModelPointer& lightingModel,
103  const LightStage::FramePointer& lightFrame,
104  const LightStage::ShadowFramePointer& shadowFrame,
105  const HazeStage::FramePointer& hazeFrame,
106  const SurfaceGeometryFramebufferPointer& surfaceGeometryFramebuffer,
107  const AmbientOcclusionFramebufferPointer& ambientOcclusionFramebuffer,
108  const SubsurfaceScatteringResourcePointer& subsurfaceScatteringResource);
109 };
110 
111 class RenderDeferredLocals {
112 public:
113  using JobModel = render::Job::ModelI<RenderDeferredLocals, DeferredFrameTransformPointer>;
114 
115  void run(const render::RenderContextPointer& renderContext,
116  const DeferredFrameTransformPointer& frameTransform,
117  const DeferredFramebufferPointer& deferredFramebuffer,
118  const LightingModelPointer& lightingModel,
119  const SurfaceGeometryFramebufferPointer& surfaceGeometryFramebuffer,
120  const LightClustersPointer& lightClusters);
121 
122  gpu::BufferView _localLightsBuffer;
123 
124  RenderDeferredLocals();
125 };
126 
127 
128 class RenderDeferredCleanup {
129 public:
130  using JobModel = render::Job::Model<RenderDeferredCleanup>;
131 
132  void run(const render::RenderContextPointer& renderContext, const DeferredFramebufferPointer& deferredFramebuffer);
133 };
134 
135 using RenderDeferredConfig = render::GPUJobConfig;
136 
137 class RenderDeferred {
138 public:
139  using ExtraDeferredBuffer = render::VaryingSet3<SurfaceGeometryFramebufferPointer, AmbientOcclusionFramebufferPointer, SubsurfaceScatteringResourcePointer>;
140  using Inputs = render::VaryingSet8<
141  DeferredFrameTransformPointer, DeferredFramebufferPointer, ExtraDeferredBuffer, LightingModelPointer, LightClustersPointer, LightStage::FramePointer, LightStage::ShadowFramePointer, HazeStage::FramePointer>;
142 
143  using Config = RenderDeferredConfig;
144  using JobModel = render::Job::ModelI<RenderDeferred, Inputs, Config>;
145 
146  RenderDeferred();
147 
148  void configure(const Config& config);
149 
150  void run(const render::RenderContextPointer& renderContext, const Inputs& inputs);
151 
152  RenderDeferredSetup setupJob;
153  RenderDeferredLocals lightsJob;
154  RenderDeferredCleanup cleanupJob;
155 
156 protected:
157  gpu::RangeTimerPointer _gpuTimer;
158 
159 private:
160 };
161 
162 class DefaultLightingSetup {
163 public:
164  using JobModel = render::Job::Model<DefaultLightingSetup>;
165 
166  void run(const render::RenderContextPointer& renderContext);
167 
168 protected:
169  graphics::LightPointer _defaultLight;
170  LightStage::Index _defaultLightID { LightStage::INVALID_INDEX };
171  graphics::SunSkyStagePointer _defaultBackground;
172  BackgroundStage::Index _defaultBackgroundID { BackgroundStage::INVALID_INDEX };
173  graphics::HazePointer _defaultHaze { nullptr };
174  HazeStage::Index _defaultHazeID { HazeStage::INVALID_INDEX };
175  graphics::TonemappingPointer _defaultTonemapping { nullptr };
176  TonemappingStage::Index _defaultTonemappingID { TonemappingStage::INVALID_INDEX };
177  graphics::NormalMapAttenuationPointer _defaultNormalMapAttenuation { nullptr };
178  NormalMapAttenuationStage::Index _defaultNormalMapAttenuationID { NormalMapAttenuationStage::INVALID_INDEX };
179  graphics::SkyboxPointer _defaultSkybox { new ProceduralSkybox() };
180  NetworkTexturePointer _defaultSkyboxNetworkTexture;
181  NetworkTexturePointer _defaultAmbientNetworkTexture;
182  gpu::TexturePointer _defaultAmbientTexture;
183 };
184 
185 #endif // hifi_DeferredLightingEffect_h