diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2017-01-31 18:13:32 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-01-31 18:32:04 +0000 |
commit | 861e4d71e34c73e3bd5f550b02448df6fa6279ec (patch) | |
tree | b110e7aedcae0602609b44a8e8c0d2281297ea89 | |
parent | 1c6004383a2f26cc5ca8cacab49a3152414e110d (diff) |
SkyboxEntity can gamma correct the fragments
This is an opt-in feature, required because dds file tend to need gamma
correction while png probably not.
Change-Id: I9f32d8f23110fb2fd6b11f33a20018907355e986
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/extras/defaults/qskyboxentity.cpp | 25 | ||||
-rw-r--r-- | src/extras/defaults/qskyboxentity.h | 5 | ||||
-rw-r--r-- | src/extras/defaults/qskyboxentity_p.h | 1 | ||||
-rw-r--r-- | src/extras/shaders/gl3/skybox.frag | 16 |
4 files changed, 46 insertions, 1 deletions
diff --git a/src/extras/defaults/qskyboxentity.cpp b/src/extras/defaults/qskyboxentity.cpp index 85899793c..f955cd5c5 100644 --- a/src/extras/defaults/qskyboxentity.cpp +++ b/src/extras/defaults/qskyboxentity.cpp @@ -76,6 +76,7 @@ QSkyboxEntityPrivate::QSkyboxEntityPrivate() , m_es2RenderPass(new QRenderPass()) , m_gl3RenderPass(new QRenderPass()) , m_mesh(new QCuboidMesh()) + , m_gammaStrengthParameter(new QParameter(QStringLiteral("gammaStrength"), 0.0f)) , m_textureParameter(new QParameter(QStringLiteral("skyboxTexture"), m_skyboxTexture)) , m_posXImage(new QTextureImage()) , m_posYImage(new QTextureImage()) @@ -145,6 +146,7 @@ void QSkyboxEntityPrivate::init() m_effect->addTechnique(m_es2Technique); m_material->setEffect(m_effect); + m_material->addParameter(m_gammaStrengthParameter); m_material->addParameter(m_textureParameter); m_mesh->setXYMeshResolution(QSize(2, 2)); @@ -280,6 +282,29 @@ QString QSkyboxEntity::extension() const return d->m_extension; } +/*! + * Sets the gamma correction enable state to \a enabled. + * \since 5.9 + */ +void QSkyboxEntity::setGammaCorrectEnabled(bool enabled) +{ + Q_D(QSkyboxEntity); + if (enabled != isGammaCorrectEnabled()) { + d->m_gammaStrengthParameter->setValue(enabled ? 1.0f : 0.0f); + emit gammaCorrectEnabledChanged(enabled); + } +} + +/*! + * Indicates if gamma correction is enabled for this skybox. + * \since 5.9 + */ +bool QSkyboxEntity::isGammaCorrectEnabled() const +{ + Q_D(const QSkyboxEntity); + return !qFuzzyIsNull(d->m_gammaStrengthParameter->value().toFloat()); +} + } // namespace Qt3DExtras QT_END_NAMESPACE diff --git a/src/extras/defaults/qskyboxentity.h b/src/extras/defaults/qskyboxentity.h index ca5cab6f2..cc01ff7bb 100644 --- a/src/extras/defaults/qskyboxentity.h +++ b/src/extras/defaults/qskyboxentity.h @@ -54,6 +54,7 @@ class QT3DEXTRASSHARED_EXPORT QSkyboxEntity : public Qt3DCore::QEntity Q_OBJECT Q_PROPERTY(QString baseName READ baseName WRITE setBaseName NOTIFY baseNameChanged) Q_PROPERTY(QString extension READ extension WRITE setExtension NOTIFY extensionChanged) + Q_PROPERTY(bool gammaCorrect READ isGammaCorrectEnabled WRITE setGammaCorrectEnabled NOTIFY gammaCorrectEnabledChanged) public: explicit QSkyboxEntity(Qt3DCore::QNode *parent = nullptr); ~QSkyboxEntity(); @@ -64,9 +65,13 @@ public: void setExtension(const QString &extension); QString extension() const; + void setGammaCorrectEnabled(bool enabled); + bool isGammaCorrectEnabled() const; + Q_SIGNALS: void baseNameChanged(const QString &path); void extensionChanged(const QString &extension); + void gammaCorrectEnabledChanged(bool enabled); private: Q_DECLARE_PRIVATE(QSkyboxEntity) diff --git a/src/extras/defaults/qskyboxentity_p.h b/src/extras/defaults/qskyboxentity_p.h index 795d59ab2..ebf89bdbc 100644 --- a/src/extras/defaults/qskyboxentity_p.h +++ b/src/extras/defaults/qskyboxentity_p.h @@ -99,6 +99,7 @@ class QSkyboxEntityPrivate : public Qt3DCore::QEntityPrivate Qt3DRender::QRenderPass *m_es2RenderPass; Qt3DRender::QRenderPass *m_gl3RenderPass; QCuboidMesh *m_mesh; + Qt3DRender::QParameter *m_gammaStrengthParameter; Qt3DRender::QParameter *m_textureParameter; Qt3DRender::QTextureImage *m_posXImage; Qt3DRender:: QTextureImage *m_posYImage; diff --git a/src/extras/shaders/gl3/skybox.frag b/src/extras/shaders/gl3/skybox.frag index 99c8f111b..931e20343 100644 --- a/src/extras/shaders/gl3/skybox.frag +++ b/src/extras/shaders/gl3/skybox.frag @@ -4,7 +4,21 @@ in vec3 texCoord0; out vec4 fragColor; uniform samplerCube skyboxTexture; +// Gamma correction +uniform float gamma = 2.2; + +uniform float gammaStrength; + +vec3 gammaCorrect(const in vec3 color) +{ + return pow(color, vec3(1.0 / gamma)); +} + void main() { - fragColor = texture(skyboxTexture, texCoord0); + vec4 baseColor = texture(skyboxTexture, texCoord0); + vec4 gammaColor = vec4(gammaCorrect(baseColor.rgb), 1.0); + // This is an odd way to enable or not gamma correction, + // but this is a way to avoid branching until we can generate shaders + fragColor = mix(baseColor, gammaColor, gammaStrength); } |