30 mDepthTextureParameter =
new Qt3DRender::QParameter( u
"depthTexture"_s, depthTexture );
31 mMaterial->addParameter( mDepthTextureParameter );
33 mFarPlaneParameter =
new Qt3DRender::QParameter( u
"farPlane"_s, camera->farPlane() );
34 mMaterial->addParameter( mFarPlaneParameter );
35 connect( camera, &Qt3DRender::QCamera::farPlaneChanged, mFarPlaneParameter, [&](
float farPlane ) {
36 mFarPlaneParameter->setValue( farPlane );
38 mNearPlaneParameter =
new Qt3DRender::QParameter( u
"nearPlane"_s, camera->nearPlane() );
39 mMaterial->addParameter( mNearPlaneParameter );
40 connect( camera, &Qt3DRender::QCamera::nearPlaneChanged, mNearPlaneParameter, [&](
float nearPlane ) {
41 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 ) {
46 mProjMatrixParameter->setValue( projectionMatrix );
48 mAspectRatioParameter =
new Qt3DRender::QParameter( u
"uAspectRatio"_s, camera->aspectRatio() );
49 mMaterial->addParameter( mAspectRatioParameter );
50 connect( camera, &Qt3DRender::QCamera::aspectRatioChanged, mAspectRatioParameter, [&](
float ratio ) {
51 mAspectRatioParameter->setValue( ratio );
53 mTanHalfFovParameter =
new Qt3DRender::QParameter( u
"uTanHalfFov"_s, tan( camera->fieldOfView() / 2 * M_PI / 180 ) );
54 mMaterial->addParameter( mTanHalfFovParameter );
55 connect( camera, &Qt3DRender::QCamera::fieldOfViewChanged, mTanHalfFovParameter, [&](
float fov ) {
56 mTanHalfFovParameter->setValue( tan( fov / 2 * M_PI / 180 ) );
59 QVariantList ssaoKernelValues;
61 std::uniform_real_distribution<float> randomFloats( 0.0, 1.0 );
62 std::default_random_engine generator;
63 unsigned int kernelSize = 64;
64 for (
unsigned int i = 0; i < kernelSize; ++i )
67 randomFloats( generator ) * 2.0 - 1.0,
68 randomFloats( generator ) * 2.0 - 1.0,
69 randomFloats( generator ) * 2.0 - 1.0
72 float scale =
static_cast<float>( i ) /
static_cast<float>( kernelSize );
73 scale = 0.1 + 0.9 * scale * scale;
75 ssaoKernelValues.push_back( sample );
79 QVariantList ssaoNoise;
80 for (
unsigned int i = 0; i < 16; ++i )
83 randomFloats( generator ),
84 randomFloats( generator ),
87 ssaoNoise.push_back( sample );
89 mAmbientOcclusionKernelParameter =
new Qt3DRender::QParameter( u
"ssaoKernel[0]"_s, ssaoKernelValues );
90 mMaterial->addParameter( mAmbientOcclusionKernelParameter );
92 Qt3DRender::QParameter *noiseParameter =
new Qt3DRender::QParameter( u
"ssaoNoise[0]"_s, ssaoNoise );
93 mMaterial->addParameter( noiseParameter );
95 mIntensityParameter =
new Qt3DRender::QParameter( u
"intensity"_s, 0.5f );
96 mMaterial->addParameter( mIntensityParameter );
98 mRadiusParameter =
new Qt3DRender::QParameter( u
"radius"_s, 25.0f );
99 mMaterial->addParameter( mRadiusParameter );
101 mThresholdParameter =
new Qt3DRender::QParameter( u
"threshold"_s, 0.5f );
102 mMaterial->addParameter( mThresholdParameter );
104 const QString vertexShaderPath = u
"qrc:/shaders/ssao_factor_render.vert"_s;
105 const QString fragmentShaderPath = u
"qrc:/shaders/ssao_factor_render.frag"_s;
107 mShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
108 mShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );