12 #ifndef hifi_DeferredLightingEffect_h
13 #define hifi_DeferredLightingEffect_h
17 #include <DependencyManager.h>
18 #include <NumericalConstants.h>
20 #include "graphics/Light.h"
21 #include "graphics/Geometry.h"
23 #include <procedural/ProceduralSkybox.h>
25 #include <render/CullTask.h>
27 #include "DeferredFrameTransform.h"
28 #include "DeferredFramebuffer.h"
29 #include "LightingModel.h"
31 #include "LightStage.h"
32 #include "LightClusters.h"
33 #include "BackgroundStage.h"
34 #include "HazeStage.h"
35 #include "TonemappingStage.h"
36 #include "NormalMapAttenuationStage.h"
38 #include "SurfaceGeometryPass.h"
39 #include "SubsurfaceScattering.h"
40 #include "AmbientOcclusionEffect.h"
43 class DeferredLightingEffect :
public Dependency {
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);
53 static void setupLocalLightsBatch(gpu::Batch& batch,
const LightClustersPointer& lightClusters);
54 static void setupLocalLightsBatch(gpu::Batch& batch);
55 static void unsetLocalLightsBatch(gpu::Batch& batch);
58 DeferredLightingEffect() =
default;
60 graphics::MeshPointer _pointLightMesh;
61 graphics::MeshPointer getPointLightMesh();
62 graphics::MeshPointer _spotLightMesh;
63 graphics::MeshPointer getSpotLightMesh();
65 gpu::PipelinePointer _directionalSkyboxLight;
66 gpu::PipelinePointer _directionalAmbientSphereLight;
68 gpu::PipelinePointer _directionalSkyboxLightShadow;
69 gpu::PipelinePointer _directionalAmbientSphereLightShadow;
71 gpu::PipelinePointer _localLight;
72 gpu::PipelinePointer _localLightOutline;
74 LightClustersPointer _lightClusters;
76 friend class LightClusteringPass;
77 friend class RenderDeferredSetup;
78 friend class RenderDeferredLocals;
79 friend class RenderDeferredCleanup;
82 class PrepareDeferred {
85 using Inputs = render::VaryingSet2 <gpu::FramebufferPointer, LightingModelPointer>;
87 using Outputs = render::VaryingSet3<DeferredFramebufferPointer, gpu::FramebufferPointer, gpu::FramebufferPointer>;
89 using JobModel = render::Job::ModelIO<PrepareDeferred, Inputs, Outputs>;
91 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& outputs);
93 DeferredFramebufferPointer _deferredFramebuffer;
96 class RenderDeferredSetup {
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);
111 class RenderDeferredLocals {
113 using JobModel = render::Job::ModelI<RenderDeferredLocals, DeferredFrameTransformPointer>;
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);
122 gpu::BufferView _localLightsBuffer;
124 RenderDeferredLocals();
128 class RenderDeferredCleanup {
130 using JobModel = render::Job::Model<RenderDeferredCleanup>;
132 void run(
const render::RenderContextPointer& renderContext,
const DeferredFramebufferPointer& deferredFramebuffer);
135 using RenderDeferredConfig = render::GPUJobConfig;
137 class RenderDeferred {
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>;
143 using Config = RenderDeferredConfig;
144 using JobModel = render::Job::ModelI<RenderDeferred, Inputs, Config>;
148 void configure(
const Config& config);
150 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
152 RenderDeferredSetup setupJob;
153 RenderDeferredLocals lightsJob;
154 RenderDeferredCleanup cleanupJob;
157 gpu::RangeTimerPointer _gpuTimer;
162 class DefaultLightingSetup {
164 using JobModel = render::Job::Model<DefaultLightingSetup>;
166 void run(
const render::RenderContextPointer& renderContext);
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;