QGIS API Documentation 3.43.0-Master (261ee7da134)
qgsambientocclusionrenderview.cpp
Go to the documentation of this file.
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
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
31
32
33QgsAmbientOcclusionRenderView::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
49{
50 mAOPassTexture->setSize( width, height );
51 mBlurPassTexture->setSize( width, height );
52}
53
55{
57 mAmbientOcclusionRenderEntity->setEnabled( enable );
58 mAmbientOcclusionBlurEntity->setEnabled( enable );
59}
60
61Qt3DRender::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
81Qt3DRender::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
101void 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
153{
154 mAmbientOcclusionRenderEntity->setIntensity( intensity );
155}
156
158{
159 mAmbientOcclusionRenderEntity->setRadius( radius );
160}
161
163{
164 mAmbientOcclusionRenderEntity->setThreshold( threshold );
165}
166
168{
169 return mBlurPassTexture;
170}
Base class for 3D render view.
Qt3DRender::QSubtreeEnabler * mRendererEnabler
virtual void setEnabled(bool enable)
Enable or disable via enable the render view sub tree.
An entity that is responsible for blurring the ambient occlusion factor texture.
An entity that is responsible for producing an ambient occlusion factor map.
void setThreshold(float threshold)
Sets the amount of occlusion when the effects starts to kick in.
void setRadius(float radius)
Sets the radius for the ambient occlusion effect.
void setIntensity(float intensity)
Sets the intensity for the ambient occlusion effect.
void setRadius(float radius)
Delegates to QgsAmbientOcclusionRenderEntity::setRadius.
virtual void setEnabled(bool enable) override
Enable or disable via enable the render view sub tree.
virtual void updateWindowResize(int width, int height) override
Called when 3D window is resized.
QgsAmbientOcclusionRenderView(const QString &viewName, Qt3DRender::QCamera *mainCamera, QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity)
Default constructor.
void setIntensity(float intensity)
Delegates to QgsAmbientOcclusionRenderEntity::setIntensity.
void setThreshold(float threshold)
Delegates to QgsAmbientOcclusionRenderEntity::setThreshold.
Qt3DRender::QTexture2D * blurredFactorMapTexture() const
Returns blur pass texture.