QGIS API Documentation 3.35.0-Master (6cf940c20d6)
Loading...
Searching...
No Matches
qgsshadowrenderingframegraph.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsshadowrenderingframegraph.h
3 --------------------------------------
4 Date : August 2020
5 Copyright : (C) 2020 by Belgacem Nedjima
6 Email : gb underscore nedjima at esi dot dz
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSSHADOWRENDERINGFRAMEGRAPH_H
17#define QGSSHADOWRENDERINGFRAMEGRAPH_H
18
19#include <QWindow>
20#include <Qt3DRender/QCamera>
21#include <Qt3DRender/QRenderSurfaceSelector>
22#include <Qt3DRender/QViewport>
23#include <Qt3DRender/QCameraSelector>
24#include <Qt3DRender/QLayerFilter>
25#include <Qt3DRender/QLayer>
26#include <Qt3DRender/QRenderTargetSelector>
27#include <Qt3DRender/QRenderTarget>
28#include <Qt3DRender/QTexture>
29#include <Qt3DRender/QClearBuffers>
30#include <Qt3DRender/QParameter>
31#include <Qt3DRender/QFrustumCulling>
32#include <Qt3DRender/QRenderStateSet>
33#include <Qt3DRender/QDepthTest>
34#include <Qt3DRender/QCullFace>
35#include <Qt3DRender/QPolygonOffset>
36#include <Qt3DRender/QRenderCapture>
37#include <Qt3DRender/QDebugOverlay>
38
40
43class QgsRectangle;
46class QgsPreviewQuad;
48
49#define SIP_NO_FILE
50
59class QgsShadowRenderingFrameGraph : public Qt3DCore::QEntity
60{
61 Q_OBJECT
62
63 public:
65 QgsShadowRenderingFrameGraph( QSurface *surface, QSize s, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *root );
66
68 Qt3DRender::QFrameGraphNode *frameGraphRoot() { return mRenderSurfaceSelector; }
69
71 Qt3DRender::QTexture2D *forwardRenderColorTexture() { return mForwardColorTexture; }
73 Qt3DRender::QTexture2D *forwardRenderDepthTexture() { return mForwardDepthTexture; }
75 Qt3DRender::QTexture2D *shadowMapTexture() { return mShadowMapTexture; }
76
81 Qt3DRender::QTexture2D *ambientOcclusionFactorMap() { return mAmbientOcclusionRenderTexture; }
82
87 Qt3DRender::QTexture2D *blurredAmbientOcclusionFactorMap() { return mAmbientOcclusionBlurTexture; }
88
90 Qt3DRender::QLayer *previewLayer() { return mPreviewLayer; }
92 Qt3DRender::QLayer *castShadowsLayer() { return mCastShadowsLayer; }
94 Qt3DRender::QLayer *forwardRenderLayer() { return mForwardRenderLayer; }
95
100 Qt3DRender::QLayer *transparentObjectLayer() { return mTransparentObjectsPassLayer; }
101
103 Qt3DRender::QCamera *mainCamera() { return mMainCamera; }
105 Qt3DRender::QCamera *lightCamera() { return mLightCamera; }
107 QgsPostprocessingEntity *postprocessingEntity() { return mPostprocessingEntity; }
109 Qt3DCore::QEntity *rootEntity() { return mRootEntity; }
110
112 Qt3DCore::QEntity *rubberBandsRootEntity() { return mRubberBandsRootEntity; }
113
115 Qt3DRender::QRenderCapture *renderCapture() { return mRenderCapture; }
116
118 Qt3DRender::QRenderCapture *depthRenderCapture() { return mDepthRenderCapture; }
119
120
122 bool frustumCullingEnabled() const { return mFrustumCullingEnabled; }
124 void setFrustumCullingEnabled( bool enabled );
125
127 bool shadowRenderingEnabled() const { return mShadowRenderingEnabled; }
129 void setShadowRenderingEnabled( bool enabled );
130
132 float shadowBias() const { return mShadowBias; }
134 void setShadowBias( float shadowBias );
135
137 int shadowMapResolution() const { return mShadowMapResolution; }
139 void setShadowMapResolution( int resolution );
140
141
146 void setAmbientOcclusionEnabled( bool enabled );
147
152 bool ambientOcclusionEnabled() const { return mAmbientOcclusionEnabled; }
153
158 void setAmbientOcclusionIntensity( float intensity );
159
164 float ambientOcclusionIntensity() const { return mAmbientOcclusionIntensity; }
165
170 void setAmbientOcclusionRadius( float radius );
171
176 float ambientOcclusionRadius() const { return mAmbientOcclusionRadius; }
177
182 void setAmbientOcclusionThreshold( float threshold );
183
188 float ambientOcclusionThreshold() const { return mAmbientOcclusionThreshold; }
189
191 void setClearColor( const QColor &clearColor );
193 QgsPreviewQuad *addTexturePreviewOverlay( Qt3DRender::QTexture2D *texture, const QPointF &centerNDC, const QSizeF &size, QVector<Qt3DRender::QParameter *> additionalShaderParameters = QVector<Qt3DRender::QParameter *>() );
195 void setupDirectionalLight( const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance );
197 void setupEyeDomeLighting( bool enabled, double strength, int distance );
199 void setupShadowMapDebugging( bool enabled, Qt::Corner corner, double size );
201 void setupDepthMapDebugging( bool enabled, Qt::Corner corner, double size );
203 void setSize( QSize s );
204
209 void setRenderCaptureEnabled( bool enabled );
210
215 bool renderCaptureEnabled() const { return mRenderCaptureEnabled; }
216
221 void setDebugOverlayEnabled( bool enabled );
222
223 private:
224 Qt3DRender::QRenderSurfaceSelector *mRenderSurfaceSelector = nullptr;
225 Qt3DRender::QViewport *mMainViewPort = nullptr;
226 bool mFrustumCullingEnabled = true;
227
228 Qt3DRender::QCamera *mMainCamera = nullptr;
229 Qt3DRender::QCamera *mLightCamera = nullptr;
230
231 // Forward rendering pass branch nodes:
232 Qt3DRender::QCameraSelector *mMainCameraSelector = nullptr;
233 Qt3DRender::QLayerFilter *mForwardRenderLayerFilter = nullptr;
234 Qt3DRender::QRenderTargetSelector *mForwardRenderTargetSelector = nullptr;
235 Qt3DRender::QClearBuffers *mForwardClearBuffers = nullptr;
236 Qt3DRender::QFrustumCulling *mFrustumCulling = nullptr;
237 // Forward rendering pass texture related objects:
238 Qt3DRender::QTexture2D *mForwardColorTexture = nullptr;
239 Qt3DRender::QTexture2D *mForwardDepthTexture = nullptr;
240 // QDebugOverlay added in the forward pass
241 Qt3DRender::QDebugOverlay *mDebugOverlay = nullptr;
242
243 // Shadow rendering pass branch nodes:
244 Qt3DRender::QCameraSelector *mLightCameraSelectorShadowPass = nullptr;
245 Qt3DRender::QLayerFilter *mShadowSceneEntitiesFilter = nullptr;
246 Qt3DRender::QRenderTargetSelector *mShadowRenderTargetSelector = nullptr;
247 Qt3DRender::QClearBuffers *mShadowClearBuffers = nullptr;
248 Qt3DRender::QRenderStateSet *mShadowRenderStateSet = nullptr;
249 // Shadow rendering pass texture related objects:
250 Qt3DRender::QTexture2D *mShadowMapTexture = nullptr;
251
252 // - The depth buffer render pass is made to copy the depth buffer into
253 // an RGB texture that can be captured into a QImage and sent to the CPU for
254 // calculating real 3D points from mouse coordinates (for zoom, rotation, drag..)
255 // Depth buffer render pass branch nodes:
256 Qt3DRender::QCameraSelector *mDepthRenderCameraSelector = nullptr;
257 Qt3DRender::QRenderStateSet *mDepthRenderStateSet = nullptr;;
258 Qt3DRender::QLayerFilter *mDepthRenderLayerFilter = nullptr;
259 Qt3DRender::QRenderTargetSelector *mDepthRenderCaptureTargetSelector = nullptr;
260 Qt3DRender::QRenderCapture *mDepthRenderCapture = nullptr;
261 // Depth buffer processing pass texture related objects:
262 Qt3DRender::QTexture2D *mDepthRenderCaptureDepthTexture = nullptr;
263 Qt3DRender::QTexture2D *mDepthRenderCaptureColorTexture = nullptr;
264
265 // Post processing pass branch nodes:
266 Qt3DRender::QCameraSelector *mPostProcessingCameraSelector = nullptr;
267 Qt3DRender::QLayerFilter *mPostprocessPassLayerFilter = nullptr;
268 Qt3DRender::QClearBuffers *mPostprocessClearBuffers = nullptr;
269 Qt3DRender::QRenderTargetSelector *mRenderCaptureTargetSelector = nullptr;
270 Qt3DRender::QRenderCapture *mRenderCapture = nullptr;
271 // Post processing pass texture related objects:
272 Qt3DRender::QTexture2D *mRenderCaptureColorTexture = nullptr;
273 Qt3DRender::QTexture2D *mRenderCaptureDepthTexture = nullptr;
274
275 // Ambient occlusion factor generation pass
276 Qt3DRender::QCameraSelector *mAmbientOcclusionRenderCameraSelector = nullptr;
277 Qt3DRender::QRenderStateSet *mAmbientOcclusionRenderStateSet = nullptr;;
278 Qt3DRender::QLayerFilter *mAmbientOcclusionRenderLayerFilter = nullptr;
279 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionRenderCaptureTargetSelector = nullptr;
280 // Ambient occlusion factor generation pass texture related objects:
281 Qt3DRender::QTexture2D *mAmbientOcclusionRenderTexture = nullptr;
282
283 // Ambient occlusion factor blur pass
284 Qt3DRender::QCameraSelector *mAmbientOcclusionBlurCameraSelector = nullptr;
285 Qt3DRender::QRenderStateSet *mAmbientOcclusionBlurStateSet = nullptr;;
286 Qt3DRender::QLayerFilter *mAmbientOcclusionBlurLayerFilter = nullptr;
287 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionBlurRenderCaptureTargetSelector = nullptr;
288 // Ambient occlusion factor blur pass texture related objects:
289 Qt3DRender::QTexture2D *mAmbientOcclusionBlurTexture = nullptr;
290
291 // Rubber bands pass
292 Qt3DRender::QCameraSelector *mRubberBandsCameraSelector = nullptr;
293 Qt3DRender::QLayerFilter *mRubberBandsLayerFilter = nullptr;
294 Qt3DRender::QRenderStateSet *mRubberBandsStateSet = nullptr;
295 Qt3DRender::QRenderTargetSelector *mRubberBandsRenderTargetSelector = nullptr;
296
297 // Texture preview:
298 Qt3DRender::QLayerFilter *mPreviewLayerFilter = nullptr;
299 Qt3DRender::QRenderStateSet *mPreviewRenderStateSet = nullptr;
300 Qt3DRender::QDepthTest *mPreviewDepthTest = nullptr;
301 Qt3DRender::QCullFace *mPreviewCullFace = nullptr;
302
303 bool mShadowRenderingEnabled = false;
304 float mShadowBias = 0.00001f;
305 int mShadowMapResolution = 2048;
306
307 // Ambient occlusion related settings
308 bool mAmbientOcclusionEnabled = false;
309 float mAmbientOcclusionIntensity = 0.5f;
310 float mAmbientOcclusionRadius = 25.f;
311 float mAmbientOcclusionThreshold = 0.5f;
312
313 QSize mSize = QSize( 1024, 768 );
314
315 bool mEyeDomeLightingEnabled = false;
316 double mEyeDomeLightingStrength = 1000.0;
317 int mEyeDomeLightingDistance = 1;
318
319 QgsPreviewQuad *mDebugShadowMapPreviewQuad = nullptr;
320 QgsPreviewQuad *mDebugDepthMapPreviewQuad = nullptr;
321
322 QEntity *mDepthRenderQuad = nullptr;
323
324 QVector3D mLightDirection = QVector3D( 0.0, -1.0f, 0.0f );
325
326 Qt3DCore::QEntity *mRootEntity = nullptr;
327
328 Qt3DRender::QLayer *mPreviewLayer = nullptr;
329 Qt3DRender::QLayer *mForwardRenderLayer = nullptr;
330 Qt3DRender::QLayer *mCastShadowsLayer = nullptr;
331 Qt3DRender::QLayer *mDepthRenderPassLayer = nullptr;
332 Qt3DRender::QLayer *mTransparentObjectsPassLayer = nullptr;
333 Qt3DRender::QLayer *mRubberBandsLayer = nullptr;
334
335 QgsPostprocessingEntity *mPostprocessingEntity = nullptr;
336 QgsAmbientOcclusionRenderEntity *mAmbientOcclusionRenderEntity = nullptr;
337 QgsAmbientOcclusionBlurEntity *mAmbientOcclusionBlurEntity = nullptr;
338
339 Qt3DCore::QEntity *mRubberBandsRootEntity = nullptr;
340
341 QVector<QgsPreviewQuad *> mPreviewQuads;
342
343 Qt3DRender::QFrameGraphNode *constructShadowRenderPass();
344 Qt3DRender::QFrameGraphNode *constructForwardRenderPass();
345 Qt3DRender::QFrameGraphNode *constructTexturesPreviewPass();
346 Qt3DRender::QFrameGraphNode *constructPostprocessingPass();
347 Qt3DRender::QFrameGraphNode *constructDepthRenderPass();
348 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionRenderPass();
349 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionBlurPass();
350 Qt3DRender::QFrameGraphNode *constructRubberBandsPass();
351
352 Qt3DCore::QEntity *constructDepthRenderQuad();
353
354 bool mRenderCaptureEnabled = true;
355
356 Q_DISABLE_COPY( QgsShadowRenderingFrameGraph )
357};
358
359#endif // QGSSHADOWRENDERINGFRAMEGRAPH_H
A rectangle specified with double values.
Qt3DRender::QTexture2D * ambientOcclusionFactorMap()
Returns ambient occlusion factor values texture.
int shadowMapResolution() const
Returns the shadow map resolution.
void setupDepthMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the depth map debugging view port.
Qt3DRender::QLayer * transparentObjectLayer()
Returns a layer object used to indicate that the object is transparent.
bool renderCaptureEnabled() const
Returns whether it will be possible to render to an image.
Qt3DRender::QTexture2D * shadowMapTexture()
Returns the shadow map (a depth texture for the shadow rendering pass)
void setAmbientOcclusionThreshold(float threshold)
Sets the ambient occlusion threshold.
void setupShadowMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the shadow map debugging view port.
Qt3DRender::QRenderCapture * renderCapture()
Returns the render capture object used to take an image of the scene.
void setShadowBias(float shadowBias)
Sets the shadow bias value.
Qt3DRender::QLayer * castShadowsLayer()
Returns a layer object used to indicate that an entity will cast shadows.
void setAmbientOcclusionIntensity(float intensity)
Sets the ambient occlusion intensity.
void setShadowMapResolution(int resolution)
Sets the resolution of the shadow map.
void setSize(QSize s)
Sets the size of the buffers used for rendering.
QgsPostprocessingEntity * postprocessingEntity()
Returns the postprocessing entity.
void setupEyeDomeLighting(bool enabled, double strength, int distance)
Sets eye dome lighting shading related settings.
QgsPreviewQuad * addTexturePreviewOverlay(Qt3DRender::QTexture2D *texture, const QPointF &centerNDC, const QSizeF &size, QVector< Qt3DRender::QParameter * > additionalShaderParameters=QVector< Qt3DRender::QParameter * >())
Adds an preview entity that shows a texture in real time for debugging purposes.
Qt3DRender::QFrameGraphNode * frameGraphRoot()
Returns the root of the frame graph object.
float ambientOcclusionRadius() const
Returns the ambient occlusion radius.
float ambientOcclusionIntensity() const
Returns the ambient occlusion intensity.
bool shadowRenderingEnabled() const
Returns whether shadow rendering is enabled.
Qt3DRender::QCamera * lightCamera()
Returns the light camera.
Qt3DRender::QTexture2D * forwardRenderColorTexture()
Returns the color texture of the forward rendering pass.
bool ambientOcclusionEnabled() const
Returns whether Screen Space Ambient Occlusion is enabled.
Qt3DRender::QRenderCapture * depthRenderCapture()
Returns the render capture object used to take an image of the depth buffer of the scene.
void setAmbientOcclusionRadius(float radius)
Sets the ambient occlusion radius.
Qt3DRender::QLayer * previewLayer()
Returns a layer object used to indicate that an entity is to be rendered during the preview textures ...
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
bool frustumCullingEnabled() const
Returns whether frustum culling is enabled.
void setAmbientOcclusionEnabled(bool enabled)
Sets whether Screen Space Ambient Occlusion will be enabled.
void setFrustumCullingEnabled(bool enabled)
Sets whether frustum culling is enabled.
void setClearColor(const QColor &clearColor)
Sets the clear color of the scene (background color)
Qt3DRender::QLayer * forwardRenderLayer()
Returns a layer object used to indicate that an entity will be rendered during the forward rendering ...
Qt3DRender::QTexture2D * forwardRenderDepthTexture()
Returns the depth texture of the forward rendering pass.
Qt3DCore::QEntity * rootEntity()
Returns the root entity of the entities related to the frame graph (like the post processing entity a...
Qt3DCore::QEntity * rubberBandsRootEntity()
Returns entity for all rubber bands (to show them always on top)
void setRenderCaptureEnabled(bool enabled)
Sets whether it will be possible to render to an image.
float ambientOcclusionThreshold() const
Returns the ambient occlusion threshold.
void setupDirectionalLight(const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance)
Sets shadow rendering to use a directional light.
float shadowBias() const
Returns the shadow bias value.
Qt3DRender::QCamera * mainCamera()
Returns the main camera.
Qt3DRender::QTexture2D * blurredAmbientOcclusionFactorMap()
Returns blurred ambient occlusion factor values texture.
void setShadowRenderingEnabled(bool enabled)
Sets whether the shadow rendering is enabled.