Skip to content

Commit af6dae0

Browse files
feat(3d/renderview): extract ambient occlusion renderview (#61626)
1 parent a45ecfa commit af6dae0

File tree

11 files changed

+327
-242
lines changed

11 files changed

+327
-242
lines changed

src/3d/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ set(QGIS_3D_SRCS
8181
framegraph/qgsabstractrenderview.cpp
8282
framegraph/qgs3daxisrenderview.cpp
8383
framegraph/qgsambientocclusionrenderentity.cpp
84+
framegraph/qgsambientocclusionrenderview.cpp
8485
framegraph/qgsambientocclusionblurentity.cpp
8586
framegraph/qgsdebugtextureentity.cpp
8687
framegraph/qgsdebugtexturerenderview.cpp
@@ -195,6 +196,7 @@ set(QGIS_3D_HDRS
195196
framegraph/qgsabstractrenderview.h
196197
framegraph/qgs3daxisrenderview.h
197198
framegraph/qgsambientocclusionrenderentity.h
199+
framegraph/qgsambientocclusionrenderview.h
198200
framegraph/qgsambientocclusionblurentity.h
199201
framegraph/qgsdebugtextureentity.h
200202
framegraph/qgsdebugtexturerenderview.h
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/***************************************************************************
2+
qgsambientocclusionrenderview.cpp
3+
--------------------------------------
4+
Date : May 2025
5+
Copyright : (C) 2025 by Benoit De Mezzo and (C) 2020 by Belgacem Nedjima
6+
Email : benoit dot de dot mezzo at oslandia dot com
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+
#include "qgsambientocclusionrenderview.h"
17+
#include <Qt3DRender/QCamera>
18+
#include <Qt3DRender/QLayerFilter>
19+
#include <Qt3DRender/QLayer>
20+
#include <Qt3DRender/QRenderTargetSelector>
21+
#include <Qt3DRender/QRenderTarget>
22+
#include <Qt3DRender/QTexture>
23+
#include <Qt3DRender/qsubtreeenabler.h>
24+
#include <Qt3DRender/QCameraSelector>
25+
#include <Qt3DRender/QRenderStateSet>
26+
#include <Qt3DRender/QDepthTest>
27+
#include <Qt3DRender/QCullFace>
28+
29+
#include "qgsambientocclusionrenderentity.h"
30+
#include "qgsambientocclusionblurentity.h"
31+
32+
33+
QgsAmbientOcclusionRenderView::QgsAmbientOcclusionRenderView( const QString &viewName, Qt3DRender::QCamera *mainCamera, QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity )
34+
: QgsAbstractRenderView( viewName )
35+
{
36+
mAOPassLayer = new Qt3DRender::QLayer;
37+
mAOPassLayer->setRecursive( true );
38+
mAOPassLayer->setObjectName( mViewName + "::Layer(AO)" );
39+
40+
mBlurPassLayer = new Qt3DRender::QLayer;
41+
mBlurPassLayer->setRecursive( true );
42+
mBlurPassLayer->setObjectName( mViewName + "::Layer(Blur)" );
43+
44+
// ambient occlusion rendering pass
45+
buildRenderPasses( mSize, forwardDepthTexture, rootSceneEntity, mainCamera );
46+
}
47+
48+
void QgsAmbientOcclusionRenderView::updateWindowResize( int width, int height )
49+
{
50+
mAOPassTexture->setSize( width, height );
51+
mBlurPassTexture->setSize( width, height );
52+
}
53+
54+
void QgsAmbientOcclusionRenderView::setEnabled( bool enable )
55+
{
56+
QgsAbstractRenderView::setEnabled( enable );
57+
mAmbientOcclusionRenderEntity->setEnabled( enable );
58+
mAmbientOcclusionBlurEntity->setEnabled( enable );
59+
}
60+
61+
Qt3DRender::QRenderTarget *QgsAmbientOcclusionRenderView::buildAOTexture( QSize mSize )
62+
{
63+
// Create a texture to render into.
64+
Qt3DRender::QRenderTargetOutput *colorTargetOutput = new Qt3DRender::QRenderTargetOutput;
65+
colorTargetOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
66+
67+
mAOPassTexture = new Qt3DRender::QTexture2D( colorTargetOutput );
68+
mAOPassTexture->setSize( mSize.width(), mSize.height() );
69+
mAOPassTexture->setFormat( Qt3DRender::QAbstractTexture::R32F );
70+
mAOPassTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
71+
mAOPassTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
72+
mAOPassTexture->setObjectName( mViewName + "::ColorTarget(AO)" );
73+
colorTargetOutput->setTexture( mAOPassTexture );
74+
75+
Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
76+
renderTarget->addOutput( colorTargetOutput );
77+
78+
return renderTarget;
79+
}
80+
81+
Qt3DRender::QRenderTarget *QgsAmbientOcclusionRenderView::buildBlurTexture( QSize mSize )
82+
{
83+
// Create a texture to render into.
84+
Qt3DRender::QRenderTargetOutput *colorTargetOutput = new Qt3DRender::QRenderTargetOutput;
85+
colorTargetOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
86+
87+
mBlurPassTexture = new Qt3DRender::QTexture2D( colorTargetOutput );
88+
mBlurPassTexture->setSize( mSize.width(), mSize.height() );
89+
mBlurPassTexture->setFormat( Qt3DRender::QAbstractTexture::R32F );
90+
mBlurPassTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
91+
mBlurPassTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
92+
mBlurPassTexture->setObjectName( mViewName + "::ColorTarget(blur)" );
93+
colorTargetOutput->setTexture( mBlurPassTexture );
94+
95+
Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
96+
renderTarget->addOutput( colorTargetOutput );
97+
98+
return renderTarget;
99+
}
100+
101+
void QgsAmbientOcclusionRenderView::buildRenderPasses( QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity, Qt3DRender::QCamera *mainCamera )
102+
{
103+
// AO pass
104+
{
105+
Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet( mRendererEnabler );
106+
107+
Qt3DRender::QDepthTest *depthRenderDepthTest = new Qt3DRender::QDepthTest;
108+
depthRenderDepthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
109+
Qt3DRender::QCullFace *depthRenderCullFace = new Qt3DRender::QCullFace;
110+
depthRenderCullFace->setMode( Qt3DRender::QCullFace::NoCulling );
111+
112+
renderStateSet->addRenderState( depthRenderDepthTest );
113+
renderStateSet->addRenderState( depthRenderCullFace );
114+
115+
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( renderStateSet );
116+
layerFilter->addLayer( mAOPassLayer );
117+
118+
Qt3DRender::QRenderTarget *renderTarget = buildAOTexture( mSize );
119+
120+
Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( layerFilter );
121+
renderTargetSelector->setObjectName( mViewName + "::RenderTargetSelector(AO)" );
122+
renderTargetSelector->setTarget( renderTarget );
123+
124+
mAmbientOcclusionRenderEntity = new QgsAmbientOcclusionRenderEntity( forwardDepthTexture, mAOPassLayer, mainCamera, rootSceneEntity );
125+
}
126+
127+
// blur pass
128+
{
129+
Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet( mRendererEnabler );
130+
131+
Qt3DRender::QDepthTest *depthRenderDepthTest = new Qt3DRender::QDepthTest;
132+
depthRenderDepthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
133+
Qt3DRender::QCullFace *depthRenderCullFace = new Qt3DRender::QCullFace;
134+
depthRenderCullFace->setMode( Qt3DRender::QCullFace::NoCulling );
135+
136+
renderStateSet->addRenderState( depthRenderDepthTest );
137+
renderStateSet->addRenderState( depthRenderCullFace );
138+
139+
Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( renderStateSet );
140+
layerFilter->addLayer( mBlurPassLayer );
141+
142+
Qt3DRender::QRenderTarget *renderTarget = buildBlurTexture( mSize );
143+
144+
Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( layerFilter );
145+
renderTargetSelector->setObjectName( mViewName + "::RenderTargetSelector(Blur)" );
146+
renderTargetSelector->setTarget( renderTarget );
147+
148+
mAmbientOcclusionBlurEntity = new QgsAmbientOcclusionBlurEntity( mAOPassTexture, mBlurPassLayer, rootSceneEntity );
149+
}
150+
}
151+
152+
void QgsAmbientOcclusionRenderView::setIntensity( float intensity )
153+
{
154+
mAmbientOcclusionRenderEntity->setIntensity( intensity );
155+
}
156+
157+
void QgsAmbientOcclusionRenderView::setRadius( float radius )
158+
{
159+
mAmbientOcclusionRenderEntity->setRadius( radius );
160+
}
161+
162+
void QgsAmbientOcclusionRenderView::setThreshold( float threshold )
163+
{
164+
mAmbientOcclusionRenderEntity->setThreshold( threshold );
165+
}
166+
167+
Qt3DRender::QTexture2D *QgsAmbientOcclusionRenderView::blurredFactorMapTexture() const
168+
{
169+
return mBlurPassTexture;
170+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/***************************************************************************
2+
qgsambientocclusionrenderview.h
3+
--------------------------------------
4+
Date : June 2024
5+
Copyright : (C) 2024 by Benoit De Mezzo and (C) 2020 by Belgacem Nedjima
6+
Email : benoit dot de dot mezzo at oslandia dot com
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 QGSAMBIENTOCCLUSIONRENDERVIEW_H
17+
#define QGSAMBIENTOCCLUSIONRENDERVIEW_H
18+
19+
#include "qgsabstractrenderview.h"
20+
21+
#define SIP_NO_FILE
22+
23+
namespace Qt3DRender
24+
{
25+
class QRenderSettings;
26+
class QLayer;
27+
class QSubtreeEnabler;
28+
class QTexture2D;
29+
class QCamera;
30+
class QCameraSelector;
31+
class QLayerFilter;
32+
class QRenderTargetSelector;
33+
class QRenderTarget;
34+
} //namespace Qt3DRender
35+
36+
namespace Qt3DCore
37+
{
38+
class QEntity;
39+
} //namespace Qt3DCore
40+
41+
class QgsAmbientOcclusionRenderEntity;
42+
class QgsAmbientOcclusionBlurEntity;
43+
44+
/**
45+
* \ingroup qgis_3d
46+
* \brief Container class that holds different objects related to ambient occlusion rendering
47+
*
48+
* \note Not available in Python bindings
49+
*
50+
* This renderview create 2 passes with their own entity:
51+
* - the first pass computes the ambient occlusion (creates a QgsAmbientOcclusionRenderEntity)
52+
* - the second generates a blur (creates a QgsAmbientOcclusionBlurEntity)
53+
*
54+
* \since QGIS 3.44
55+
*/
56+
class QgsAmbientOcclusionRenderView : public QgsAbstractRenderView
57+
{
58+
public:
59+
//! Default constructor
60+
QgsAmbientOcclusionRenderView( const QString &viewName, Qt3DRender::QCamera *mainCamera, QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity );
61+
62+
//! Delegates to QgsAmbientOcclusionRenderEntity::setIntensity
63+
void setIntensity( float intensity );
64+
65+
//! Delegates to QgsAmbientOcclusionRenderEntity::setRadius
66+
void setRadius( float radius );
67+
68+
//! Delegates to QgsAmbientOcclusionRenderEntity::setThreshold
69+
void setThreshold( float threshold );
70+
71+
//! Returns blur pass texture
72+
Qt3DRender::QTexture2D *blurredFactorMapTexture() const;
73+
74+
virtual void updateWindowResize( int width, int height ) override;
75+
virtual void setEnabled( bool enable ) override;
76+
77+
private:
78+
Qt3DRender::QLayer *mAOPassLayer = nullptr;
79+
Qt3DRender::QTexture2D *mAOPassTexture = nullptr;
80+
Qt3DRender::QTexture2D *mBlurPassTexture = nullptr;
81+
Qt3DRender::QLayer *mBlurPassLayer = nullptr;
82+
83+
QgsAmbientOcclusionRenderEntity *mAmbientOcclusionRenderEntity = nullptr;
84+
QgsAmbientOcclusionBlurEntity *mAmbientOcclusionBlurEntity = nullptr;
85+
86+
void buildRenderPasses( QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity, Qt3DRender::QCamera *mainCamera );
87+
88+
/**
89+
* Build AO texture and add it to a new rendertarget
90+
*/
91+
Qt3DRender::QRenderTarget *buildAOTexture( QSize mSize );
92+
93+
/**
94+
* Build blur texture and add it to a new rendertarget
95+
*/
96+
Qt3DRender::QRenderTarget *buildBlurTexture( QSize mSize );
97+
};
98+
99+
#endif // QGSAMBIENTOCCLUSIONRENDERVIEW_H

0 commit comments

Comments
 (0)