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/QDepthTest>
27#include <Qt3DRender/QFrustumCulling>
28#include <Qt3DRender/QLayer>
29#include <Qt3DRender/QLayerFilter>
30#include <Qt3DRender/QNoDepthMask>
31#include <Qt3DRender/QParameter>
32#include <Qt3DRender/QPolygonOffset>
33#include <Qt3DRender/QRenderStateSet>
34#include <Qt3DRender/QRenderTarget>
35#include <Qt3DRender/QRenderTargetSelector>
36#include <Qt3DRender/QSortPolicy>
37#include <Qt3DRender/QTexture>
38#include <Qt3DRender/QViewport>
39#include <Qt3DRender/qsubtreeenabler.h>
41#if QT_VERSION >= QT_VERSION_CHECK( 5, 15, 0 )
42#include <Qt3DRender/QDebugOverlay>
47 , mMainCamera( mainCamera )
49 mRenderLayer =
new Qt3DRender::QLayer;
50 mRenderLayer->setRecursive(
true );
51 mRenderLayer->setObjectName(
mViewName +
"::Layer" );
53 mTransparentObjectsLayer =
new Qt3DRender::QLayer;
54 mTransparentObjectsLayer->setRecursive(
true );
55 mTransparentObjectsLayer->setObjectName(
mViewName +
"::TransparentLayer" );
61Qt3DRender::QRenderTarget *QgsForwardRenderView::buildTextures()
63 mColorTexture =
new Qt3DRender::QTexture2D;
64 mColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
65 mColorTexture->setGenerateMipMaps(
false );
66 mColorTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
67 mColorTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
68 mColorTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
69 mColorTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
71 mDepthTexture =
new Qt3DRender::QTexture2D;
72 mDepthTexture->setFormat( Qt3DRender::QTexture2D::TextureFormat::DepthFormat );
73 mDepthTexture->setGenerateMipMaps(
false );
74 mDepthTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
75 mDepthTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
76 mDepthTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
77 mDepthTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
79 Qt3DRender::QRenderTarget *renderTarget =
new Qt3DRender::QRenderTarget;
80 Qt3DRender::QRenderTargetOutput *renderTargetDepthOutput =
new Qt3DRender::QRenderTargetOutput;
81 renderTargetDepthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
82 renderTargetDepthOutput->setTexture( mDepthTexture );
83 renderTarget->addOutput( renderTargetDepthOutput );
85 Qt3DRender::QRenderTargetOutput *renderTargetColorOutput =
new Qt3DRender::QRenderTargetOutput;
86 renderTargetColorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
87 renderTargetColorOutput->setTexture( mColorTexture );
88 renderTarget->addOutput( renderTargetColorOutput );
137void QgsForwardRenderView::buildRenderPasses()
140 mMainCameraSelector->setObjectName(
mViewName +
"::CameraSelector" );
141 mMainCameraSelector->setCamera( mMainCamera );
143 mLayerFilter =
new Qt3DRender::QLayerFilter( mMainCameraSelector );
144 mLayerFilter->addLayer( mRenderLayer );
146 mClipRenderStateSet =
new Qt3DRender::QRenderStateSet( mLayerFilter );
147 mClipRenderStateSet->setObjectName(
mViewName +
"::Clip Plane RenderStateSet" );
149 Qt3DRender::QRenderTarget *renderTarget = buildTextures();
151 mRenderTargetSelector =
new Qt3DRender::QRenderTargetSelector( mClipRenderStateSet );
152 mRenderTargetSelector->setTarget( renderTarget );
155 Qt3DRender::QLayerFilter *opaqueObjectsFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
156 opaqueObjectsFilter->addLayer( mTransparentObjectsLayer );
157 opaqueObjectsFilter->setFilterMode( Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers );
159 Qt3DRender::QRenderStateSet *renderStateSet =
new Qt3DRender::QRenderStateSet( opaqueObjectsFilter );
161 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
162 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
163 renderStateSet->addRenderState( depthTest );
165 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
166 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Back );
167 renderStateSet->addRenderState( cullFace );
169 mFrustumCulling =
new Qt3DRender::QFrustumCulling( renderStateSet );
171 mClearBuffers =
new Qt3DRender::QClearBuffers( mFrustumCulling );
172 mClearBuffers->setClearColor( QColor::fromRgbF( 0.0, 0.0, 1.0, 1.0 ) );
173 mClearBuffers->setBuffers( Qt3DRender::QClearBuffers::ColorDepthBuffer );
174 mClearBuffers->setClearDepthValue( 1.0f );
177 Qt3DRender::QLayerFilter *transparentObjectsLayerFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
178 transparentObjectsLayerFilter->addLayer( mTransparentObjectsLayer );
179 transparentObjectsLayerFilter->setFilterMode( Qt3DRender::QLayerFilter::AcceptAnyMatchingLayers );
181 Qt3DRender::QSortPolicy *sortPolicy =
new Qt3DRender::QSortPolicy( transparentObjectsLayerFilter );
182 QVector<Qt3DRender::QSortPolicy::SortType> sortTypes;
183 sortTypes.push_back( Qt3DRender::QSortPolicy::BackToFront );
184 sortPolicy->setSortTypes( sortTypes );
186 Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetColor =
new Qt3DRender::QRenderStateSet( sortPolicy );
188 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
189 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
190 transparentObjectsRenderStateSetColor->addRenderState( depthTest );
192 Qt3DRender::QNoDepthMask *noDepthMask =
new Qt3DRender::QNoDepthMask;
193 transparentObjectsRenderStateSetColor->addRenderState( noDepthMask );
195 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
196 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
197 transparentObjectsRenderStateSetColor->addRenderState( cullFace );
199 Qt3DRender::QBlendEquation *blendEquation =
new Qt3DRender::QBlendEquation;
200 blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
201 transparentObjectsRenderStateSetColor->addRenderState( blendEquation );
203 Qt3DRender::QBlendEquationArguments *blendEquationArgs =
new Qt3DRender::QBlendEquationArguments;
204 blendEquationArgs->setSourceRgb( Qt3DRender::QBlendEquationArguments::Blending::SourceAlpha );
205 blendEquationArgs->setDestinationRgb( Qt3DRender::QBlendEquationArguments::Blending::OneMinusSourceAlpha );
206 transparentObjectsRenderStateSetColor->addRenderState( blendEquationArgs );
210 Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetDepth =
new Qt3DRender::QRenderStateSet( sortPolicy );
212 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
213 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
214 transparentObjectsRenderStateSetDepth->addRenderState( depthTest );
216 Qt3DRender::QColorMask *noColorMask =
new Qt3DRender::QColorMask;
217 noColorMask->setAlphaMasked(
false );
218 noColorMask->setRedMasked(
false );
219 noColorMask->setGreenMasked(
false );
220 noColorMask->setBlueMasked(
false );
221 transparentObjectsRenderStateSetDepth->addRenderState( noColorMask );
223 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
224 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
225 transparentObjectsRenderStateSetDepth->addRenderState( cullFace );
228 mDebugOverlay =
new Qt3DRender::QDebugOverlay( mClearBuffers );
229 mDebugOverlay->setEnabled(
false );
234 mColorTexture->setSize( width, height );
235 mDepthTexture->setSize( width, height );
241 mClearBuffers->setClearColor( clearColor );
247 if ( enabled == mFrustumCullingEnabled )
249 mFrustumCullingEnabled = enabled;
250 mFrustumCulling->setEnabled( enabled );
256 mDebugOverlay->setEnabled( enabled );
261 return mDepthTexture;
266 return mColorTexture;
271 for ( Qt3DRender::QRenderState *state : mClipRenderStateSet->renderStates() )
273 if ( qobject_cast<Qt3DRender::QClipPlane *>( state ) )
275 mClipRenderStateSet->removeRenderState( state );
286 for (
int i = 0; i < nrClipPlanes; ++i )
288 Qt3DRender::QClipPlane *clipPlane =
new Qt3DRender::QClipPlane;
289 clipPlane->setPlaneIndex( i );
290 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 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.