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 ) {
40 mFarPlaneParameter->setValue( farPlane );
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 );
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 );
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 );
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 ) );
63 QVariantList ssaoKernelValues;
65 std::uniform_real_distribution<float> randomFloats( 0.0, 1.0 );
66 std::default_random_engine generator;
67 unsigned int kernelSize = 64;
68 for (
unsigned int i = 0; i < kernelSize; ++i )
71 randomFloats( generator ) * 2.0 - 1.0,
72 randomFloats( generator ) * 2.0 - 1.0,
73 randomFloats( generator ) * 2.0 - 1.0
76 float scale =
static_cast<float>( i ) /
static_cast<float>( kernelSize );
77 scale = 0.1 + 0.9 * scale * scale;
79 ssaoKernelValues.push_back( sample );
83 QVariantList ssaoNoise;
84 for (
unsigned int i = 0; i < 16; ++i )
87 randomFloats( generator ),
88 randomFloats( generator ),
91 ssaoNoise.push_back( sample );
93 mAmbientOcclusionKernelParameter =
new Qt3DRender::QParameter( u
"ssaoKernel[0]"_s, ssaoKernelValues );
94 mMaterial->addParameter( mAmbientOcclusionKernelParameter );
96 Qt3DRender::QParameter *noiseParameter =
new Qt3DRender::QParameter( u
"ssaoNoise[0]"_s, ssaoNoise );
97 mMaterial->addParameter( noiseParameter );
99 mIntensityParameter =
new Qt3DRender::QParameter( u
"intensity"_s, 0.5f );
100 mMaterial->addParameter( mIntensityParameter );
102 mRadiusParameter =
new Qt3DRender::QParameter( u
"radius"_s, 25.0f );
103 mMaterial->addParameter( mRadiusParameter );
105 mThresholdParameter =
new Qt3DRender::QParameter( u
"threshold"_s, 0.5f );
106 mMaterial->addParameter( mThresholdParameter );
108 const QString vertexShaderPath = u
"qrc:/shaders/ssao_factor_render.vert"_s;
109 const QString fragmentShaderPath = u
"qrc:/shaders/ssao_factor_render.frag"_s;
111 mShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
112 mShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );