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/QNoDepthMask>
32#include <Qt3DRender/QParameter>
33#include <Qt3DRender/QPolygonOffset>
34#include <Qt3DRender/QRenderStateSet>
35#include <Qt3DRender/QRenderTarget>
36#include <Qt3DRender/QRenderTargetSelector>
37#include <Qt3DRender/QSortPolicy>
38#include <Qt3DRender/QTexture>
39#include <Qt3DRender/QViewport>
40#include <Qt3DRender/qsubtreeenabler.h>
44 , mMainCamera( mainCamera )
46 mRenderLayer =
new Qt3DRender::QLayer;
47 mRenderLayer->setRecursive(
true );
48 mRenderLayer->setObjectName(
mViewName +
"::Layer" );
50 mTransparentObjectsLayer =
new Qt3DRender::QLayer;
51 mTransparentObjectsLayer->setRecursive(
true );
52 mTransparentObjectsLayer->setObjectName(
mViewName +
"::TransparentLayer" );
58Qt3DRender::QRenderTarget *QgsForwardRenderView::buildTextures()
60 mColorTexture =
new Qt3DRender::QTexture2D;
61 mColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
62 mColorTexture->setGenerateMipMaps(
false );
63 mColorTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
64 mColorTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
65 mColorTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
66 mColorTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
68 mDepthTexture =
new Qt3DRender::QTexture2D;
69 mDepthTexture->setFormat( Qt3DRender::QAbstractTexture::D24S8 );
70 mDepthTexture->setGenerateMipMaps(
false );
71 mDepthTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
72 mDepthTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
73 mDepthTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
74 mDepthTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
76 Qt3DRender::QRenderTarget *renderTarget =
new Qt3DRender::QRenderTarget;
77 Qt3DRender::QRenderTargetOutput *renderTargetDepthOutput =
new Qt3DRender::QRenderTargetOutput;
78 renderTargetDepthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
79 renderTargetDepthOutput->setTexture( mDepthTexture );
80 renderTarget->addOutput( renderTargetDepthOutput );
82 Qt3DRender::QRenderTargetOutput *renderTargetColorOutput =
new Qt3DRender::QRenderTargetOutput;
83 renderTargetColorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
84 renderTargetColorOutput->setTexture( mColorTexture );
85 renderTarget->addOutput( renderTargetColorOutput );
134void QgsForwardRenderView::buildRenderPasses()
137 mMainCameraSelector->setObjectName(
mViewName +
"::CameraSelector" );
138 mMainCameraSelector->setCamera( mMainCamera );
140 mLayerFilter =
new Qt3DRender::QLayerFilter( mMainCameraSelector );
141 mLayerFilter->addLayer( mRenderLayer );
143 mClipRenderStateSet =
new Qt3DRender::QRenderStateSet( mLayerFilter );
144 mClipRenderStateSet->setObjectName(
mViewName +
"::Clip Plane RenderStateSet" );
146 Qt3DRender::QRenderTarget *renderTarget = buildTextures();
148 mRenderTargetSelector =
new Qt3DRender::QRenderTargetSelector( mClipRenderStateSet );
149 mRenderTargetSelector->setTarget( renderTarget );
152 Qt3DRender::QLayerFilter *opaqueObjectsFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
153 opaqueObjectsFilter->addLayer( mTransparentObjectsLayer );
154 opaqueObjectsFilter->setFilterMode( Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers );
156 Qt3DRender::QRenderStateSet *renderStateSet =
new Qt3DRender::QRenderStateSet( opaqueObjectsFilter );
158 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
159 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
160 renderStateSet->addRenderState( depthTest );
162 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
163 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Back );
164 renderStateSet->addRenderState( cullFace );
166 mFrustumCulling =
new Qt3DRender::QFrustumCulling( renderStateSet );
168 mClearBuffers =
new Qt3DRender::QClearBuffers( mFrustumCulling );
169 mClearBuffers->setClearColor( QColor::fromRgbF( 0.0, 0.0, 1.0, 1.0 ) );
170 mClearBuffers->setBuffers( Qt3DRender::QClearBuffers::ColorDepthBuffer );
171 mClearBuffers->setClearDepthValue( 1.0f );
174 Qt3DRender::QLayerFilter *transparentObjectsLayerFilter =
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
175 transparentObjectsLayerFilter->addLayer( mTransparentObjectsLayer );
176 transparentObjectsLayerFilter->setFilterMode( Qt3DRender::QLayerFilter::AcceptAnyMatchingLayers );
178 Qt3DRender::QSortPolicy *sortPolicy =
new Qt3DRender::QSortPolicy( transparentObjectsLayerFilter );
179 QVector<Qt3DRender::QSortPolicy::SortType> sortTypes;
180 sortTypes.push_back( Qt3DRender::QSortPolicy::BackToFront );
181 sortPolicy->setSortTypes( sortTypes );
183 Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetColor =
new Qt3DRender::QRenderStateSet( sortPolicy );
185 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
186 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
187 transparentObjectsRenderStateSetColor->addRenderState( depthTest );
189 Qt3DRender::QNoDepthMask *noDepthMask =
new Qt3DRender::QNoDepthMask;
190 transparentObjectsRenderStateSetColor->addRenderState( noDepthMask );
192 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
193 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
194 transparentObjectsRenderStateSetColor->addRenderState( cullFace );
196 Qt3DRender::QBlendEquation *blendEquation =
new Qt3DRender::QBlendEquation;
197 blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
198 transparentObjectsRenderStateSetColor->addRenderState( blendEquation );
200 Qt3DRender::QBlendEquationArguments *blendEquationArgs =
new Qt3DRender::QBlendEquationArguments;
201 blendEquationArgs->setSourceRgb( Qt3DRender::QBlendEquationArguments::Blending::SourceAlpha );
202 blendEquationArgs->setDestinationRgb( Qt3DRender::QBlendEquationArguments::Blending::OneMinusSourceAlpha );
203 transparentObjectsRenderStateSetColor->addRenderState( blendEquationArgs );
207 Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetDepth =
new Qt3DRender::QRenderStateSet( sortPolicy );
209 Qt3DRender::QDepthTest *depthTest =
new Qt3DRender::QDepthTest;
210 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
211 transparentObjectsRenderStateSetDepth->addRenderState( depthTest );
213 Qt3DRender::QColorMask *noColorMask =
new Qt3DRender::QColorMask;
214 noColorMask->setAlphaMasked(
false );
215 noColorMask->setRedMasked(
false );
216 noColorMask->setGreenMasked(
false );
217 noColorMask->setBlueMasked(
false );
218 transparentObjectsRenderStateSetDepth->addRenderState( noColorMask );
220 Qt3DRender::QCullFace *cullFace =
new Qt3DRender::QCullFace;
221 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
222 transparentObjectsRenderStateSetDepth->addRenderState( cullFace );
225 mDebugOverlay =
new Qt3DRender::QDebugOverlay( mClearBuffers );
226 mDebugOverlay->setEnabled(
false );
231 mColorTexture->setSize( width, height );
232 mDepthTexture->setSize( width, height );
238 mClearBuffers->setClearColor( clearColor );
244 if ( enabled == mFrustumCullingEnabled )
246 mFrustumCullingEnabled = enabled;
247 mFrustumCulling->setEnabled( enabled );
253 mDebugOverlay->setEnabled( enabled );
258 return mDepthTexture;
263 return mColorTexture;
268 for ( Qt3DRender::QRenderState *state : mClipRenderStateSet->renderStates() )
270 if ( qobject_cast<Qt3DRender::QClipPlane *>( state ) )
272 mClipRenderStateSet->removeRenderState( state );
283 for (
int i = 0; i < nrClipPlanes; ++i )
285 Qt3DRender::QClipPlane *clipPlane =
new Qt3DRender::QClipPlane;
286 clipPlane->setPlaneIndex( i );
287 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.