27 mDepthTextureParameter =
new Qt3DRender::QParameter( QStringLiteral(
"depthTexture" ), depthTexture );
28 mMaterial->addParameter( mDepthTextureParameter );
30 mFarPlaneParameter =
new Qt3DRender::QParameter( QStringLiteral(
"farPlane" ), camera->farPlane() );
31 mMaterial->addParameter( mFarPlaneParameter );
32 connect( camera, &Qt3DRender::QCamera::farPlaneChanged, mFarPlaneParameter, [&](
float farPlane ) {
33 mFarPlaneParameter->setValue( farPlane );
35 mNearPlaneParameter =
new Qt3DRender::QParameter( QStringLiteral(
"nearPlane" ), camera->nearPlane() );
36 mMaterial->addParameter( mNearPlaneParameter );
37 connect( camera, &Qt3DRender::QCamera::nearPlaneChanged, mNearPlaneParameter, [&](
float nearPlane ) {
38 mNearPlaneParameter->setValue( nearPlane );
40 mProjMatrixParameter =
new Qt3DRender::QParameter( QStringLiteral(
"origProjMatrix" ), camera->projectionMatrix() );
41 mMaterial->addParameter( mProjMatrixParameter );
42 connect( camera, &Qt3DRender::QCamera::projectionMatrixChanged, mProjMatrixParameter, [&](
const QMatrix4x4 &projectionMatrix ) {
43 mProjMatrixParameter->setValue( projectionMatrix );
45 mAspectRatioParameter =
new Qt3DRender::QParameter( QStringLiteral(
"uAspectRatio" ), camera->aspectRatio() );
46 mMaterial->addParameter( mAspectRatioParameter );
47 connect( camera, &Qt3DRender::QCamera::aspectRatioChanged, mAspectRatioParameter, [&](
float ratio ) {
48 mAspectRatioParameter->setValue( ratio );
50 mTanHalfFovParameter =
new Qt3DRender::QParameter( QStringLiteral(
"uTanHalfFov" ), tan( camera->fieldOfView() / 2 * M_PI / 180 ) );
51 mMaterial->addParameter( mTanHalfFovParameter );
52 connect( camera, &Qt3DRender::QCamera::fieldOfViewChanged, mTanHalfFovParameter, [&](
float fov ) {
53 mTanHalfFovParameter->setValue( tan( fov / 2 * M_PI / 180 ) );
56 QVariantList ssaoKernelValues;
58 std::uniform_real_distribution<float> randomFloats( 0.0, 1.0 );
59 std::default_random_engine generator;
60 unsigned int kernelSize = 64;
61 for (
unsigned int i = 0; i < kernelSize; ++i )
64 randomFloats( generator ) * 2.0 - 1.0,
65 randomFloats( generator ) * 2.0 - 1.0,
66 randomFloats( generator ) * 2.0 - 1.0
69 float scale =
static_cast<float>( i ) /
static_cast<float>( kernelSize );
70 scale = 0.1 + 0.9 * scale * scale;
72 ssaoKernelValues.push_back( sample );
76 QVariantList ssaoNoise;
77 for (
unsigned int i = 0; i < 16; ++i )
80 randomFloats( generator ),
81 randomFloats( generator ),
84 ssaoNoise.push_back( sample );
86 mAmbientOcclusionKernelParameter =
new Qt3DRender::QParameter( QStringLiteral(
"ssaoKernel[0]" ), ssaoKernelValues );
87 mMaterial->addParameter( mAmbientOcclusionKernelParameter );
89 Qt3DRender::QParameter *noiseParameter =
new Qt3DRender::QParameter( QStringLiteral(
"ssaoNoise[0]" ), ssaoNoise );
90 mMaterial->addParameter( noiseParameter );
92 mIntensityParameter =
new Qt3DRender::QParameter( QStringLiteral(
"intensity" ), 0.5f );
93 mMaterial->addParameter( mIntensityParameter );
95 mRadiusParameter =
new Qt3DRender::QParameter( QStringLiteral(
"radius" ), 25.0f );
96 mMaterial->addParameter( mRadiusParameter );
98 mThresholdParameter =
new Qt3DRender::QParameter( QStringLiteral(
"threshold" ), 0.5f );
99 mMaterial->addParameter( mThresholdParameter );
101 const QString vertexShaderPath = QStringLiteral(
"qrc:/shaders/ssao_factor_render.vert" );
102 const QString fragmentShaderPath = QStringLiteral(
"qrc:/shaders/ssao_factor_render.frag" );
104 mShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
105 mShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );