summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2017-01-31 18:13:32 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-01-31 18:32:04 +0000
commit861e4d71e34c73e3bd5f550b02448df6fa6279ec (patch)
treeb110e7aedcae0602609b44a8e8c0d2281297ea89
parent1c6004383a2f26cc5ca8cacab49a3152414e110d (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.cpp25
-rw-r--r--src/extras/defaults/qskyboxentity.h5
-rw-r--r--src/extras/defaults/qskyboxentity_p.h1
-rw-r--r--src/extras/shaders/gl3/skybox.frag16
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);
}