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"
36 #include "SurfaceGeometryPass.h"
37 #include "SubsurfaceScattering.h"
38 #include "AmbientOcclusionEffect.h"
41 class DeferredLightingEffect :
public Dependency {
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);
51 static void setupLocalLightsBatch(gpu::Batch& batch,
const LightClustersPointer& lightClusters);
52 static void unsetLocalLightsBatch(gpu::Batch& batch);
55 DeferredLightingEffect() =
default;
57 graphics::MeshPointer _pointLightMesh;
58 graphics::MeshPointer getPointLightMesh();
59 graphics::MeshPointer _spotLightMesh;
60 graphics::MeshPointer getSpotLightMesh();
62 gpu::PipelinePointer _directionalSkyboxLight;
63 gpu::PipelinePointer _directionalAmbientSphereLight;
65 gpu::PipelinePointer _directionalSkyboxLightShadow;
66 gpu::PipelinePointer _directionalAmbientSphereLightShadow;
68 gpu::PipelinePointer _localLight;
69 gpu::PipelinePointer _localLightOutline;
71 friend class LightClusteringPass;
72 friend class RenderDeferredSetup;
73 friend class RenderDeferredLocals;
74 friend class RenderDeferredCleanup;
77 class PrepareDeferred {
80 using Inputs = render::VaryingSet2 <gpu::FramebufferPointer, LightingModelPointer>;
82 using Outputs = render::VaryingSet2<DeferredFramebufferPointer, gpu::FramebufferPointer>;
84 using JobModel = render::Job::ModelIO<PrepareDeferred, Inputs, Outputs>;
86 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs, Outputs& outputs);
88 DeferredFramebufferPointer _deferredFramebuffer;
91 class RenderDeferredSetup {
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);
106 class RenderDeferredLocals {
108 using JobModel = render::Job::ModelI<RenderDeferredLocals, DeferredFrameTransformPointer>;
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);
117 gpu::BufferView _localLightsBuffer;
119 RenderDeferredLocals();
123 class RenderDeferredCleanup {
125 using JobModel = render::Job::Model<RenderDeferredCleanup>;
127 void run(
const render::RenderContextPointer& renderContext);
130 using RenderDeferredConfig = render::GPUJobConfig;
132 class RenderDeferred {
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>;
138 using Config = RenderDeferredConfig;
139 using JobModel = render::Job::ModelI<RenderDeferred, Inputs, Config>;
143 void configure(
const Config& config);
145 void run(
const render::RenderContextPointer& renderContext,
const Inputs& inputs);
147 RenderDeferredSetup setupJob;
148 RenderDeferredLocals lightsJob;
149 RenderDeferredCleanup cleanupJob;
152 gpu::RangeTimerPointer _gpuTimer;
157 class DefaultLightingSetup {
159 using JobModel = render::Job::Model<DefaultLightingSetup>;
161 void run(
const render::RenderContextPointer& renderContext);
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;