25#include <Qt3DRender/QCameraSelector>
26#include <Qt3DRender/QClearBuffers>
27#include <Qt3DRender/QLayer>
28#include <Qt3DRender/QLayerFilter>
29#include <Qt3DRender/QNoDraw>
30#include <Qt3DRender/QRenderCapture>
31#include <Qt3DRender/QRenderTarget>
32#include <Qt3DRender/QRenderTargetOutput>
33#include <Qt3DRender/QRenderTargetSelector>
34#include <Qt3DRender/QTexture>
35#include <Qt3DRender/qsubtreeenabler.h>
41 Qt3DRender::QFrameGraphNode *subPassesNode = constructMainPass( size );
44 Qt3DRender::QFrameGraphNode *node;
46 node = constructSubPassForProcessing( frameGraph, rootSceneEntity );
47 node->setParent( subPassesNode );
50 node = constructSubPassForOverlayTexture();
51 node->setParent( subPassesNode );
54 node = constructSubPassForRenderCapture();
55 node->setParent( subPassesNode );
61 mRenderCaptureColorTexture->setSize( width, height );
62 mRenderCaptureDepthTexture->setSize( width, height );
67 if ( mRenderCaptureTargetSelector->isEnabled() == enabled )
70 mRenderCaptureTargetSelector->setEnabled( enabled );
74Qt3DRender::QRenderTarget *QgsPostprocessingRenderView::buildRenderCaptureTextures( QSize size )
77 Qt3DRender::QRenderTarget *renderTarget =
new Qt3DRender::QRenderTarget;
80 Qt3DRender::QRenderTargetOutput *colorOutput =
new Qt3DRender::QRenderTargetOutput;
81 colorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
84 mRenderCaptureColorTexture =
new Qt3DRender::QTexture2D( colorOutput );
85 mRenderCaptureColorTexture->setSize( size.width(), size.height() );
86 mRenderCaptureColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
87 mRenderCaptureColorTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
88 mRenderCaptureColorTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
89 mRenderCaptureColorTexture->setObjectName(
mViewName +
"::ColorTarget" );
92 colorOutput->setTexture( mRenderCaptureColorTexture );
93 renderTarget->addOutput( colorOutput );
95 Qt3DRender::QRenderTargetOutput *depthOutput =
new Qt3DRender::QRenderTargetOutput;
97 depthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
98 mRenderCaptureDepthTexture =
new Qt3DRender::QTexture2D( depthOutput );
99 mRenderCaptureDepthTexture->setSize( size.width(), size.height() );
100 mRenderCaptureDepthTexture->setFormat( Qt3DRender::QAbstractTexture::DepthFormat );
101 mRenderCaptureDepthTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
102 mRenderCaptureDepthTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
103 mRenderCaptureDepthTexture->setComparisonFunction( Qt3DRender::QAbstractTexture::CompareLessEqual );
104 mRenderCaptureDepthTexture->setComparisonMode( Qt3DRender::QAbstractTexture::CompareRefToTexture );
105 mRenderCaptureDepthTexture->setObjectName(
mViewName +
"::DepthTarget" );
107 depthOutput->setTexture( mRenderCaptureDepthTexture );
108 renderTarget->addOutput( depthOutput );
114Qt3DRender::QFrameGraphNode *QgsPostprocessingRenderView::constructMainPass( QSize size )
118 mRenderCaptureTargetSelector =
new Qt3DRender::QRenderTargetSelector(
mRendererEnabler );
119 mRenderCaptureTargetSelector->setObjectName(
mViewName +
"::RenderTargetSelector" );
120 mRenderCaptureTargetSelector->setEnabled(
false );
123 Qt3DRender::QRenderTarget *renderTarget = buildRenderCaptureTextures( size );
124 mRenderCaptureTargetSelector->setTarget( renderTarget );
126 return mRenderCaptureTargetSelector;
130Qt3DRender::QFrameGraphNode *QgsPostprocessingRenderView::constructSubPassForProcessing(
QgsFrameGraph *frameGraph, Qt3DCore::QEntity *rootSceneEntity )
132 Qt3DRender::QLayerFilter *layerFilter =
new Qt3DRender::QLayerFilter;
133 layerFilter->setObjectName(
mViewName +
"::Sub pass::Postprocessing" );
135 Qt3DRender::QLayer *postProcessingLayer =
new Qt3DRender::QLayer();
136 postProcessingLayer->setRecursive(
true );
137 layerFilter->addLayer( postProcessingLayer );
140 new Qt3DRender::QClearBuffers( layerFilter );
142 mPostprocessingEntity =
new QgsPostprocessingEntity( frameGraph, postProcessingLayer, rootSceneEntity );
143 mPostprocessingEntity->setObjectName(
"PostProcessingPassEntity" );
148Qt3DRender::QFrameGraphNode *QgsPostprocessingRenderView::constructSubPassForRenderCapture()
150 Qt3DRender::QFrameGraphNode *top =
new Qt3DRender::QNoDraw;
151 top->setObjectName(
mViewName +
"::Sub pass::RenderCapture" );
153 mRenderCapture =
new Qt3DRender::QRenderCapture( top );
158Qt3DRender::QFrameGraphNode *QgsPostprocessingRenderView::constructSubPassForOverlayTexture()
160 mOverlayTextureRenderView = std::make_unique<QgsOverlayTextureRenderView>(
mViewName +
"::Sub pass::OverlayTexture" );
161 return mOverlayTextureRenderView->topGraphNode();
167 return mRenderCapture;
172 return mPostprocessingEntity;
Qt3DRender::QSubtreeEnabler * mRendererEnabler
virtual void updateWindowResize(int width, int height)
Called when 3D window is resized.
QgsAbstractRenderView(const QString &viewName)
Constructor for QgsAbstractRenderView with the specified parent object.
Container class that holds different objects related to frame graphs of 3D scenes.
An entity that is responsible for applying post processing effects.
Qt3DRender::QRenderCapture * renderCapture() const
Returns the render capture object used to take an image of the postprocessing buffer of the scene.
QgsPostprocessingEntity * entity() const
Returns the QT3D entity used to do the rendering.
QgsPostprocessingRenderView(const QString &viewName, QgsFrameGraph *frameGraph, QSize size, Qt3DCore::QEntity *rootSceneEntity)
Default constructor.
void setOffScreenRenderCaptureEnabled(bool enabled)
Sets whether it will be possible to render to an image.
virtual void updateWindowResize(int width, int height) override
Called when 3D window is resized.