17#include <Qt3DRender/QCamera> 
   18#include <Qt3DRender/QViewport> 
   19#include <Qt3DRender/QCameraSelector> 
   20#include <Qt3DRender/QLayerFilter> 
   21#include <Qt3DRender/QLayer> 
   22#include <Qt3DRender/QRenderTargetSelector> 
   23#include <Qt3DRender/QRenderTarget> 
   24#include <Qt3DRender/QTexture> 
   25#include <Qt3DRender/QClearBuffers> 
   26#include <Qt3DRender/QParameter> 
   27#include <Qt3DRender/QFrustumCulling> 
   28#include <Qt3DRender/QRenderStateSet> 
   29#include <Qt3DRender/QDepthTest> 
   30#include <Qt3DRender/QCullFace> 
   31#include <Qt3DRender/QPolygonOffset> 
   32#include <Qt3DRender/qsubtreeenabler.h> 
   33#include <Qt3DRender/QBlendEquation> 
   34#include <Qt3DRender/QColorMask> 
   35#include <Qt3DRender/QSortPolicy> 
   36#include <Qt3DRender/QNoDepthMask> 
   37#include <Qt3DRender/QBlendEquationArguments> 
   38#include <Qt3DRender/QClipPlane> 
   40#if QT_VERSION >= QT_VERSION_CHECK( 5, 15, 0 ) 
   41#include <Qt3DRender/QDebugOverlay> 
   46  , mMainCamera( mainCamera )
 
   48  mRenderLayer = 
new Qt3DRender::QLayer;
 
   49  mRenderLayer->setRecursive( 
true );
 
   50  mRenderLayer->setObjectName( 
mViewName + 
"::Layer" );
 
   52  mTransparentObjectsLayer = 
new Qt3DRender::QLayer;
 
   53  mTransparentObjectsLayer->setRecursive( 
true );
 
   54  mTransparentObjectsLayer->setObjectName( 
mViewName + 
"::TransparentLayer" );
 
 
   60Qt3DRender::QRenderTarget *QgsForwardRenderView::buildTextures()
 
   62  mColorTexture = 
new Qt3DRender::QTexture2D;
 
   63  mColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
 
   64  mColorTexture->setGenerateMipMaps( 
false );
 
   65  mColorTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
 
   66  mColorTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
 
   67  mColorTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
 
   68  mColorTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
 
   70  mDepthTexture = 
new Qt3DRender::QTexture2D;
 
   71  mDepthTexture->setFormat( Qt3DRender::QTexture2D::TextureFormat::DepthFormat );
 
   72  mDepthTexture->setGenerateMipMaps( 
false );
 
   73  mDepthTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
 
   74  mDepthTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
 
   75  mDepthTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
 
   76  mDepthTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
 
   78  Qt3DRender::QRenderTarget *renderTarget = 
new Qt3DRender::QRenderTarget;
 
   79  Qt3DRender::QRenderTargetOutput *renderTargetDepthOutput = 
new Qt3DRender::QRenderTargetOutput;
 
   80  renderTargetDepthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
 
   81  renderTargetDepthOutput->setTexture( mDepthTexture );
 
   82  renderTarget->addOutput( renderTargetDepthOutput );
 
   84  Qt3DRender::QRenderTargetOutput *renderTargetColorOutput = 
new Qt3DRender::QRenderTargetOutput;
 
   85  renderTargetColorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
 
   86  renderTargetColorOutput->setTexture( mColorTexture );
 
   87  renderTarget->addOutput( renderTargetColorOutput );
 
  136void QgsForwardRenderView::buildRenderPasses()
 
  139  mMainCameraSelector->setObjectName( 
mViewName + 
"::CameraSelector" );
 
  140  mMainCameraSelector->setCamera( mMainCamera );
 
  142  mLayerFilter = 
new Qt3DRender::QLayerFilter( mMainCameraSelector );
 
  143  mLayerFilter->addLayer( mRenderLayer );
 
  145  mClipRenderStateSet = 
new Qt3DRender::QRenderStateSet( mLayerFilter );
 
  146  mClipRenderStateSet->setObjectName( 
mViewName + 
"::Clip Plane RenderStateSet" );
 
  148  Qt3DRender::QRenderTarget *renderTarget = buildTextures();
 
  150  mRenderTargetSelector = 
new Qt3DRender::QRenderTargetSelector( mClipRenderStateSet );
 
  151  mRenderTargetSelector->setTarget( renderTarget );
 
  154  Qt3DRender::QLayerFilter *opaqueObjectsFilter = 
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
 
  155  opaqueObjectsFilter->addLayer( mTransparentObjectsLayer );
 
  156  opaqueObjectsFilter->setFilterMode( Qt3DRender::QLayerFilter::DiscardAnyMatchingLayers );
 
  158  Qt3DRender::QRenderStateSet *renderStateSet = 
new Qt3DRender::QRenderStateSet( opaqueObjectsFilter );
 
  160  Qt3DRender::QDepthTest *depthTest = 
new Qt3DRender::QDepthTest;
 
  161  depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
 
  162  renderStateSet->addRenderState( depthTest );
 
  164  Qt3DRender::QCullFace *cullFace = 
new Qt3DRender::QCullFace;
 
  165  cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Back );
 
  166  renderStateSet->addRenderState( cullFace );
 
  168  mFrustumCulling = 
new Qt3DRender::QFrustumCulling( renderStateSet );
 
  170  mClearBuffers = 
new Qt3DRender::QClearBuffers( mFrustumCulling );
 
  171  mClearBuffers->setClearColor( QColor::fromRgbF( 0.0, 0.0, 1.0, 1.0 ) );
 
  172  mClearBuffers->setBuffers( Qt3DRender::QClearBuffers::ColorDepthBuffer );
 
  173  mClearBuffers->setClearDepthValue( 1.0f );
 
  176  Qt3DRender::QLayerFilter *transparentObjectsLayerFilter = 
new Qt3DRender::QLayerFilter( mRenderTargetSelector );
 
  177  transparentObjectsLayerFilter->addLayer( mTransparentObjectsLayer );
 
  178  transparentObjectsLayerFilter->setFilterMode( Qt3DRender::QLayerFilter::AcceptAnyMatchingLayers );
 
  180  Qt3DRender::QSortPolicy *sortPolicy = 
new Qt3DRender::QSortPolicy( transparentObjectsLayerFilter );
 
  181  QVector<Qt3DRender::QSortPolicy::SortType> sortTypes;
 
  182  sortTypes.push_back( Qt3DRender::QSortPolicy::BackToFront );
 
  183  sortPolicy->setSortTypes( sortTypes );
 
  185  Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetColor = 
new Qt3DRender::QRenderStateSet( sortPolicy );
 
  187    Qt3DRender::QDepthTest *depthTest = 
new Qt3DRender::QDepthTest;
 
  188    depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
 
  189    transparentObjectsRenderStateSetColor->addRenderState( depthTest );
 
  191    Qt3DRender::QNoDepthMask *noDepthMask = 
new Qt3DRender::QNoDepthMask;
 
  192    transparentObjectsRenderStateSetColor->addRenderState( noDepthMask );
 
  194    Qt3DRender::QCullFace *cullFace = 
new Qt3DRender::QCullFace;
 
  195    cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
 
  196    transparentObjectsRenderStateSetColor->addRenderState( cullFace );
 
  198    Qt3DRender::QBlendEquation *blendEquation = 
new Qt3DRender::QBlendEquation;
 
  199    blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
 
  200    transparentObjectsRenderStateSetColor->addRenderState( blendEquation );
 
  202    Qt3DRender::QBlendEquationArguments *blendEquationArgs = 
new Qt3DRender::QBlendEquationArguments;
 
  203    blendEquationArgs->setSourceRgb( Qt3DRender::QBlendEquationArguments::Blending::SourceAlpha );
 
  204    blendEquationArgs->setDestinationRgb( Qt3DRender::QBlendEquationArguments::Blending::OneMinusSourceAlpha );
 
  205    transparentObjectsRenderStateSetColor->addRenderState( blendEquationArgs );
 
  209  Qt3DRender::QRenderStateSet *transparentObjectsRenderStateSetDepth = 
new Qt3DRender::QRenderStateSet( sortPolicy );
 
  211    Qt3DRender::QDepthTest *depthTest = 
new Qt3DRender::QDepthTest;
 
  212    depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
 
  213    transparentObjectsRenderStateSetDepth->addRenderState( depthTest );
 
  215    Qt3DRender::QColorMask *noColorMask = 
new Qt3DRender::QColorMask;
 
  216    noColorMask->setAlphaMasked( 
false );
 
  217    noColorMask->setRedMasked( 
false );
 
  218    noColorMask->setGreenMasked( 
false );
 
  219    noColorMask->setBlueMasked( 
false );
 
  220    transparentObjectsRenderStateSetDepth->addRenderState( noColorMask );
 
  222    Qt3DRender::QCullFace *cullFace = 
new Qt3DRender::QCullFace;
 
  223    cullFace->setMode( Qt3DRender::QCullFace::CullingMode::NoCulling );
 
  224    transparentObjectsRenderStateSetDepth->addRenderState( cullFace );
 
  227  mDebugOverlay = 
new Qt3DRender::QDebugOverlay( mClearBuffers );
 
  228  mDebugOverlay->setEnabled( 
false );
 
  233  mColorTexture->setSize( width, height );
 
  234  mDepthTexture->setSize( width, height );
 
 
  240  mClearBuffers->setClearColor( clearColor );
 
 
  246  if ( enabled == mFrustumCullingEnabled )
 
  248  mFrustumCullingEnabled = enabled;
 
  249  mFrustumCulling->setEnabled( enabled );
 
 
  255  mDebugOverlay->setEnabled( enabled );
 
 
  260  return mDepthTexture;
 
 
  265  return mColorTexture;
 
 
  270  for ( Qt3DRender::QRenderState *state : mClipRenderStateSet->renderStates() )
 
  272    if ( qobject_cast<Qt3DRender::QClipPlane *>( state ) )
 
  274      mClipRenderStateSet->removeRenderState( state );
 
 
  285  for ( 
int i = 0; i < nrClipPlanes; ++i )
 
  287    Qt3DRender::QClipPlane *clipPlane = 
new Qt3DRender::QClipPlane;
 
  288    clipPlane->setPlaneIndex( i );
 
  289    mClipRenderStateSet->addRenderState( clipPlane );
 
 
Base class for 3D render view.
 
Qt3DRender::QSubtreeEnabler * mRendererEnabler
 
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.
 
virtual 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.