QGIS API Documentation 3.99.0-Master (c22de0620c0)
Loading...
Searching...
No Matches
qgsambientocclusionrenderentity.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsambientocclusionrenderentity.cpp
3 --------------------------------------
4 Date : June 2022
5 Copyright : (C) 2022 by Belgacem Nedjima
6 Email : belgacem dot nedjima at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include <random>
19
20#include <QString>
21#include <Qt3DRender/QCamera>
22#include <Qt3DRender/QMaterial>
23#include <Qt3DRender/QParameter>
24#include <Qt3DRender/QShaderProgram>
25#include <Qt3DRender/QTexture>
26
27#include "moc_qgsambientocclusionrenderentity.cpp"
28
29using namespace Qt::StringLiterals;
30
31QgsAmbientOcclusionRenderEntity::QgsAmbientOcclusionRenderEntity( Qt3DRender::QTexture2D *depthTexture, Qt3DRender::QLayer *layer, Qt3DRender::QCamera *camera, QNode *parent )
32 : QgsRenderPassQuad( layer, parent )
33{
34 mDepthTextureParameter = new Qt3DRender::QParameter( u"depthTexture"_s, depthTexture );
35 mMaterial->addParameter( mDepthTextureParameter );
36
37 mFarPlaneParameter = new Qt3DRender::QParameter( u"farPlane"_s, camera->farPlane() );
38 mMaterial->addParameter( mFarPlaneParameter );
39 connect( camera, &Qt3DRender::QCamera::farPlaneChanged, mFarPlaneParameter, [&]( float farPlane ) {
40 mFarPlaneParameter->setValue( farPlane );
41 } );
42 mNearPlaneParameter = new Qt3DRender::QParameter( u"nearPlane"_s, camera->nearPlane() );
43 mMaterial->addParameter( mNearPlaneParameter );
44 connect( camera, &Qt3DRender::QCamera::nearPlaneChanged, mNearPlaneParameter, [&]( float nearPlane ) {
45 mNearPlaneParameter->setValue( nearPlane );
46 } );
47 mProjMatrixParameter = new Qt3DRender::QParameter( u"origProjMatrix"_s, camera->projectionMatrix() );
48 mMaterial->addParameter( mProjMatrixParameter );
49 connect( camera, &Qt3DRender::QCamera::projectionMatrixChanged, mProjMatrixParameter, [&]( const QMatrix4x4 &projectionMatrix ) {
50 mProjMatrixParameter->setValue( projectionMatrix );
51 } );
52 mAspectRatioParameter = new Qt3DRender::QParameter( u"uAspectRatio"_s, camera->aspectRatio() );
53 mMaterial->addParameter( mAspectRatioParameter );
54 connect( camera, &Qt3DRender::QCamera::aspectRatioChanged, mAspectRatioParameter, [&]( float ratio ) {
55 mAspectRatioParameter->setValue( ratio );
56 } );
57 mTanHalfFovParameter = new Qt3DRender::QParameter( u"uTanHalfFov"_s, tan( camera->fieldOfView() / 2 * M_PI / 180 ) );
58 mMaterial->addParameter( mTanHalfFovParameter );
59 connect( camera, &Qt3DRender::QCamera::fieldOfViewChanged, mTanHalfFovParameter, [&]( float fov ) {
60 mTanHalfFovParameter->setValue( tan( fov / 2 * M_PI / 180 ) );
61 } );
62
63 QVariantList ssaoKernelValues;
64
65 std::uniform_real_distribution<float> randomFloats( 0.0, 1.0 ); // random floats between [0.0, 1.0]
66 std::default_random_engine generator;
67 unsigned int kernelSize = 64;
68 for ( unsigned int i = 0; i < kernelSize; ++i )
69 {
70 QVector3D sample(
71 randomFloats( generator ) * 2.0 - 1.0,
72 randomFloats( generator ) * 2.0 - 1.0,
73 randomFloats( generator ) * 2.0 - 1.0
74 );
75 sample.normalize();
76 float scale = static_cast<float>( i ) / static_cast<float>( kernelSize );
77 scale = 0.1 + 0.9 * scale * scale;
78 sample *= scale;
79 ssaoKernelValues.push_back( sample );
80 }
81
82 // 4x4 array of random rotation vectors
83 QVariantList ssaoNoise;
84 for ( unsigned int i = 0; i < 16; ++i )
85 {
86 QVector3D sample(
87 randomFloats( generator ),
88 randomFloats( generator ),
89 0.0
90 );
91 ssaoNoise.push_back( sample );
92 }
93 mAmbientOcclusionKernelParameter = new Qt3DRender::QParameter( u"ssaoKernel[0]"_s, ssaoKernelValues );
94 mMaterial->addParameter( mAmbientOcclusionKernelParameter );
95
96 Qt3DRender::QParameter *noiseParameter = new Qt3DRender::QParameter( u"ssaoNoise[0]"_s, ssaoNoise );
97 mMaterial->addParameter( noiseParameter );
98
99 mIntensityParameter = new Qt3DRender::QParameter( u"intensity"_s, 0.5f );
100 mMaterial->addParameter( mIntensityParameter );
101
102 mRadiusParameter = new Qt3DRender::QParameter( u"radius"_s, 25.0f );
103 mMaterial->addParameter( mRadiusParameter );
104
105 mThresholdParameter = new Qt3DRender::QParameter( u"threshold"_s, 0.5f );
106 mMaterial->addParameter( mThresholdParameter );
107
108 const QString vertexShaderPath = u"qrc:/shaders/ssao_factor_render.vert"_s;
109 const QString fragmentShaderPath = u"qrc:/shaders/ssao_factor_render.frag"_s;
110
111 mShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
112 mShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );
113}
114
116{
117 mIntensityParameter->setValue( intensity );
118}
119
121{
122 mRadiusParameter->setValue( radius );
123}
124
126{
127 mThresholdParameter->setValue( threshold );
128}
void setThreshold(float threshold)
Sets the amount of occlusion when the effects starts to kick in.
void setRadius(float radius)
Sets the radius for the ambient occlusion effect.
void setIntensity(float intensity)
Sets the intensity for the ambient occlusion effect.
QgsAmbientOcclusionRenderEntity(Qt3DRender::QTexture2D *depthTexture, Qt3DRender::QLayer *layer, Qt3DRender::QCamera *camera, QNode *parent=nullptr)
Constructor.
QgsRenderPassQuad(Qt3DRender::QLayer *layer, QNode *parent=nullptr)
Constructor.
Qt3DRender::QShaderProgram * mShader
Qt3DRender::QMaterial * mMaterial