34 mDepthTextureParameter =
new Qt3DRender::QParameter( u
"depthTexture"_s, depthTexture );
35 mMaterial->addParameter( mDepthTextureParameter );
37 mFarPlaneParameter =
new Qt3DRender::QParameter( u
"farPlane"_s, camera->farPlane() );
38 mMaterial->addParameter( mFarPlaneParameter );
39 connect( camera, &Qt3DRender::QCamera::farPlaneChanged, mFarPlaneParameter, [&](
float farPlane ) { mFarPlaneParameter->setValue( farPlane ); } );
40 mNearPlaneParameter =
new Qt3DRender::QParameter( u
"nearPlane"_s, camera->nearPlane() );
41 mMaterial->addParameter( mNearPlaneParameter );
42 connect( camera, &Qt3DRender::QCamera::nearPlaneChanged, mNearPlaneParameter, [&](
float nearPlane ) { mNearPlaneParameter->setValue( nearPlane ); } );
43 mProjMatrixParameter =
new Qt3DRender::QParameter( u
"origProjMatrix"_s, camera->projectionMatrix() );
44 mMaterial->addParameter( mProjMatrixParameter );
45 connect( camera, &Qt3DRender::QCamera::projectionMatrixChanged, mProjMatrixParameter, [&](
const QMatrix4x4 &projectionMatrix ) { mProjMatrixParameter->setValue( projectionMatrix ); } );
46 mAspectRatioParameter =
new Qt3DRender::QParameter( u
"uAspectRatio"_s, camera->aspectRatio() );
47 mMaterial->addParameter( mAspectRatioParameter );
48 connect( camera, &Qt3DRender::QCamera::aspectRatioChanged, mAspectRatioParameter, [&](
float ratio ) { mAspectRatioParameter->setValue( ratio ); } );
49 mTanHalfFovParameter =
new Qt3DRender::QParameter( u
"uTanHalfFov"_s, tan( camera->fieldOfView() / 2 * M_PI / 180 ) );
50 mMaterial->addParameter( mTanHalfFovParameter );
51 connect( camera, &Qt3DRender::QCamera::fieldOfViewChanged, mTanHalfFovParameter, [&](
float fov ) { mTanHalfFovParameter->setValue( tan( fov / 2 * M_PI / 180 ) ); } );
53 QVariantList ssaoKernelValues;
55 std::uniform_real_distribution<float> randomFloats( 0.0, 1.0 );
56 std::default_random_engine generator;
57 unsigned int kernelSize = 64;
58 for (
unsigned int i = 0; i < kernelSize; ++i )
60 QVector3D sample( randomFloats( generator ) * 2.0 - 1.0, randomFloats( generator ) * 2.0 - 1.0, randomFloats( generator ) * 2.0 - 1.0 );
62 float scale =
static_cast<float>( i ) /
static_cast<float>( kernelSize );
63 scale = 0.1 + 0.9 * scale * scale;
65 ssaoKernelValues.push_back( sample );
69 QVariantList ssaoNoise;
70 for (
unsigned int i = 0; i < 16; ++i )
72 QVector3D sample( randomFloats( generator ), randomFloats( generator ), 0.0 );
73 ssaoNoise.push_back( sample );
75 mAmbientOcclusionKernelParameter =
new Qt3DRender::QParameter( u
"ssaoKernel[0]"_s, ssaoKernelValues );
76 mMaterial->addParameter( mAmbientOcclusionKernelParameter );
78 Qt3DRender::QParameter *noiseParameter =
new Qt3DRender::QParameter( u
"ssaoNoise[0]"_s, ssaoNoise );
79 mMaterial->addParameter( noiseParameter );
81 mIntensityParameter =
new Qt3DRender::QParameter( u
"intensity"_s, 0.5f );
82 mMaterial->addParameter( mIntensityParameter );
84 mRadiusParameter =
new Qt3DRender::QParameter( u
"radius"_s, 25.0f );
85 mMaterial->addParameter( mRadiusParameter );
87 mThresholdParameter =
new Qt3DRender::QParameter( u
"threshold"_s, 0.5f );
88 mMaterial->addParameter( mThresholdParameter );
90 const QString vertexShaderPath = u
"qrc:/shaders/ssao_factor_render.vert"_s;
91 const QString fragmentShaderPath = u
"qrc:/shaders/ssao_factor_render.frag"_s;
93 mShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
94 mShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );