18 #include <Qt3DRender/QGeometry> 
   19 #include <Qt3DRender/QAttribute> 
   20 #include <Qt3DRender/QBuffer> 
   21 #include <Qt3DRender/QGeometryRenderer> 
   22 #include <Qt3DRender/QParameter> 
   23 #include <Qt3DRender/QTechnique> 
   24 #include <Qt3DRender/QGraphicsApiFilter> 
   25 #include <Qt3DRender/QDepthTest> 
   33   Qt3DRender::QGeometry *geom = 
new Qt3DRender::QGeometry( 
this );
 
   34   Qt3DRender::QAttribute *positionAttribute = 
new Qt3DRender::QAttribute( 
this );
 
   35   QVector<float> vert = { -1.0f, -1.0f, 0.0f,  1.0f, -1.0f, 0.0f,  -1.0f,  1.0f, 0.0f,  -1.0f,  1.0f, 0.0f,  1.0f, -1.0f, 0.0f,  1.0f,  1.0f, 0.0f };
 
   37   QByteArray vertexArr( ( 
const char * ) vert.constData(), vert.size() * 
sizeof( 
float ) );
 
   38   Qt3DRender::QBuffer *vertexBuffer = 
nullptr;
 
   39   vertexBuffer = 
new Qt3DRender::QBuffer( 
this );
 
   40   vertexBuffer->setData( vertexArr );
 
   42   positionAttribute->setName( Qt3DRender::QAttribute::defaultPositionAttributeName() );
 
   43   positionAttribute->setVertexBaseType( Qt3DRender::QAttribute::Float );
 
   44   positionAttribute->setVertexSize( 3 );
 
   45   positionAttribute->setAttributeType( Qt3DRender::QAttribute::VertexAttribute );
 
   46   positionAttribute->setBuffer( vertexBuffer );
 
   47   positionAttribute->setByteOffset( 0 );
 
   48   positionAttribute->setByteStride( 3 * 
sizeof( 
float ) );
 
   49   positionAttribute->setCount( 6 );
 
   51   geom->addAttribute( positionAttribute );
 
   53   Qt3DRender::QGeometryRenderer *renderer = 
new Qt3DRender::QGeometryRenderer( 
this );
 
   54   renderer->setPrimitiveType( Qt3DRender::QGeometryRenderer::PrimitiveType::Triangles );
 
   55   renderer->setGeometry( geom );
 
   57   addComponent( renderer );
 
   59   mMaterial = 
new Qt3DRender::QMaterial( 
this );
 
   62   mShadowMapParameter = 
new Qt3DRender::QParameter( 
"shadowTexture", frameGraph->
shadowMapTexture() );
 
   63   mMaterial->addParameter( mColorTextureParameter );
 
   64   mMaterial->addParameter( mDepthTextureParameter );
 
   65   mMaterial->addParameter( mShadowMapParameter );
 
   70   mFarPlaneParameter = 
new Qt3DRender::QParameter( 
"farPlane", mMainCamera->farPlane() );
 
   71   mMaterial->addParameter( mFarPlaneParameter );
 
   72   connect( mMainCamera, &Qt3DRender::QCamera::farPlaneChanged, [&]( 
float farPlane )
 
   74     mFarPlaneParameter->setValue( farPlane );
 
   76   mNearPlaneParameter = 
new Qt3DRender::QParameter( 
"nearPlane", mMainCamera->nearPlane() );
 
   77   mMaterial->addParameter( mNearPlaneParameter );
 
   78   connect( mMainCamera, &Qt3DRender::QCamera::nearPlaneChanged, [&]( 
float nearPlane )
 
   80     mNearPlaneParameter->setValue( nearPlane );
 
   83   mLightFarPlaneParameter = 
new Qt3DRender::QParameter( 
"lightFarPlane", mLightCamera->farPlane() );
 
   84   mMaterial->addParameter( mLightFarPlaneParameter );
 
   85   connect( mLightCamera, &Qt3DRender::QCamera::farPlaneChanged, [&]( 
float farPlane )
 
   87     mLightFarPlaneParameter->setValue( farPlane );
 
   89   mLightNearPlaneParameter = 
new Qt3DRender::QParameter( 
"lightNearPlane", mLightCamera->nearPlane() );
 
   90   mMaterial->addParameter( mLightNearPlaneParameter );
 
   91   connect( mLightCamera, &Qt3DRender::QCamera::nearPlaneChanged, [&]( 
float nearPlane )
 
   93     mLightNearPlaneParameter->setValue( nearPlane );
 
   96   mMainCameraInvViewMatrixParameter = 
new Qt3DRender::QParameter( 
"invertedCameraView", mMainCamera->viewMatrix().inverted() );
 
   97   mMaterial->addParameter( mMainCameraInvViewMatrixParameter );
 
   98   mMainCameraInvProjMatrixParameter = 
new Qt3DRender::QParameter( 
"invertedCameraProj", mMainCamera->projectionMatrix().inverted() );
 
   99   mMaterial->addParameter( mMainCameraInvProjMatrixParameter );
 
  100   connect( mMainCamera, &Qt3DRender::QCamera::projectionMatrixChanged, [&]( 
const QMatrix4x4 & projectionMatrix )
 
  102     mMainCameraInvProjMatrixParameter->setValue( projectionMatrix.inverted() );
 
  104   connect( mMainCamera, &Qt3DRender::QCamera::viewMatrixChanged, [&]()
 
  106     mMainCameraInvViewMatrixParameter->setValue( mMainCamera->viewMatrix().inverted() );
 
  109   mShadowMinX = 
new Qt3DRender::QParameter( 
"shadowMinX", QVariant::fromValue( 0.0f ) );
 
  110   mShadowMaxX = 
new Qt3DRender::QParameter( 
"shadowMaxX", QVariant::fromValue( 0.0f ) );
 
  111   mShadowMinZ = 
new Qt3DRender::QParameter( 
"shadowMinZ", QVariant::fromValue( 0.0f ) );
 
  112   mShadowMaxZ = 
new Qt3DRender::QParameter( 
"shadowMaxZ", QVariant::fromValue( 0.0f ) );
 
  113   mMaterial->addParameter( mShadowMinX );
 
  114   mMaterial->addParameter( mShadowMaxX );
 
  115   mMaterial->addParameter( mShadowMinZ );
 
  116   mMaterial->addParameter( mShadowMaxZ );
 
  118   mRenderShadowsParameter = 
new Qt3DRender::QParameter( 
"renderShadows", QVariant::fromValue( 0 ) );
 
  119   mMaterial->addParameter( mRenderShadowsParameter );
 
  121   mShadowBiasParameter = 
new Qt3DRender::QParameter( 
"shadowBias", QVariant::fromValue( 0.00001f ) );
 
  122   mMaterial->addParameter( mShadowBiasParameter );
 
  124   mEyeDomeLightingEnabledParameter = 
new Qt3DRender::QParameter( 
"edlEnabled", QVariant::fromValue( 0 ) );
 
  125   mEyeDomeLightingStrengthParameter = 
new Qt3DRender::QParameter( 
"edlStrength", QVariant::fromValue( 1000.0f ) );
 
  126   mEyeDomeLightingDistanceParameter = 
new Qt3DRender::QParameter( 
"edlDistance", QVariant::fromValue( 2.0f ) );
 
  127   mMaterial->addParameter( mEyeDomeLightingEnabledParameter );
 
  128   mMaterial->addParameter( mEyeDomeLightingStrengthParameter );
 
  129   mMaterial->addParameter( mEyeDomeLightingDistanceParameter );
 
  131   mLightPosition = 
new Qt3DRender::QParameter( 
"lightPosition", QVariant::fromValue( QVector3D() ) );
 
  132   mLightDirection = 
new Qt3DRender::QParameter( 
"lightDirection", QVariant::fromValue( QVector3D() ) );
 
  133   mMaterial->addParameter( mLightPosition );
 
  134   mMaterial->addParameter( mLightDirection );
 
  136   mEffect = 
new Qt3DRender::QEffect( 
this );
 
  137   Qt3DRender::QTechnique *technique = 
new Qt3DRender::QTechnique( 
this );
 
  138   Qt3DRender::QGraphicsApiFilter *graphicsApiFilter = technique->graphicsApiFilter();
 
  139   graphicsApiFilter->setApi( Qt3DRender::QGraphicsApiFilter::Api::OpenGL );
 
  140   graphicsApiFilter->setProfile( Qt3DRender::QGraphicsApiFilter::OpenGLProfile::CoreProfile );
 
  141   graphicsApiFilter->setMajorVersion( 1 );
 
  142   graphicsApiFilter->setMinorVersion( 5 );
 
  143   Qt3DRender::QRenderPass *renderPass = 
new Qt3DRender::QRenderPass( 
this );
 
  144   Qt3DRender::QShaderProgram *shader = 
new Qt3DRender::QShaderProgram( 
this );
 
  146   QString vertexShaderPath = QStringLiteral( 
"qrc:/shaders/postprocess.vert" );
 
  147   QString fragmentShaderPath = QStringLiteral( 
"qrc:/shaders/postprocess.frag" );
 
  149   shader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
 
  150   shader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );
 
  151   renderPass->setShaderProgram( shader );
 
  153   Qt3DRender::QDepthTest *depthTest = 
new Qt3DRender::QDepthTest( 
this );
 
  154   depthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
 
  156   renderPass->addRenderState( depthTest );
 
  158   technique->addRenderPass( renderPass );
 
  160   mEffect->addTechnique( technique );
 
  161   mMaterial->setEffect( mEffect );
 
  163   addComponent( mMaterial );
 
  168   mShadowMinX->setValue( minX );
 
  169   mShadowMaxX->setValue( maxX );
 
  170   mShadowMinZ->setValue( minZ );
 
  171   mShadowMaxZ->setValue( maxZ );
 
  176   mLightPosition->setValue( QVariant::fromValue( position ) );
 
  177   mLightDirection->setValue( QVariant::fromValue( direction.normalized() ) );
 
  182   mRenderShadowsParameter->setValue( QVariant::fromValue( enabled ? 1 : 0 ) );
 
  187   mShadowBiasParameter->setValue( QVariant::fromValue( shadowBias ) );
 
  192   mEyeDomeLightingEnabledParameter->setValue( QVariant::fromValue( enabled ? 1 : 0 ) );
 
  197   mEyeDomeLightingStrengthParameter->setValue( QVariant::fromValue( strength ) );
 
  202   mEyeDomeLightingDistanceParameter->setValue( QVariant::fromValue( distance ) );
 
void setupShadowRenderingExtent(float minX, float maxX, float minZ, float maxZ)
Sets the parts of the scene where objects cast shadows.
QgsPostprocessingEntity(QgsShadowRenderingFrameGraph *frameGraph, QNode *parent=nullptr)
Constructor.
void setShadowRenderingEnabled(bool enabled)
Sets whether shadow rendering is enabled.
void setEyeDomeLightingDistance(int distance)
Sets the eye dome lighting distance (contributes to the contrast of the image)
void setShadowBias(float shadowBias)
Sets the shadow bias value.
void setEyeDomeLightingStrength(double strength)
Sets the eye dome lighting strength.
void setupDirectionalLight(QVector3D position, QVector3D direction)
Sets up a directional light that is used to render shadows.
void setEyeDomeLightingEnabled(bool enabled)
Sets whether eye dome lighting is enabled.
Qt3DRender::QTexture2D * forwardRenderDepthTexture()
Returns the depth texture of the forward rendering pass.
Qt3DRender::QTexture2D * shadowMapTexture()
Returns the shadow map (a depth texture for the shadow rendering pass)
Qt3DRender::QTexture2D * forwardRenderColorTexture()
Returns the color texture of the forward rendering pass.
Qt3DRender::QCamera * lightCamera()
Returns the light camera.
Qt3DRender::QCamera * mainCamera()
Returns the main camera.