summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2021-02-02 09:55:32 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-02-24 15:29:15 +0000
commit034a0a3711b0023d0b361371e6247039440cc032 (patch)
tree87bec44fcd093a1148f3df72543bc9cb0f34c5f7
parentae8eaacef209cac796362102ba2d6b8f62074a6a (diff)
Fix QMetalRoughMaterial on RHI
Was still using the removed default.vert shader which was replaced by a combination of vertex shaders depending on the needed inputs. Change-Id: I5f4ba6fae6d5af317d6a00d9f4d484e817ca84a9 Reviewed-by: Mike Krus <mike.krus@kdab.com> (cherry picked from commit 516a6c980f5e35ab0ec036be96ee00617c0de485) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/extras/defaults/qmetalroughmaterial.cpp56
-rw-r--r--src/extras/defaults/qmetalroughmaterial_p.h2
2 files changed, 42 insertions, 16 deletions
diff --git a/src/extras/defaults/qmetalroughmaterial.cpp b/src/extras/defaults/qmetalroughmaterial.cpp
index 78e544ead..79ff94337 100644
--- a/src/extras/defaults/qmetalroughmaterial.cpp
+++ b/src/extras/defaults/qmetalroughmaterial.cpp
@@ -124,7 +124,7 @@ void QMetalRoughMaterialPrivate::init()
QStringLiteral("ambientOcclusion"),
QStringLiteral("normal")});
- m_metalRoughRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_metalRoughRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default_pos_norm.vert"))));
m_metalRoughRHIShaderBuilder->setParent(q);
m_metalRoughRHIShaderBuilder->setShaderProgram(m_metalRoughRHIShader);
m_metalRoughRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/metalrough.frag.json")));
@@ -185,6 +185,40 @@ void QMetalRoughMaterialPrivate::handleTextureScaleChanged(const QVariant &var)
emit q->textureScaleChanged(var.toFloat());
}
+void QMetalRoughMaterialPrivate::updateLayersOnTechnique(const QStringList &layers)
+{
+ m_metalRoughGL3ShaderBuilder->setEnabledLayers(layers);
+ m_metalRoughES3ShaderBuilder->setEnabledLayers(layers);
+ m_metalRoughRHIShaderBuilder->setEnabledLayers(layers);
+ updateVertexShaderBasedOnLayers(layers);
+}
+
+void QMetalRoughMaterialPrivate::updateVertexShaderBasedOnLayers(const QStringList &layers)
+{
+ const QString mapsLayers[] = {
+ QStringLiteral("baseColorMap"),
+ QStringLiteral("metalnessMap"),
+ QStringLiteral("roughnessMap"),
+ QStringLiteral("ambientOcclusionMap"),
+ QStringLiteral("normalMap")
+ };
+
+ const bool needsTexCoords = std::any_of(std::cbegin(mapsLayers),
+ std::cend(mapsLayers),
+ [&] (const QString &mapLayers) { return layers.contains(mapLayers); });
+ const bool needsTangents = layers.contains(QStringLiteral("normalMap"));
+
+ QString vertexShader = QLatin1String("default_pos_norm");
+
+ if (needsTexCoords)
+ vertexShader += QLatin1String("_tex");
+ if (needsTangents)
+ vertexShader += QLatin1String("_tan");
+
+ m_metalRoughRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QLatin1String("qrc:/shaders/rhi/%1.vert").arg(vertexShader))));
+}
+
+
/*!
\class Qt3DExtras::QMetalRoughMaterial
\ingroup qt3d-extras-materials
@@ -375,9 +409,7 @@ void QMetalRoughMaterial::setBaseColor(const QVariant &baseColor)
d->m_metalRoughEffect->removeParameter(d->m_baseColorMapParameter);
d->m_metalRoughEffect->addParameter(d->m_baseColorParameter);
}
- d->m_metalRoughGL3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughES3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughRHIShaderBuilder->setEnabledLayers(layers);
+ d->updateLayersOnTechnique(layers);
}
void QMetalRoughMaterial::setMetalness(const QVariant &metalness)
@@ -400,9 +432,7 @@ void QMetalRoughMaterial::setMetalness(const QVariant &metalness)
d->m_metalRoughEffect->removeParameter(d->m_metalnessMapParameter);
d->m_metalRoughEffect->addParameter(d->m_metalnessParameter);
}
- d->m_metalRoughGL3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughES3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughRHIShaderBuilder->setEnabledLayers(layers);
+ d->updateLayersOnTechnique(layers);
}
void QMetalRoughMaterial::setRoughness(const QVariant &roughness)
@@ -425,9 +455,7 @@ void QMetalRoughMaterial::setRoughness(const QVariant &roughness)
d->m_metalRoughEffect->removeParameter(d->m_roughnessMapParameter);
d->m_metalRoughEffect->addParameter(d->m_roughnessParameter);
}
- d->m_metalRoughGL3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughES3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughRHIShaderBuilder->setEnabledLayers(layers);
+ d->updateLayersOnTechnique(layers);
}
void QMetalRoughMaterial::setAmbientOcclusion(const QVariant &ambientOcclusion)
@@ -446,9 +474,7 @@ void QMetalRoughMaterial::setAmbientOcclusion(const QVariant &ambientOcclusion)
if (d->m_metalRoughEffect->parameters().contains(d->m_ambientOcclusionMapParameter))
d->m_metalRoughEffect->removeParameter(d->m_ambientOcclusionMapParameter);
}
- d->m_metalRoughGL3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughES3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughRHIShaderBuilder->setEnabledLayers(layers);
+ d->updateLayersOnTechnique(layers);
}
void QMetalRoughMaterial::setNormal(const QVariant &normal)
@@ -467,9 +493,7 @@ void QMetalRoughMaterial::setNormal(const QVariant &normal)
if (d->m_metalRoughEffect->parameters().contains(d->m_normalMapParameter))
d->m_metalRoughEffect->removeParameter(d->m_normalMapParameter);
}
- d->m_metalRoughGL3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughES3ShaderBuilder->setEnabledLayers(layers);
- d->m_metalRoughRHIShaderBuilder->setEnabledLayers(layers);
+ d->updateLayersOnTechnique(layers);
}
void QMetalRoughMaterial::setTextureScale(float textureScale)
diff --git a/src/extras/defaults/qmetalroughmaterial_p.h b/src/extras/defaults/qmetalroughmaterial_p.h
index 15a869ff1..931b6d8ce 100644
--- a/src/extras/defaults/qmetalroughmaterial_p.h
+++ b/src/extras/defaults/qmetalroughmaterial_p.h
@@ -80,6 +80,8 @@ public:
void init();
void handleTextureScaleChanged(const QVariant &var);
+ void updateLayersOnTechnique(const QStringList &layers);
+ void updateVertexShaderBasedOnLayers(const QStringList &layers);
Qt3DRender::QParameter *m_baseColorParameter;
Qt3DRender::QParameter *m_metalnessParameter;