18#include <Qt3DRender/QBlendEquation>
19#include <Qt3DRender/QBlendEquationArguments>
20#include <Qt3DRender/QCamera>
21#include <Qt3DRender/QCameraSelector>
22#include <Qt3DRender/QClearBuffers>
23#include <Qt3DRender/QClipPlane>
24#include <Qt3DRender/QColorMask>
25#include <Qt3DRender/QCullFace>
26#include <Qt3DRender/QDebugOverlay>
27#include <Qt3DRender/QDepthTest>
28#include <Qt3DRender/QFrustumCulling>
29#include <Qt3DRender/QLayer>
30#include <Qt3DRender/QLayerFilter>
31#include <Qt3DRender/QMultiSampleAntiAliasing>
32#include <Qt3DRender/QNoDepthMask>
33#include <Qt3DRender/QParameter>
34#include <Qt3DRender/QPolygonOffset>
35#include <Qt3DRender/QRenderStateSet>
36#include <Qt3DRender/QRenderTarget>
37#include <Qt3DRender/QRenderTargetSelector>
38#include <Qt3DRender/QSortPolicy>
39#include <Qt3DRender/QTexture>
40#include <Qt3DRender/QViewport>
41#include <Qt3DRender/qsubtreeenabler.h>
45 , mMainCamera( mainCamera )
47 mRenderLayer =
new Qt3DRender::QLayer;
48 mRenderLayer->setRecursive(
true );
49 mRenderLayer->setObjectName(
mViewName +
"::Layer" );
51 mTransparentObjectsLayer =
new Qt3DRender::QLayer;
52 mTransparentObjectsLayer->setRecursive(
true );
53 mTransparentObjectsLayer->setObjectName(
mViewName +
"::TransparentLayer" );
55 mBackgroundLayer =
new Qt3DRender::QLayer;
56 mBackgroundLayer->setRecursive(
true );
57 mBackgroundLayer->setObjectName(
mViewName +
"::BackgroundLayer" );
63Qt3DRender::QRenderTarget *QgsForwardRenderView::buildTextures()
65 mColorTexture =
new Qt3DRender::QTexture2D;
66 mColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGBA16F );
67 mColorTexture->setGenerateMipMaps(
false );
68 mColorTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
69 mColorTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
70 mColorTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
71 mColorTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
73 mDepthTexture =
new Qt3DRender::QTexture2D;
74 mDepthTexture->setFormat( Qt3DRender::QAbstractTexture::D24S8 );
75 mDepthTexture->setGenerateMipMaps(
false );
76 mDepthTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
77 mDepthTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
78 mDepthTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
79 mDepthTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
81 Qt3DRender::QRenderTarget *renderTarget =
new Qt3DRender::QRenderTarget;
82 Qt3DRender::QRenderTargetOutput *renderTargetDepthOutput =
new Qt3DRender::QRenderTargetOutput;
83 renderTargetDepthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
84 renderTargetDepthOutput->setTexture( mDepthTexture );
85 renderTarget->addOutput( renderTargetDepthOutput );
87 Qt3DRender::QRenderTargetOutput *renderTargetColorOutput =
new Qt3DRender::QRenderTargetOutput;
88 renderTargetColorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
89 renderTargetColorOutput->setTexture( mColorTexture );
90 renderTarget->addOutput( renderTargetColorOutput );
95Qt3DRender::QRenderTarget *QgsForwardRenderView::buildMsaaTarget()
97 mColorTextureMS =
new Qt3DRender::QTexture2DMultisample;
98 mColorTextureMS->setFormat( Qt3DRender::QAbstractTexture::RGBA16F );
99 mColorTextureMS->setSamples( 4 );
100 mColorTextureMS->setGenerateMipMaps(
false );
101 mColorTextureMS->setWidth( mCurrentWidth );
102 mColorTextureMS->setHeight( mCurrentHeight );
104 mDepthTextureMS =
new Qt3DRender::QTexture2DMultisample;
105 mDepthTextureMS->setFormat( Qt3DRender::QAbstractTexture::D24S8 );
106 mDepthTextureMS->setSamples( 4 );
107 mDepthTextureMS->setGenerateMipMaps(
false );
108 mDepthTextureMS->setWidth( mCurrentWidth );
109 mDepthTextureMS->setHeight( mCurrentHeight );
111 Qt3DRender::QRenderTarget *renderTarget =
new Qt3DRender::QRenderTarget;
112 Qt3DRender::QRenderTargetOutput *msaaDepthOutput =
new Qt3DRender::QRenderTargetOutput;
113 msaaDepthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
114 msaaDepthOutput->setTexture( mDepthTextureMS );
115 renderTarget->addOutput( msaaDepthOutput );
117 Qt3DRender::QRenderTargetOutput *msaaColorOutput =
new Qt3DRender::QRenderTargetOutput;
118 msaaColorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
119 msaaColorOutput->setTexture( mColorTextureMS );
120 renderTarget->addOutput( msaaColorOutput );
170void QgsForwardRenderView::buildRenderPasses()
173 mMainCameraSelector->setObjectName(
mViewName +
"::CameraSelector" );
174 mMainCameraSelector->setCamera( mMainCamera );
176 mLayerFilter =
new Qt3DRender::QLayerFilter( mMainCameraSelector );
177 mLayerFilter->addLayer( mRenderLayer );
179 mClipRenderStateSet =
new Qt3DRender::QRenderStateSet( mLayerFilter );
180 mClipRenderStateSet->setObjectName(
mViewName +
"::Clip Plane RenderStateSet" );
182 mMsaaRenderState =
new Qt3DRender::QMultiSampleAntiAliasing;
183 mMsaaRenderState->setEnabled(
false );
184 mClipRenderStateSet->addRenderState( mMsaaRenderState );
186 mRegularRenderTarget = buildTextures();
188 mRenderTargetSelector =
new Qt3DRender::QRenderTargetSelector( mClipRenderStateSet );
189 mRenderTargetSelector->setTarget( mRegularRenderTarget );
192 Qt3DRender::QLayerFilter *opaqueObjectsFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
193 opaqueObjectsFilter->addLayer( mTransparentObjectsLayer );
194 opaqueObjectsFilter->addLayer( mBackgroundLayer );
195 opaqueObjectsFilter->setFilterMode( Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers );
197 Qt3DRender::QRenderStateSet *renderStateSet =
new Qt3DRender::QRenderStateSet( opaqueObjectsFilter );
199 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
200 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
201 renderStateSet->addRenderState( depthTest );
203 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
204 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Back );
205 renderStateSet->addRenderState( cullFace );
207 mFrustumCulling =
new Qt3DRender::QFrustumCulling( renderStateSet );
209 mClearBuffers =
new Qt3DRender::QClearBuffers( mFrustumCulling );
210 mClearBuffers->setClearColor( QColor::fromRgbF( 0.0, 0.0, 1.0, 1.0 ) );
211 mClearBuffers->setBuffers( Qt3DRender::QClearBuffers::ColorDepthBuffer );
212 mClearBuffers->setClearDepthValue( 1.0f );
214 mDebugOverlay =
new Qt3DRender::QDebugOverlay( mClearBuffers );
215 mDebugOverlay->setEnabled(
false );
218 Qt3DRender::QLayerFilter *backgroundLayerFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
219 backgroundLayerFilter->addLayer( mBackgroundLayer );
222 Qt3DRender::QLayerFilter *transparentObjectsLayerFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
223 transparentObjectsLayerFilter->addLayer( mTransparentObjectsLayer );
224 transparentObjectsLayerFilter->setFilterMode( Qt3DRender::QLayerFilter::AcceptAnyMatchingLayers );
226 Qt3DRender::QSortPolicy *sortPolicy =
new Qt3DRender::QSortPolicy( transparentObjectsLayerFilter );
227 QVector<Qt3DRender::QSortPolicy::SortType> sortTypes;
228 sortTypes.push_back( Qt3DRender::QSortPolicy::BackToFront );
229 sortPolicy->setSortTypes( sortTypes );
231 Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetColor =
new Qt3DRender::QRenderStateSet( sortPolicy );
233 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
234 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
235 transparentObjectsRenderStateSetColor->addRenderState( depthTest );
237 Qt3DRender::QNoDepthMask *noDepthMask =
new Qt3DRender::QNoDepthMask;
238 transparentObjectsRenderStateSetColor->addRenderState( noDepthMask );
240 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
241 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
242 transparentObjectsRenderStateSetColor->addRenderState( cullFace );
244 Qt3DRender::QBlendEquation *blendEquation =
new Qt3DRender::QBlendEquation;
245 blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
246 transparentObjectsRenderStateSetColor->addRenderState( blendEquation );
248 Qt3DRender::QBlendEquationArguments *blendEquationArgs =
new Qt3DRender::QBlendEquationArguments;
249 blendEquationArgs->setSourceRgb( Qt3DRender::QBlendEquationArguments::Blending::SourceAlpha );
250 blendEquationArgs->setDestinationRgb( Qt3DRender::QBlendEquationArguments::Blending::OneMinusSourceAlpha );
251 transparentObjectsRenderStateSetColor->addRenderState( blendEquationArgs );
255 Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetDepth =
new Qt3DRender::QRenderStateSet( sortPolicy );
257 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
258 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
259 transparentObjectsRenderStateSetDepth->addRenderState( depthTest );
261 Qt3DRender::QColorMask *noColorMask =
new Qt3DRender::QColorMask;
262 noColorMask->setAlphaMasked(
false );
263 noColorMask->setRedMasked(
false );
264 noColorMask->setGreenMasked(
false );
265 noColorMask->setBlueMasked(
false );
266 transparentObjectsRenderStateSetDepth->addRenderState( noColorMask );
268 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
269 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
270 transparentObjectsRenderStateSetDepth->addRenderState( cullFace );
276 mCurrentWidth = width;
277 mCurrentHeight = height;
278 mColorTexture->setSize( width, height );
279 mDepthTexture->setSize( width, height );
280 if ( mColorTextureMS )
282 mColorTextureMS->setWidth( width );
283 mColorTextureMS->setHeight( height );
284 mDepthTextureMS->setWidth( width );
285 mDepthTextureMS->setHeight( height );
292 mClearBuffers->setClearColor( clearColor );
298 if ( enabled == mFrustumCullingEnabled )
300 mFrustumCullingEnabled = enabled;
301 mFrustumCulling->setEnabled( enabled );
307 mDebugOverlay->setEnabled( enabled );
312 if ( enabled && !mMsaaRenderTarget )
313 mMsaaRenderTarget = buildMsaaTarget();
314 mMsaaRenderState->setEnabled( enabled );
315 mRenderTargetSelector->setTarget( enabled ? mMsaaRenderTarget : mRegularRenderTarget );
318 delete mMsaaRenderTarget;
319 mMsaaRenderTarget =
nullptr;
320 mColorTextureMS =
nullptr;
321 mDepthTextureMS =
nullptr;
327 return mDepthTexture;
332 return mColorTexture;
337 for ( Qt3DRender::QRenderState *state : mClipRenderStateSet->renderStates() )
339 if ( qobject_cast<Qt3DRender::QClipPlane *>( state ) )
341 mClipRenderStateSet->removeRenderState( state );
352 for (
int i = 0; i < nrClipPlanes; ++i )
354 Qt3DRender::QClipPlane *clipPlane =
new Qt3DRender::QClipPlane;
355 clipPlane->setPlaneIndex( i );
356 mClipRenderStateSet->addRenderState( clipPlane );
Qt3DRender::QSubtreeEnabler * mRendererEnabler
QgsAbstractRenderView(const QString &viewName)
Constructor for QgsAbstractRenderView with the specified parent object.
void setClearColor(const QColor &clearColor)
Sets the clear color of the scene (background color).
Qt3DRender::QTexture2D * colorTexture() const
Returns forward color texture.
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
void setMsaaEnabled(bool enabled)
Sets whether multisample anti-aliasing (MSAA) is enabled.
void updateWindowResize(int width, int height) override
Called when 3D window is resized.
void setFrustumCullingEnabled(bool enabled)
Sets whether frustum culling is enabled.
Qt3DRender::QTexture2D * depthTexture() const
Returns forward depth texture.
void addClipPlanes(int nrClipPlanes)
Setups nrClipPlanes clip planes in the forward pass to enable OpenGL clipping.
void removeClipPlanes()
Disables OpenGL clipping.
QgsForwardRenderView(const QString &viewName, Qt3DRender::QCamera *mainCamera)
Constructor with 3D scene camera.