summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/qt3d/simple-cpp/main.cpp1
-rw-r--r--src/extras/defaults/qdiffusemapmaterial.cpp20
-rw-r--r--src/extras/defaults/qdiffusemapmaterial_p.h4
-rw-r--r--src/extras/defaults/qdiffusespecularmapmaterial.cpp20
-rw-r--r--src/extras/defaults/qdiffusespecularmapmaterial_p.h4
-rw-r--r--src/extras/defaults/qdiffusespecularmaterial.cpp24
-rw-r--r--src/extras/defaults/qdiffusespecularmaterial_p.h4
-rw-r--r--src/extras/defaults/qgoochmaterial.cpp14
-rw-r--r--src/extras/defaults/qgoochmaterial_p.h3
-rw-r--r--src/extras/defaults/qmetalroughmaterial.cpp23
-rw-r--r--src/extras/defaults/qmetalroughmaterial_p.h4
-rw-r--r--src/extras/defaults/qmorphphongmaterial.cpp21
-rw-r--r--src/extras/defaults/qmorphphongmaterial_p.h4
-rw-r--r--src/extras/defaults/qnormaldiffusemapalphamaterial.cpp19
-rw-r--r--src/extras/defaults/qnormaldiffusemapmaterial.cpp20
-rw-r--r--src/extras/defaults/qnormaldiffusemapmaterial_p.h4
-rw-r--r--src/extras/defaults/qnormaldiffusespecularmapmaterial.cpp20
-rw-r--r--src/extras/defaults/qnormaldiffusespecularmapmaterial_p.h4
-rw-r--r--src/extras/defaults/qpervertexcolormaterial.cpp13
-rw-r--r--src/extras/defaults/qpervertexcolormaterial_p.h3
-rw-r--r--src/extras/defaults/qphongalphamaterial.cpp24
-rw-r--r--src/extras/defaults/qphongalphamaterial_p.h4
-rw-r--r--src/extras/defaults/qphongmaterial.cpp20
-rw-r--r--src/extras/defaults/qphongmaterial_p.h4
-rw-r--r--src/extras/defaults/qt3dwindow.cpp1
-rw-r--r--src/extras/extras.qrc1
-rw-r--r--src/extras/shaders/rhi/default.vert55
-rw-r--r--src/extras/shaders/rhi/defaultuniforms.inc30
-rw-r--r--src/extras/shaders/rhi/distancefieldtext.frag20
-rw-r--r--src/extras/shaders/rhi/distancefieldtext.vert21
-rw-r--r--src/extras/shaders/rhi/gooch.frag84
-rw-r--r--src/extras/shaders/rhi/gooch.vert22
-rw-r--r--src/extras/shaders/rhi/light.inc.frag16
-rw-r--r--src/extras/shaders/rhi/metalrough.inc.frag5
-rw-r--r--src/extras/shaders/rhi/morphphong.vert31
-rw-r--r--src/extras/shaders/rhi/pervertexcolor.frag147
-rw-r--r--src/extras/shaders/rhi/pervertexcolor.vert26
-rw-r--r--src/extras/shaders/rhi/skybox.frag32
-rw-r--r--src/extras/shaders/rhi/skybox.vert35
-rw-r--r--src/extras/shaders/rhi/unlittexture.frag10
-rw-r--r--src/extras/shaders/rhi/unlittexture.vert43
-rw-r--r--src/plugins/renderers/rhi/graphicshelpers/submissioncontext.cpp8
-rw-r--r--src/plugins/renderers/rhi/managers/rhihandle_types_p.h4
-rw-r--r--src/plugins/renderers/rhi/renderer/rendercommand_p.h5
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.cpp145
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer_p.h1
-rw-r--r--src/plugins/renderers/rhi/renderer/renderview.cpp21
-rw-r--r--src/plugins/renderers/rhi/renderer/rhigraphicspipeline.cpp3
-rw-r--r--src/render/materialsystem/prototypes/default.json122
-rw-r--r--src/render/materialsystem/shaderbuilder.cpp2
-rw-r--r--tests/manual/rhi/main.cpp2
51 files changed, 994 insertions, 179 deletions
diff --git a/examples/qt3d/simple-cpp/main.cpp b/examples/qt3d/simple-cpp/main.cpp
index 32f19c194..ac4f74e00 100644
--- a/examples/qt3d/simple-cpp/main.cpp
+++ b/examples/qt3d/simple-cpp/main.cpp
@@ -99,6 +99,7 @@ Qt3DCore::QEntity *createScene()
Qt3DCore::QEntity *sphereEntity = new Qt3DCore::QEntity(rootEntity);
Qt3DExtras::QSphereMesh *sphereMesh = new Qt3DExtras::QSphereMesh;
sphereMesh->setRadius(3);
+ sphereMesh->setGenerateTangents(true);
Qt3DCore::QTransform *sphereTransform = new Qt3DCore::QTransform;
OrbitTransformController *controller = new OrbitTransformController(sphereTransform);
diff --git a/src/extras/defaults/qdiffusemapmaterial.cpp b/src/extras/defaults/qdiffusemapmaterial.cpp
index 83eec26a8..95ab7e9ac 100644
--- a/src/extras/defaults/qdiffusemapmaterial.cpp
+++ b/src/extras/defaults/qdiffusemapmaterial.cpp
@@ -72,13 +72,17 @@ QDiffuseMapMaterialPrivate::QDiffuseMapMaterialPrivate()
, m_diffuseMapGL3Technique(new QTechnique())
, m_diffuseMapGL2Technique(new QTechnique())
, m_diffuseMapES2Technique(new QTechnique())
+ , m_diffuseMapRHITechnique(new QTechnique())
, m_diffuseMapGL3RenderPass(new QRenderPass())
, m_diffuseMapGL2RenderPass(new QRenderPass())
, m_diffuseMapES2RenderPass(new QRenderPass())
+ , m_diffuseMapRHIRenderPass(new QRenderPass())
, m_diffuseMapGL3Shader(new QShaderProgram())
, m_diffuseMapGL3ShaderBuilder(new QShaderProgramBuilder())
, m_diffuseMapGL2ES2Shader(new QShaderProgram())
, m_diffuseMapGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_diffuseMapRHIShader(new QShaderProgram())
+ , m_diffuseMapRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
m_diffuseTexture->setMagnificationFilter(QAbstractTexture::Linear);
@@ -119,6 +123,14 @@ void QDiffuseMapMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normal")});
+ m_diffuseMapRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_diffuseMapRHIShaderBuilder->setParent(q);
+ m_diffuseMapRHIShaderBuilder->setShaderProgram(m_diffuseMapRHIShader);
+ m_diffuseMapRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_diffuseMapRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuseTexture"),
+ QStringLiteral("specular"),
+ QStringLiteral("normal")});
+
m_diffuseMapGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_diffuseMapGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_diffuseMapGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -134,6 +146,10 @@ void QDiffuseMapMaterialPrivate::init()
m_diffuseMapES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_diffuseMapES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_diffuseMapRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_diffuseMapRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_diffuseMapRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -141,18 +157,22 @@ void QDiffuseMapMaterialPrivate::init()
m_diffuseMapGL3Technique->addFilterKey(m_filterKey);
m_diffuseMapGL2Technique->addFilterKey(m_filterKey);
m_diffuseMapES2Technique->addFilterKey(m_filterKey);
+ m_diffuseMapRHITechnique->addFilterKey(m_filterKey);
m_diffuseMapGL3RenderPass->setShaderProgram(m_diffuseMapGL3Shader);
m_diffuseMapGL2RenderPass->setShaderProgram(m_diffuseMapGL2ES2Shader);
m_diffuseMapES2RenderPass->setShaderProgram(m_diffuseMapGL2ES2Shader);
+ m_diffuseMapRHIRenderPass->setShaderProgram(m_diffuseMapRHIShader);
m_diffuseMapGL3Technique->addRenderPass(m_diffuseMapGL3RenderPass);
m_diffuseMapGL2Technique->addRenderPass(m_diffuseMapGL2RenderPass);
m_diffuseMapES2Technique->addRenderPass(m_diffuseMapES2RenderPass);
+ m_diffuseMapRHITechnique->addRenderPass(m_diffuseMapRHIRenderPass);
m_diffuseMapEffect->addTechnique(m_diffuseMapGL3Technique);
m_diffuseMapEffect->addTechnique(m_diffuseMapGL2Technique);
m_diffuseMapEffect->addTechnique(m_diffuseMapES2Technique);
+ m_diffuseMapEffect->addTechnique(m_diffuseMapRHITechnique);
m_diffuseMapEffect->addParameter(m_ambientParameter);
m_diffuseMapEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qdiffusemapmaterial_p.h b/src/extras/defaults/qdiffusemapmaterial_p.h
index cef75a3f0..d83e8bff0 100644
--- a/src/extras/defaults/qdiffusemapmaterial_p.h
+++ b/src/extras/defaults/qdiffusemapmaterial_p.h
@@ -94,13 +94,17 @@ class QDiffuseMapMaterialPrivate : public Qt3DRender::QMaterialPrivate
Qt3DRender::QTechnique *m_diffuseMapGL3Technique;
Qt3DRender::QTechnique *m_diffuseMapGL2Technique;
Qt3DRender::QTechnique *m_diffuseMapES2Technique;
+ Qt3DRender::QTechnique *m_diffuseMapRHITechnique;
Qt3DRender::QRenderPass *m_diffuseMapGL3RenderPass;
Qt3DRender::QRenderPass *m_diffuseMapGL2RenderPass;
Qt3DRender::QRenderPass *m_diffuseMapES2RenderPass;
+ Qt3DRender::QRenderPass *m_diffuseMapRHIRenderPass;
Qt3DRender::QShaderProgram *m_diffuseMapGL3Shader;
Qt3DRender::QShaderProgramBuilder *m_diffuseMapGL3ShaderBuilder;
Qt3DRender::QShaderProgram *m_diffuseMapGL2ES2Shader;
Qt3DRender::QShaderProgramBuilder *m_diffuseMapGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_diffuseMapRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_diffuseMapRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QDiffuseMapMaterial)
diff --git a/src/extras/defaults/qdiffusespecularmapmaterial.cpp b/src/extras/defaults/qdiffusespecularmapmaterial.cpp
index 9a1092fbc..15dcb36bf 100644
--- a/src/extras/defaults/qdiffusespecularmapmaterial.cpp
+++ b/src/extras/defaults/qdiffusespecularmapmaterial.cpp
@@ -73,13 +73,17 @@ QDiffuseSpecularMapMaterialPrivate::QDiffuseSpecularMapMaterialPrivate()
, m_diffuseSpecularMapGL3Technique(new QTechnique())
, m_diffuseSpecularMapGL2Technique(new QTechnique())
, m_diffuseSpecularMapES2Technique(new QTechnique())
+ , m_diffuseSpecularMapRHITechnique(new QTechnique())
, m_diffuseSpecularMapGL3RenderPass(new QRenderPass())
, m_diffuseSpecularMapGL2RenderPass(new QRenderPass())
, m_diffuseSpecularMapES2RenderPass(new QRenderPass())
+ , m_diffuseSpecularMapRHIRenderPass(new QRenderPass())
, m_diffuseSpecularMapGL3Shader(new QShaderProgram())
, m_diffuseSpecularMapGL3ShaderBuilder(new QShaderProgramBuilder())
, m_diffuseSpecularMapGL2ES2Shader(new QShaderProgram())
, m_diffuseSpecularMapGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_diffuseSpecularMapRHIShader(new QShaderProgram())
+ , m_diffuseSpecularMapRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
m_diffuseTexture->setMagnificationFilter(QAbstractTexture::Linear);
@@ -126,6 +130,14 @@ void QDiffuseSpecularMapMaterialPrivate::init()
QStringLiteral("specularTexture"),
QStringLiteral("normal")});
+ m_diffuseSpecularMapRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_diffuseSpecularMapRHIShaderBuilder->setParent(q);
+ m_diffuseSpecularMapRHIShaderBuilder->setShaderProgram(m_diffuseSpecularMapRHIShader);
+ m_diffuseSpecularMapRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_diffuseSpecularMapRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuseTexture"),
+ QStringLiteral("specularTexture"),
+ QStringLiteral("normal")});
+
m_diffuseSpecularMapGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_diffuseSpecularMapGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_diffuseSpecularMapGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -141,6 +153,10 @@ void QDiffuseSpecularMapMaterialPrivate::init()
m_diffuseSpecularMapES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_diffuseSpecularMapES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_diffuseSpecularMapRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_diffuseSpecularMapRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_diffuseSpecularMapRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -148,18 +164,22 @@ void QDiffuseSpecularMapMaterialPrivate::init()
m_diffuseSpecularMapGL3Technique->addFilterKey(m_filterKey);
m_diffuseSpecularMapGL2Technique->addFilterKey(m_filterKey);
m_diffuseSpecularMapES2Technique->addFilterKey(m_filterKey);
+ m_diffuseSpecularMapRHITechnique->addFilterKey(m_filterKey);
m_diffuseSpecularMapGL3RenderPass->setShaderProgram(m_diffuseSpecularMapGL3Shader);
m_diffuseSpecularMapGL2RenderPass->setShaderProgram(m_diffuseSpecularMapGL2ES2Shader);
m_diffuseSpecularMapES2RenderPass->setShaderProgram(m_diffuseSpecularMapGL2ES2Shader);
+ m_diffuseSpecularMapRHIRenderPass->setShaderProgram(m_diffuseSpecularMapRHIShader);
m_diffuseSpecularMapGL3Technique->addRenderPass(m_diffuseSpecularMapGL3RenderPass);
m_diffuseSpecularMapGL2Technique->addRenderPass(m_diffuseSpecularMapGL2RenderPass);
m_diffuseSpecularMapES2Technique->addRenderPass(m_diffuseSpecularMapES2RenderPass);
+ m_diffuseSpecularMapRHITechnique->addRenderPass(m_diffuseSpecularMapRHIRenderPass);
m_diffuseSpecularMapEffect->addTechnique(m_diffuseSpecularMapGL3Technique);
m_diffuseSpecularMapEffect->addTechnique(m_diffuseSpecularMapGL2Technique);
m_diffuseSpecularMapEffect->addTechnique(m_diffuseSpecularMapES2Technique);
+ m_diffuseSpecularMapEffect->addTechnique(m_diffuseSpecularMapRHITechnique);
m_diffuseSpecularMapEffect->addParameter(m_ambientParameter);
m_diffuseSpecularMapEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qdiffusespecularmapmaterial_p.h b/src/extras/defaults/qdiffusespecularmapmaterial_p.h
index f80922dff..021836c14 100644
--- a/src/extras/defaults/qdiffusespecularmapmaterial_p.h
+++ b/src/extras/defaults/qdiffusespecularmapmaterial_p.h
@@ -96,13 +96,17 @@ public:
Qt3DRender::QTechnique *m_diffuseSpecularMapGL3Technique;
Qt3DRender::QTechnique *m_diffuseSpecularMapGL2Technique;
Qt3DRender::QTechnique *m_diffuseSpecularMapES2Technique;
+ Qt3DRender::QTechnique *m_diffuseSpecularMapRHITechnique;
Qt3DRender::QRenderPass *m_diffuseSpecularMapGL3RenderPass;
Qt3DRender::QRenderPass *m_diffuseSpecularMapGL2RenderPass;
Qt3DRender::QRenderPass *m_diffuseSpecularMapES2RenderPass;
+ Qt3DRender::QRenderPass *m_diffuseSpecularMapRHIRenderPass;
Qt3DRender::QShaderProgram *m_diffuseSpecularMapGL3Shader;
Qt3DRender::QShaderProgramBuilder *m_diffuseSpecularMapGL3ShaderBuilder;
Qt3DRender::QShaderProgram *m_diffuseSpecularMapGL2ES2Shader;
Qt3DRender::QShaderProgramBuilder *m_diffuseSpecularMapGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_diffuseSpecularMapRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_diffuseSpecularMapRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QDiffuseSpecularMapMaterial)
diff --git a/src/extras/defaults/qdiffusespecularmaterial.cpp b/src/extras/defaults/qdiffusespecularmaterial.cpp
index 8938ce19a..2cb4c137c 100644
--- a/src/extras/defaults/qdiffusespecularmaterial.cpp
+++ b/src/extras/defaults/qdiffusespecularmaterial.cpp
@@ -78,13 +78,17 @@ QDiffuseSpecularMaterialPrivate::QDiffuseSpecularMaterialPrivate()
, m_gl3Technique(new QTechnique())
, m_gl2Technique(new QTechnique())
, m_es2Technique(new QTechnique())
+ , m_rhiTechnique(new QTechnique())
, m_gl3RenderPass(new QRenderPass())
, m_gl2RenderPass(new QRenderPass())
, m_es2RenderPass(new QRenderPass())
+ , m_rhiRenderPass(new QRenderPass())
, m_gl3Shader(new QShaderProgram())
, m_gl3ShaderBuilder(new QShaderProgramBuilder())
, m_gl2es2Shader(new QShaderProgram())
, m_gl2es2ShaderBuilder(new QShaderProgramBuilder())
+ , m_rhiShader(new QShaderProgram())
+ , m_rhiShaderBuilder(new QShaderProgramBuilder())
, m_noDepthMask(new QNoDepthMask())
, m_blendState(new QBlendEquationArguments())
, m_blendEquation(new QBlendEquation())
@@ -127,6 +131,14 @@ void QDiffuseSpecularMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normal")});
+ m_rhiShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_rhiShaderBuilder->setParent(q);
+ m_rhiShaderBuilder->setShaderProgram(m_rhiShader);
+ m_rhiShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_rhiShaderBuilder->setEnabledLayers({QStringLiteral("diffuse"),
+ QStringLiteral("specular"),
+ QStringLiteral("normal")});
+
m_gl3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_gl3Technique->graphicsApiFilter()->setMajorVersion(3);
@@ -143,6 +155,10 @@ void QDiffuseSpecularMaterialPrivate::init()
m_es2Technique->graphicsApiFilter()->setMinorVersion(0);
m_es2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_rhiTechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_rhiTechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_rhiTechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_noDepthMask->setEnabled(false);
m_blendState->setEnabled(false);
m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
@@ -153,6 +169,7 @@ void QDiffuseSpecularMaterialPrivate::init()
m_gl3RenderPass->setShaderProgram(m_gl3Shader);
m_gl2RenderPass->setShaderProgram(m_gl2es2Shader);
m_es2RenderPass->setShaderProgram(m_gl2es2Shader);
+ m_rhiRenderPass->setShaderProgram(m_rhiShader);
m_gl3RenderPass->addRenderState(m_noDepthMask);
m_gl3RenderPass->addRenderState(m_blendState);
@@ -166,9 +183,14 @@ void QDiffuseSpecularMaterialPrivate::init()
m_es2RenderPass->addRenderState(m_blendState);
m_es2RenderPass->addRenderState(m_blendEquation);
+ m_rhiRenderPass->addRenderState(m_noDepthMask);
+ m_rhiRenderPass->addRenderState(m_blendState);
+ m_rhiRenderPass->addRenderState(m_blendEquation);
+
m_gl3Technique->addRenderPass(m_gl3RenderPass);
m_gl2Technique->addRenderPass(m_gl2RenderPass);
m_es2Technique->addRenderPass(m_es2RenderPass);
+ m_rhiTechnique->addRenderPass(m_rhiRenderPass);
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
@@ -177,10 +199,12 @@ void QDiffuseSpecularMaterialPrivate::init()
m_gl3Technique->addFilterKey(m_filterKey);
m_gl2Technique->addFilterKey(m_filterKey);
m_es2Technique->addFilterKey(m_filterKey);
+ m_rhiTechnique->addFilterKey(m_filterKey);
m_effect->addTechnique(m_gl3Technique);
m_effect->addTechnique(m_gl2Technique);
m_effect->addTechnique(m_es2Technique);
+ m_effect->addTechnique(m_rhiTechnique);
m_effect->addParameter(m_ambientParameter);
m_effect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qdiffusespecularmaterial_p.h b/src/extras/defaults/qdiffusespecularmaterial_p.h
index 2b0b2184f..9e2b2bbbb 100644
--- a/src/extras/defaults/qdiffusespecularmaterial_p.h
+++ b/src/extras/defaults/qdiffusespecularmaterial_p.h
@@ -97,13 +97,17 @@ public:
Qt3DRender::QTechnique *m_gl3Technique;
Qt3DRender::QTechnique *m_gl2Technique;
Qt3DRender::QTechnique *m_es2Technique;
+ Qt3DRender::QTechnique *m_rhiTechnique;
Qt3DRender::QRenderPass *m_gl3RenderPass;
Qt3DRender::QRenderPass *m_gl2RenderPass;
Qt3DRender::QRenderPass *m_es2RenderPass;
+ Qt3DRender::QRenderPass *m_rhiRenderPass;
Qt3DRender::QShaderProgram *m_gl3Shader;
Qt3DRender::QShaderProgramBuilder *m_gl3ShaderBuilder;
Qt3DRender::QShaderProgram *m_gl2es2Shader;
Qt3DRender::QShaderProgramBuilder *m_gl2es2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_rhiShader;
+ Qt3DRender::QShaderProgramBuilder *m_rhiShaderBuilder;
Qt3DRender::QNoDepthMask *m_noDepthMask;
Qt3DRender::QBlendEquationArguments *m_blendState;
Qt3DRender::QBlendEquation *m_blendEquation;
diff --git a/src/extras/defaults/qgoochmaterial.cpp b/src/extras/defaults/qgoochmaterial.cpp
index 57ec359b3..b5665d776 100644
--- a/src/extras/defaults/qgoochmaterial.cpp
+++ b/src/extras/defaults/qgoochmaterial.cpp
@@ -65,11 +65,14 @@ QGoochMaterialPrivate::QGoochMaterialPrivate()
, m_gl3Technique(new Qt3DRender::QTechnique)
, m_gl2Technique(new Qt3DRender::QTechnique)
, m_es2Technique(new Qt3DRender::QTechnique)
+ , m_rhiTechnique(new Qt3DRender::QTechnique)
, m_gl3RenderPass(new Qt3DRender::QRenderPass)
, m_gl2RenderPass(new Qt3DRender::QRenderPass)
, m_es2RenderPass(new Qt3DRender::QRenderPass)
+ , m_rhiRenderPass(new Qt3DRender::QRenderPass)
, m_gl3Shader(new Qt3DRender::QShaderProgram)
, m_gl2ES2Shader(new Qt3DRender::QShaderProgram)
+ , m_rhiShader(new Qt3DRender::QShaderProgram)
, m_filterKey(new Qt3DRender::QFilterKey)
{
}
@@ -97,6 +100,8 @@ void QGoochMaterialPrivate::init()
m_gl3Shader->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/gooch.frag"))));
m_gl2ES2Shader->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/gooch.vert"))));
m_gl2ES2Shader->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/gooch.frag"))));
+ m_rhiShader->setVertexShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/gooch.vert"))));
+ m_rhiShader->setFragmentShaderCode(Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/gooch.frag"))));
m_gl3Technique->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
m_gl3Technique->graphicsApiFilter()->setMajorVersion(3);
@@ -113,6 +118,11 @@ void QGoochMaterialPrivate::init()
m_es2Technique->graphicsApiFilter()->setMinorVersion(0);
m_es2Technique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::NoProfile);
+ m_rhiTechnique->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::RHI);
+ m_rhiTechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_rhiTechnique->graphicsApiFilter()->setMinorVersion(0);
+ m_rhiTechnique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -120,18 +130,22 @@ void QGoochMaterialPrivate::init()
m_gl3Technique->addFilterKey(m_filterKey);
m_gl2Technique->addFilterKey(m_filterKey);
m_es2Technique->addFilterKey(m_filterKey);
+ m_rhiTechnique->addFilterKey(m_filterKey);
m_gl3RenderPass->setShaderProgram(m_gl3Shader);
m_gl2RenderPass->setShaderProgram(m_gl2ES2Shader);
m_es2RenderPass->setShaderProgram(m_gl2ES2Shader);
+ m_rhiRenderPass->setShaderProgram(m_rhiShader);
m_gl3Technique->addRenderPass(m_gl3RenderPass);
m_gl2Technique->addRenderPass(m_gl2RenderPass);
m_es2Technique->addRenderPass(m_es2RenderPass);
+ m_rhiTechnique->addRenderPass(m_rhiRenderPass);
m_effect->addTechnique(m_gl3Technique);
m_effect->addTechnique(m_gl2Technique);
m_effect->addTechnique(m_es2Technique);
+ m_effect->addTechnique(m_rhiTechnique);
m_effect->addParameter(m_diffuseParameter);
m_effect->addParameter(m_specularParameter);
diff --git a/src/extras/defaults/qgoochmaterial_p.h b/src/extras/defaults/qgoochmaterial_p.h
index d4ef256f6..aca9ce639 100644
--- a/src/extras/defaults/qgoochmaterial_p.h
+++ b/src/extras/defaults/qgoochmaterial_p.h
@@ -93,11 +93,14 @@ public:
Qt3DRender::QTechnique *m_gl3Technique;
Qt3DRender::QTechnique *m_gl2Technique;
Qt3DRender::QTechnique *m_es2Technique;
+ Qt3DRender::QTechnique *m_rhiTechnique;
Qt3DRender::QRenderPass *m_gl3RenderPass;
Qt3DRender::QRenderPass *m_gl2RenderPass;
Qt3DRender::QRenderPass *m_es2RenderPass;
+ Qt3DRender::QRenderPass *m_rhiRenderPass;
Qt3DRender::QShaderProgram *m_gl3Shader;
Qt3DRender::QShaderProgram *m_gl2ES2Shader;
+ Qt3DRender::QShaderProgram *m_rhiShader;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QGoochMaterial)
diff --git a/src/extras/defaults/qmetalroughmaterial.cpp b/src/extras/defaults/qmetalroughmaterial.cpp
index 7d5ee61ea..7aecfa65d 100644
--- a/src/extras/defaults/qmetalroughmaterial.cpp
+++ b/src/extras/defaults/qmetalroughmaterial.cpp
@@ -79,6 +79,10 @@ QMetalRoughMaterialPrivate::QMetalRoughMaterialPrivate()
, m_metalRoughES3RenderPass(new QRenderPass())
, m_metalRoughES3Shader(new QShaderProgram())
, m_metalRoughES3ShaderBuilder(new QShaderProgramBuilder())
+ , m_metalRoughRHITechnique(new QTechnique())
+ , m_metalRoughRHIRenderPass(new QRenderPass())
+ , m_metalRoughRHIShader(new QShaderProgram())
+ , m_metalRoughRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
}
@@ -120,6 +124,16 @@ void QMetalRoughMaterialPrivate::init()
QStringLiteral("ambientOcclusion"),
QStringLiteral("normal")});
+ m_metalRoughRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_metalRoughRHIShaderBuilder->setParent(q);
+ m_metalRoughRHIShaderBuilder->setShaderProgram(m_metalRoughRHIShader);
+ m_metalRoughRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/metalrough.frag.json")));
+ m_metalRoughRHIShaderBuilder->setEnabledLayers({QStringLiteral("baseColor"),
+ QStringLiteral("metalness"),
+ QStringLiteral("roughness"),
+ QStringLiteral("ambientOcclusion"),
+ QStringLiteral("normal")});
+
m_metalRoughGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_metalRoughGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_metalRoughGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -129,6 +143,10 @@ void QMetalRoughMaterialPrivate::init()
m_metalRoughES3Technique->graphicsApiFilter()->setMajorVersion(3);
m_metalRoughES3Technique->graphicsApiFilter()->setMinorVersion(0);
+ m_metalRoughRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_metalRoughRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_metalRoughRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -143,6 +161,11 @@ void QMetalRoughMaterialPrivate::init()
m_metalRoughES3Technique->addRenderPass(m_metalRoughES3RenderPass);
m_metalRoughEffect->addTechnique(m_metalRoughES3Technique);
+ m_metalRoughRHITechnique->addFilterKey(m_filterKey);
+ m_metalRoughRHIRenderPass->setShaderProgram(m_metalRoughRHIShader);
+ m_metalRoughRHITechnique->addRenderPass(m_metalRoughRHIRenderPass);
+ m_metalRoughEffect->addTechnique(m_metalRoughRHITechnique);
+
// Given parameters a parent
m_baseColorMapParameter->setParent(m_metalRoughEffect);
m_metalnessMapParameter->setParent(m_metalRoughEffect);
diff --git a/src/extras/defaults/qmetalroughmaterial_p.h b/src/extras/defaults/qmetalroughmaterial_p.h
index 4d8b68320..15a869ff1 100644
--- a/src/extras/defaults/qmetalroughmaterial_p.h
+++ b/src/extras/defaults/qmetalroughmaterial_p.h
@@ -99,6 +99,10 @@ public:
Qt3DRender::QRenderPass *m_metalRoughES3RenderPass;
Qt3DRender::QShaderProgram *m_metalRoughES3Shader;
Qt3DRender::QShaderProgramBuilder *m_metalRoughES3ShaderBuilder;
+ Qt3DRender::QTechnique *m_metalRoughRHITechnique;
+ Qt3DRender::QRenderPass *m_metalRoughRHIRenderPass;
+ Qt3DRender::QShaderProgram *m_metalRoughRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_metalRoughRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QMetalRoughMaterial)
diff --git a/src/extras/defaults/qmorphphongmaterial.cpp b/src/extras/defaults/qmorphphongmaterial.cpp
index 1711a21dd..8469fc127 100644
--- a/src/extras/defaults/qmorphphongmaterial.cpp
+++ b/src/extras/defaults/qmorphphongmaterial.cpp
@@ -66,13 +66,17 @@ QMorphPhongMaterialPrivate::QMorphPhongMaterialPrivate()
, m_phongGL3Technique(new QTechnique())
, m_phongGL2Technique(new QTechnique())
, m_phongES2Technique(new QTechnique())
+ , m_phongRHITechnique(new QTechnique())
, m_phongGL3RenderPass(new QRenderPass())
, m_phongGL2RenderPass(new QRenderPass())
, m_phongES2RenderPass(new QRenderPass())
+ , m_phongRHIRenderPass(new QRenderPass())
, m_phongGL3Shader(new QShaderProgram())
, m_phongGL2ES2Shader(new QShaderProgram())
+ , m_phongRHIShader(new QShaderProgram())
, m_phongGL3ShaderBuilder(new QShaderProgramBuilder())
, m_phongGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_phongRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
}
@@ -99,6 +103,7 @@ void QMorphPhongMaterialPrivate::init()
m_phongGL3ShaderBuilder->setEnabledLayers({QStringLiteral("diffuse"),
QStringLiteral("specular"),
QStringLiteral("normal")});
+
m_phongGL2ES2Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/morphphong.vert"))));
m_phongGL2ES2ShaderBuilder->setParent(q);
m_phongGL2ES2ShaderBuilder->setShaderProgram(m_phongGL2ES2Shader);
@@ -107,6 +112,14 @@ void QMorphPhongMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normal")});
+ m_phongRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/morphphong.vert"))));
+ m_phongRHIShaderBuilder->setParent(q);
+ m_phongRHIShaderBuilder->setShaderProgram(m_phongRHIShader);
+ m_phongRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_phongRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuse"),
+ QStringLiteral("specular"),
+ QStringLiteral("normal")});
+
m_phongGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_phongGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_phongGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -122,13 +135,19 @@ void QMorphPhongMaterialPrivate::init()
m_phongES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_phongES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_phongRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_phongRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_phongRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_phongGL3RenderPass->setShaderProgram(m_phongGL3Shader);
m_phongGL2RenderPass->setShaderProgram(m_phongGL2ES2Shader);
m_phongES2RenderPass->setShaderProgram(m_phongGL2ES2Shader);
+ m_phongRHIRenderPass->setShaderProgram(m_phongRHIShader);
m_phongGL3Technique->addRenderPass(m_phongGL3RenderPass);
m_phongGL2Technique->addRenderPass(m_phongGL2RenderPass);
m_phongES2Technique->addRenderPass(m_phongES2RenderPass);
+ m_phongRHITechnique->addRenderPass(m_phongRHIRenderPass);
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
@@ -137,10 +156,12 @@ void QMorphPhongMaterialPrivate::init()
m_phongGL3Technique->addFilterKey(m_filterKey);
m_phongGL2Technique->addFilterKey(m_filterKey);
m_phongES2Technique->addFilterKey(m_filterKey);
+ m_phongRHITechnique->addFilterKey(m_filterKey);
m_phongEffect->addTechnique(m_phongGL3Technique);
m_phongEffect->addTechnique(m_phongGL2Technique);
m_phongEffect->addTechnique(m_phongES2Technique);
+ m_phongEffect->addTechnique(m_phongRHITechnique);
m_phongEffect->addParameter(m_ambientParameter);
m_phongEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qmorphphongmaterial_p.h b/src/extras/defaults/qmorphphongmaterial_p.h
index 28b7750d9..4ee8954fe 100644
--- a/src/extras/defaults/qmorphphongmaterial_p.h
+++ b/src/extras/defaults/qmorphphongmaterial_p.h
@@ -90,13 +90,17 @@ public:
Qt3DRender::QTechnique *m_phongGL3Technique;
Qt3DRender::QTechnique *m_phongGL2Technique;
Qt3DRender::QTechnique *m_phongES2Technique;
+ Qt3DRender::QTechnique *m_phongRHITechnique;
Qt3DRender::QRenderPass *m_phongGL3RenderPass;
Qt3DRender::QRenderPass *m_phongGL2RenderPass;
Qt3DRender::QRenderPass *m_phongES2RenderPass;
+ Qt3DRender::QRenderPass *m_phongRHIRenderPass;
Qt3DRender::QShaderProgram *m_phongGL3Shader;
Qt3DRender::QShaderProgram *m_phongGL2ES2Shader;
+ Qt3DRender::QShaderProgram *m_phongRHIShader;
Qt3DRender::QShaderProgramBuilder *m_phongGL3ShaderBuilder;
Qt3DRender::QShaderProgramBuilder *m_phongGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgramBuilder *m_phongRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QMorphPhongMaterial)
diff --git a/src/extras/defaults/qnormaldiffusemapalphamaterial.cpp b/src/extras/defaults/qnormaldiffusemapalphamaterial.cpp
index 27fda6879..03b8d8385 100644
--- a/src/extras/defaults/qnormaldiffusemapalphamaterial.cpp
+++ b/src/extras/defaults/qnormaldiffusemapalphamaterial.cpp
@@ -101,6 +101,14 @@ void QNormalDiffuseMapAlphaMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normalTexture")});
+ m_normalDiffuseRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_normalDiffuseRHIShaderBuilder->setParent(q);
+ m_normalDiffuseRHIShaderBuilder->setShaderProgram(m_normalDiffuseRHIShader);
+ m_normalDiffuseRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_normalDiffuseRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuseTexture"),
+ QStringLiteral("specular"),
+ QStringLiteral("normalTexture")});
+
m_normalDiffuseGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_normalDiffuseGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_normalDiffuseGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -116,6 +124,10 @@ void QNormalDiffuseMapAlphaMaterialPrivate::init()
m_normalDiffuseES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_normalDiffuseES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_normalDiffuseRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_normalDiffuseRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_normalDiffuseRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -123,6 +135,7 @@ void QNormalDiffuseMapAlphaMaterialPrivate::init()
m_normalDiffuseGL3Technique->addFilterKey(m_filterKey);
m_normalDiffuseGL2Technique->addFilterKey(m_filterKey);
m_normalDiffuseES2Technique->addFilterKey(m_filterKey);
+ m_normalDiffuseRHITechnique->addFilterKey(m_filterKey);
m_depthTest->setDepthFunction(QDepthTest::Less);
@@ -138,13 +151,19 @@ void QNormalDiffuseMapAlphaMaterialPrivate::init()
m_normalDiffuseES2RenderPass->addRenderState(m_alphaCoverage);
m_normalDiffuseES2RenderPass->addRenderState(m_depthTest);
+ m_normalDiffuseRHIRenderPass->setShaderProgram(m_normalDiffuseRHIShader);
+ m_normalDiffuseRHIRenderPass->addRenderState(m_alphaCoverage);
+ m_normalDiffuseRHIRenderPass->addRenderState(m_depthTest);
+
m_normalDiffuseGL3Technique->addRenderPass(m_normalDiffuseGL3RenderPass);
m_normalDiffuseGL2Technique->addRenderPass(m_normalDiffuseGL2RenderPass);
m_normalDiffuseES2Technique->addRenderPass(m_normalDiffuseES2RenderPass);
+ m_normalDiffuseRHITechnique->addRenderPass(m_normalDiffuseRHIRenderPass);
m_normalDiffuseEffect->addTechnique(m_normalDiffuseGL3Technique);
m_normalDiffuseEffect->addTechnique(m_normalDiffuseGL2Technique);
m_normalDiffuseEffect->addTechnique(m_normalDiffuseES2Technique);
+ m_normalDiffuseEffect->addTechnique(m_normalDiffuseRHITechnique);
m_normalDiffuseEffect->addParameter(m_ambientParameter);
m_normalDiffuseEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qnormaldiffusemapmaterial.cpp b/src/extras/defaults/qnormaldiffusemapmaterial.cpp
index 9d41ddb32..c4f3e15b2 100644
--- a/src/extras/defaults/qnormaldiffusemapmaterial.cpp
+++ b/src/extras/defaults/qnormaldiffusemapmaterial.cpp
@@ -73,13 +73,17 @@ QNormalDiffuseMapMaterialPrivate::QNormalDiffuseMapMaterialPrivate()
, m_normalDiffuseGL3Technique(new QTechnique())
, m_normalDiffuseGL2Technique(new QTechnique())
, m_normalDiffuseES2Technique(new QTechnique())
+ , m_normalDiffuseRHITechnique(new QTechnique())
, m_normalDiffuseGL3RenderPass(new QRenderPass())
, m_normalDiffuseGL2RenderPass(new QRenderPass())
, m_normalDiffuseES2RenderPass(new QRenderPass())
+ , m_normalDiffuseRHIRenderPass(new QRenderPass())
, m_normalDiffuseGL3Shader(new QShaderProgram())
, m_normalDiffuseGL3ShaderBuilder(new QShaderProgramBuilder())
, m_normalDiffuseGL2ES2Shader(new QShaderProgram())
, m_normalDiffuseGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_normalDiffuseRHIShader(new QShaderProgram())
+ , m_normalDiffuseRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
m_diffuseTexture->setMagnificationFilter(QAbstractTexture::Linear);
@@ -128,6 +132,14 @@ void QNormalDiffuseMapMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normalTexture")});
+ m_normalDiffuseRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_normalDiffuseRHIShaderBuilder->setParent(q);
+ m_normalDiffuseRHIShaderBuilder->setShaderProgram(m_normalDiffuseRHIShader);
+ m_normalDiffuseRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_normalDiffuseRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuseTexture"),
+ QStringLiteral("specular"),
+ QStringLiteral("normalTexture")});
+
m_normalDiffuseGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_normalDiffuseGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_normalDiffuseGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -143,6 +155,10 @@ void QNormalDiffuseMapMaterialPrivate::init()
m_normalDiffuseES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_normalDiffuseES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_normalDiffuseRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_normalDiffuseRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_normalDiffuseRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -150,18 +166,22 @@ void QNormalDiffuseMapMaterialPrivate::init()
m_normalDiffuseGL3Technique->addFilterKey(m_filterKey);
m_normalDiffuseGL2Technique->addFilterKey(m_filterKey);
m_normalDiffuseES2Technique->addFilterKey(m_filterKey);
+ m_normalDiffuseRHITechnique->addFilterKey(m_filterKey);
m_normalDiffuseGL3RenderPass->setShaderProgram(m_normalDiffuseGL3Shader);
m_normalDiffuseGL2RenderPass->setShaderProgram(m_normalDiffuseGL2ES2Shader);
m_normalDiffuseES2RenderPass->setShaderProgram(m_normalDiffuseGL2ES2Shader);
+ m_normalDiffuseRHIRenderPass->setShaderProgram(m_normalDiffuseRHIShader);
m_normalDiffuseGL3Technique->addRenderPass(m_normalDiffuseGL3RenderPass);
m_normalDiffuseGL2Technique->addRenderPass(m_normalDiffuseGL2RenderPass);
m_normalDiffuseES2Technique->addRenderPass(m_normalDiffuseES2RenderPass);
+ m_normalDiffuseRHITechnique->addRenderPass(m_normalDiffuseRHIRenderPass);
m_normalDiffuseEffect->addTechnique(m_normalDiffuseGL3Technique);
m_normalDiffuseEffect->addTechnique(m_normalDiffuseGL2Technique);
m_normalDiffuseEffect->addTechnique(m_normalDiffuseES2Technique);
+ m_normalDiffuseEffect->addTechnique(m_normalDiffuseRHITechnique);
m_normalDiffuseEffect->addParameter(m_ambientParameter);
m_normalDiffuseEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qnormaldiffusemapmaterial_p.h b/src/extras/defaults/qnormaldiffusemapmaterial_p.h
index 1ac937b1e..5a5839682 100644
--- a/src/extras/defaults/qnormaldiffusemapmaterial_p.h
+++ b/src/extras/defaults/qnormaldiffusemapmaterial_p.h
@@ -98,13 +98,17 @@ public:
Qt3DRender::QTechnique *m_normalDiffuseGL3Technique;
Qt3DRender::QTechnique *m_normalDiffuseGL2Technique;
Qt3DRender::QTechnique *m_normalDiffuseES2Technique;
+ Qt3DRender::QTechnique *m_normalDiffuseRHITechnique;
Qt3DRender::QRenderPass *m_normalDiffuseGL3RenderPass;
Qt3DRender::QRenderPass *m_normalDiffuseGL2RenderPass;
Qt3DRender::QRenderPass *m_normalDiffuseES2RenderPass;
+ Qt3DRender::QRenderPass *m_normalDiffuseRHIRenderPass;
Qt3DRender::QShaderProgram *m_normalDiffuseGL3Shader;
Qt3DRender::QShaderProgramBuilder *m_normalDiffuseGL3ShaderBuilder;
Qt3DRender::QShaderProgram *m_normalDiffuseGL2ES2Shader;
Qt3DRender::QShaderProgramBuilder *m_normalDiffuseGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_normalDiffuseRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_normalDiffuseRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QNormalDiffuseMapMaterial)
diff --git a/src/extras/defaults/qnormaldiffusespecularmapmaterial.cpp b/src/extras/defaults/qnormaldiffusespecularmapmaterial.cpp
index a76d9856b..66586ef18 100644
--- a/src/extras/defaults/qnormaldiffusespecularmapmaterial.cpp
+++ b/src/extras/defaults/qnormaldiffusespecularmapmaterial.cpp
@@ -75,13 +75,17 @@ QNormalDiffuseSpecularMapMaterialPrivate::QNormalDiffuseSpecularMapMaterialPriva
, m_normalDiffuseSpecularGL3Technique(new QTechnique())
, m_normalDiffuseSpecularGL2Technique(new QTechnique())
, m_normalDiffuseSpecularES2Technique(new QTechnique())
+ , m_normalDiffuseSpecularRHITechnique(new QTechnique())
, m_normalDiffuseSpecularGL3RenderPass(new QRenderPass())
, m_normalDiffuseSpecularGL2RenderPass(new QRenderPass())
, m_normalDiffuseSpecularES2RenderPass(new QRenderPass())
+ , m_normalDiffuseSpecularRHIRenderPass(new QRenderPass())
, m_normalDiffuseSpecularGL3Shader(new QShaderProgram())
, m_normalDiffuseSpecularGL3ShaderBuilder(new QShaderProgramBuilder())
, m_normalDiffuseSpecularGL2ES2Shader(new QShaderProgram())
, m_normalDiffuseSpecularGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_normalDiffuseSpecularRHIShader(new QShaderProgram())
+ , m_normalDiffuseSpecularRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
m_diffuseTexture->setMagnificationFilter(QAbstractTexture::Linear);
@@ -136,6 +140,14 @@ void QNormalDiffuseSpecularMapMaterialPrivate::init()
QStringLiteral("specularTexture"),
QStringLiteral("normalTexture")});
+ m_normalDiffuseSpecularRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_normalDiffuseSpecularRHIShaderBuilder->setParent(q);
+ m_normalDiffuseSpecularRHIShaderBuilder->setShaderProgram(m_normalDiffuseSpecularRHIShader);
+ m_normalDiffuseSpecularRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_normalDiffuseSpecularRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuseTexture"),
+ QStringLiteral("specularTexture"),
+ QStringLiteral("normalTexture")});
+
m_normalDiffuseSpecularGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_normalDiffuseSpecularGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_normalDiffuseSpecularGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -151,6 +163,10 @@ void QNormalDiffuseSpecularMapMaterialPrivate::init()
m_normalDiffuseSpecularES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_normalDiffuseSpecularES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_normalDiffuseSpecularRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_normalDiffuseSpecularRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_normalDiffuseSpecularRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -158,18 +174,22 @@ void QNormalDiffuseSpecularMapMaterialPrivate::init()
m_normalDiffuseSpecularGL3Technique->addFilterKey(m_filterKey);
m_normalDiffuseSpecularGL2Technique->addFilterKey(m_filterKey);
m_normalDiffuseSpecularES2Technique->addFilterKey(m_filterKey);
+ m_normalDiffuseSpecularRHITechnique->addFilterKey(m_filterKey);
m_normalDiffuseSpecularGL3RenderPass->setShaderProgram(m_normalDiffuseSpecularGL3Shader);
m_normalDiffuseSpecularGL2RenderPass->setShaderProgram(m_normalDiffuseSpecularGL2ES2Shader);
m_normalDiffuseSpecularES2RenderPass->setShaderProgram(m_normalDiffuseSpecularGL2ES2Shader);
+ m_normalDiffuseSpecularRHIRenderPass->setShaderProgram(m_normalDiffuseSpecularRHIShader);
m_normalDiffuseSpecularGL3Technique->addRenderPass(m_normalDiffuseSpecularGL3RenderPass);
m_normalDiffuseSpecularGL2Technique->addRenderPass(m_normalDiffuseSpecularGL2RenderPass);
m_normalDiffuseSpecularES2Technique->addRenderPass(m_normalDiffuseSpecularES2RenderPass);
+ m_normalDiffuseSpecularRHITechnique->addRenderPass(m_normalDiffuseSpecularRHIRenderPass);
m_normalDiffuseSpecularEffect->addTechnique(m_normalDiffuseSpecularGL3Technique);
m_normalDiffuseSpecularEffect->addTechnique(m_normalDiffuseSpecularGL2Technique);
m_normalDiffuseSpecularEffect->addTechnique(m_normalDiffuseSpecularES2Technique);
+ m_normalDiffuseSpecularEffect->addTechnique(m_normalDiffuseSpecularRHITechnique);
m_normalDiffuseSpecularEffect->addParameter(m_ambientParameter);
m_normalDiffuseSpecularEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qnormaldiffusespecularmapmaterial_p.h b/src/extras/defaults/qnormaldiffusespecularmapmaterial_p.h
index e02451cc0..0a0d519ad 100644
--- a/src/extras/defaults/qnormaldiffusespecularmapmaterial_p.h
+++ b/src/extras/defaults/qnormaldiffusespecularmapmaterial_p.h
@@ -99,13 +99,17 @@ public:
Qt3DRender::QTechnique *m_normalDiffuseSpecularGL3Technique;
Qt3DRender::QTechnique *m_normalDiffuseSpecularGL2Technique;
Qt3DRender::QTechnique *m_normalDiffuseSpecularES2Technique;
+ Qt3DRender::QTechnique *m_normalDiffuseSpecularRHITechnique;
Qt3DRender::QRenderPass *m_normalDiffuseSpecularGL3RenderPass;
Qt3DRender::QRenderPass *m_normalDiffuseSpecularGL2RenderPass;
Qt3DRender::QRenderPass *m_normalDiffuseSpecularES2RenderPass;
+ Qt3DRender::QRenderPass *m_normalDiffuseSpecularRHIRenderPass;
Qt3DRender::QShaderProgram *m_normalDiffuseSpecularGL3Shader;
Qt3DRender::QShaderProgramBuilder *m_normalDiffuseSpecularGL3ShaderBuilder;
Qt3DRender::QShaderProgram *m_normalDiffuseSpecularGL2ES2Shader;
Qt3DRender::QShaderProgramBuilder *m_normalDiffuseSpecularGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_normalDiffuseSpecularRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_normalDiffuseSpecularRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QNormalDiffuseSpecularMapMaterial)
diff --git a/src/extras/defaults/qpervertexcolormaterial.cpp b/src/extras/defaults/qpervertexcolormaterial.cpp
index f0462039e..ef41cbce7 100644
--- a/src/extras/defaults/qpervertexcolormaterial.cpp
+++ b/src/extras/defaults/qpervertexcolormaterial.cpp
@@ -64,11 +64,14 @@ QPerVertexColorMaterialPrivate::QPerVertexColorMaterialPrivate()
, m_vertexGL3Technique(new QTechnique())
, m_vertexGL2Technique(new QTechnique())
, m_vertexES2Technique(new QTechnique())
+ , m_vertexRHITechnique(new QTechnique())
, m_vertexGL3RenderPass(new QRenderPass())
, m_vertexGL2RenderPass(new QRenderPass())
, m_vertexES2RenderPass(new QRenderPass())
+ , m_vertexRHIRenderPass(new QRenderPass())
, m_vertexGL3Shader(new QShaderProgram())
, m_vertexGL2ES2Shader(new QShaderProgram())
+ , m_vertexRHIShader(new QShaderProgram())
, m_filterKey(new QFilterKey)
{
}
@@ -119,6 +122,8 @@ void QPerVertexColorMaterialPrivate::init()
m_vertexGL3Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/gl3/pervertexcolor.frag"))));
m_vertexGL2ES2Shader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/pervertexcolor.vert"))));
m_vertexGL2ES2Shader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/es2/pervertexcolor.frag"))));
+ m_vertexRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/pervertexcolor.vert"))));
+ m_vertexRHIShader->setFragmentShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/pervertexcolor.frag"))));
m_vertexGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_vertexGL3Technique->graphicsApiFilter()->setMajorVersion(3);
@@ -135,6 +140,10 @@ void QPerVertexColorMaterialPrivate::init()
m_vertexES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_vertexES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_vertexRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_vertexRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_vertexRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
Q_Q(QPerVertexColorMaterial);
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
@@ -143,18 +152,22 @@ void QPerVertexColorMaterialPrivate::init()
m_vertexGL3Technique->addFilterKey(m_filterKey);
m_vertexGL2Technique->addFilterKey(m_filterKey);
m_vertexES2Technique->addFilterKey(m_filterKey);
+ m_vertexRHITechnique->addFilterKey(m_filterKey);
m_vertexGL3RenderPass->setShaderProgram(m_vertexGL3Shader);
m_vertexGL2RenderPass->setShaderProgram(m_vertexGL2ES2Shader);
m_vertexES2RenderPass->setShaderProgram(m_vertexGL2ES2Shader);
+ m_vertexRHIRenderPass->setShaderProgram(m_vertexRHIShader);
m_vertexGL3Technique->addRenderPass(m_vertexGL3RenderPass);
m_vertexGL2Technique->addRenderPass(m_vertexGL2RenderPass);
m_vertexES2Technique->addRenderPass(m_vertexES2RenderPass);
+ m_vertexRHITechnique->addRenderPass(m_vertexRHIRenderPass);
m_vertexEffect->addTechnique(m_vertexGL3Technique);
m_vertexEffect->addTechnique(m_vertexGL2Technique);
m_vertexEffect->addTechnique(m_vertexES2Technique);
+ m_vertexEffect->addTechnique(m_vertexRHITechnique);
q->setEffect(m_vertexEffect);
}
diff --git a/src/extras/defaults/qpervertexcolormaterial_p.h b/src/extras/defaults/qpervertexcolormaterial_p.h
index 678353525..8c5c3eefa 100644
--- a/src/extras/defaults/qpervertexcolormaterial_p.h
+++ b/src/extras/defaults/qpervertexcolormaterial_p.h
@@ -81,11 +81,14 @@ public:
Qt3DRender::QTechnique *m_vertexGL3Technique;
Qt3DRender::QTechnique *m_vertexGL2Technique;
Qt3DRender::QTechnique *m_vertexES2Technique;
+ Qt3DRender::QTechnique *m_vertexRHITechnique;
Qt3DRender::QRenderPass *m_vertexGL3RenderPass;
Qt3DRender::QRenderPass *m_vertexGL2RenderPass;
Qt3DRender::QRenderPass *m_vertexES2RenderPass;
+ Qt3DRender::QRenderPass *m_vertexRHIRenderPass;
Qt3DRender::QShaderProgram *m_vertexGL3Shader;
Qt3DRender::QShaderProgram *m_vertexGL2ES2Shader;
+ Qt3DRender::QShaderProgram *m_vertexRHIShader;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QPerVertexColorMaterial)
diff --git a/src/extras/defaults/qphongalphamaterial.cpp b/src/extras/defaults/qphongalphamaterial.cpp
index 2f705072f..8d8464d85 100644
--- a/src/extras/defaults/qphongalphamaterial.cpp
+++ b/src/extras/defaults/qphongalphamaterial.cpp
@@ -72,13 +72,17 @@ QPhongAlphaMaterialPrivate::QPhongAlphaMaterialPrivate()
, m_phongAlphaGL3Technique(new QTechnique())
, m_phongAlphaGL2Technique(new QTechnique())
, m_phongAlphaES2Technique(new QTechnique())
+ , m_phongAlphaRHITechnique(new QTechnique())
, m_phongAlphaGL3RenderPass(new QRenderPass())
, m_phongAlphaGL2RenderPass(new QRenderPass())
, m_phongAlphaES2RenderPass(new QRenderPass())
+ , m_phongAlphaRHIRenderPass(new QRenderPass())
, m_phongAlphaGL3Shader(new QShaderProgram())
, m_phongAlphaGL3ShaderBuilder(new QShaderProgramBuilder())
, m_phongAlphaGL2ES2Shader(new QShaderProgram())
, m_phongAlphaGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_phongAlphaRHIShader(new QShaderProgram())
+ , m_phongAlphaRHIShaderBuilder(new QShaderProgramBuilder())
, m_noDepthMask(new QNoDepthMask())
, m_blendState(new QBlendEquationArguments())
, m_blendEquation(new QBlendEquation())
@@ -116,6 +120,14 @@ void QPhongAlphaMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normal")});
+ m_phongAlphaRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_phongAlphaRHIShaderBuilder->setParent(q);
+ m_phongAlphaRHIShaderBuilder->setShaderProgram(m_phongAlphaRHIShader);
+ m_phongAlphaRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_phongAlphaRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuse"),
+ QStringLiteral("specular"),
+ QStringLiteral("normal")});
+
m_phongAlphaGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_phongAlphaGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_phongAlphaGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -131,6 +143,10 @@ void QPhongAlphaMaterialPrivate::init()
m_phongAlphaES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_phongAlphaES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_phongAlphaRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_phongAlphaRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_phongAlphaRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
@@ -138,6 +154,7 @@ void QPhongAlphaMaterialPrivate::init()
m_phongAlphaGL3Technique->addFilterKey(m_filterKey);
m_phongAlphaGL2Technique->addFilterKey(m_filterKey);
m_phongAlphaES2Technique->addFilterKey(m_filterKey);
+ m_phongAlphaRHITechnique->addFilterKey(m_filterKey);
m_blendState->setSourceRgb(QBlendEquationArguments::SourceAlpha);
m_blendState->setDestinationRgb(QBlendEquationArguments::OneMinusSourceAlpha);
@@ -146,6 +163,7 @@ void QPhongAlphaMaterialPrivate::init()
m_phongAlphaGL3RenderPass->setShaderProgram(m_phongAlphaGL3Shader);
m_phongAlphaGL2RenderPass->setShaderProgram(m_phongAlphaGL2ES2Shader);
m_phongAlphaES2RenderPass->setShaderProgram(m_phongAlphaGL2ES2Shader);
+ m_phongAlphaRHIRenderPass->setShaderProgram(m_phongAlphaRHIShader);
m_phongAlphaGL3RenderPass->addRenderState(m_noDepthMask);
m_phongAlphaGL3RenderPass->addRenderState(m_blendState);
@@ -159,13 +177,19 @@ void QPhongAlphaMaterialPrivate::init()
m_phongAlphaES2RenderPass->addRenderState(m_blendState);
m_phongAlphaES2RenderPass->addRenderState(m_blendEquation);
+ m_phongAlphaRHIRenderPass->addRenderState(m_noDepthMask);
+ m_phongAlphaRHIRenderPass->addRenderState(m_blendState);
+ m_phongAlphaRHIRenderPass->addRenderState(m_blendEquation);
+
m_phongAlphaGL3Technique->addRenderPass(m_phongAlphaGL3RenderPass);
m_phongAlphaGL2Technique->addRenderPass(m_phongAlphaGL2RenderPass);
m_phongAlphaES2Technique->addRenderPass(m_phongAlphaES2RenderPass);
+ m_phongAlphaRHITechnique->addRenderPass(m_phongAlphaRHIRenderPass);
m_phongEffect->addTechnique(m_phongAlphaGL3Technique);
m_phongEffect->addTechnique(m_phongAlphaGL2Technique);
m_phongEffect->addTechnique(m_phongAlphaES2Technique);
+ m_phongEffect->addTechnique(m_phongAlphaRHITechnique);
m_phongEffect->addParameter(m_ambientParameter);
m_phongEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qphongalphamaterial_p.h b/src/extras/defaults/qphongalphamaterial_p.h
index 97eaf7bc4..7909f4e34 100644
--- a/src/extras/defaults/qphongalphamaterial_p.h
+++ b/src/extras/defaults/qphongalphamaterial_p.h
@@ -94,13 +94,17 @@ public:
Qt3DRender::QTechnique *m_phongAlphaGL3Technique;
Qt3DRender::QTechnique *m_phongAlphaGL2Technique;
Qt3DRender::QTechnique *m_phongAlphaES2Technique;
+ Qt3DRender::QTechnique *m_phongAlphaRHITechnique;
Qt3DRender::QRenderPass *m_phongAlphaGL3RenderPass;
Qt3DRender::QRenderPass *m_phongAlphaGL2RenderPass;
Qt3DRender::QRenderPass *m_phongAlphaES2RenderPass;
+ Qt3DRender::QRenderPass *m_phongAlphaRHIRenderPass;
Qt3DRender::QShaderProgram *m_phongAlphaGL3Shader;
Qt3DRender::QShaderProgramBuilder *m_phongAlphaGL3ShaderBuilder;
Qt3DRender::QShaderProgram *m_phongAlphaGL2ES2Shader;
Qt3DRender::QShaderProgramBuilder *m_phongAlphaGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_phongAlphaRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_phongAlphaRHIShaderBuilder;
Qt3DRender::QNoDepthMask *m_noDepthMask;
Qt3DRender::QBlendEquationArguments *m_blendState;
Qt3DRender::QBlendEquation *m_blendEquation;
diff --git a/src/extras/defaults/qphongmaterial.cpp b/src/extras/defaults/qphongmaterial.cpp
index 6318ea140..460bc9bb2 100644
--- a/src/extras/defaults/qphongmaterial.cpp
+++ b/src/extras/defaults/qphongmaterial.cpp
@@ -70,13 +70,17 @@ QPhongMaterialPrivate::QPhongMaterialPrivate()
, m_phongGL3Technique(new QTechnique())
, m_phongGL2Technique(new QTechnique())
, m_phongES2Technique(new QTechnique())
+ , m_phongRHITechnique(new QTechnique())
, m_phongGL3RenderPass(new QRenderPass())
, m_phongGL2RenderPass(new QRenderPass())
, m_phongES2RenderPass(new QRenderPass())
+ , m_phongRHIRenderPass(new QRenderPass())
, m_phongGL3Shader(new QShaderProgram())
, m_phongGL3ShaderBuilder(new QShaderProgramBuilder())
, m_phongGL2ES2Shader(new QShaderProgram())
, m_phongGL2ES2ShaderBuilder(new QShaderProgramBuilder())
+ , m_phongRHIShader(new QShaderProgram())
+ , m_phongRHIShaderBuilder(new QShaderProgramBuilder())
, m_filterKey(new QFilterKey)
{
}
@@ -110,6 +114,14 @@ void QPhongMaterialPrivate::init()
QStringLiteral("specular"),
QStringLiteral("normal")});
+ m_phongRHIShader->setVertexShaderCode(QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/rhi/default.vert"))));
+ m_phongRHIShaderBuilder->setParent(q);
+ m_phongRHIShaderBuilder->setShaderProgram(m_phongRHIShader);
+ m_phongRHIShaderBuilder->setFragmentShaderGraph(QUrl(QStringLiteral("qrc:/shaders/graphs/phong.frag.json")));
+ m_phongRHIShaderBuilder->setEnabledLayers({QStringLiteral("diffuse"),
+ QStringLiteral("specular"),
+ QStringLiteral("normal")});
+
m_phongGL3Technique->graphicsApiFilter()->setApi(QGraphicsApiFilter::OpenGL);
m_phongGL3Technique->graphicsApiFilter()->setMajorVersion(3);
m_phongGL3Technique->graphicsApiFilter()->setMinorVersion(1);
@@ -125,13 +137,19 @@ void QPhongMaterialPrivate::init()
m_phongES2Technique->graphicsApiFilter()->setMinorVersion(0);
m_phongES2Technique->graphicsApiFilter()->setProfile(QGraphicsApiFilter::NoProfile);
+ m_phongRHITechnique->graphicsApiFilter()->setApi(QGraphicsApiFilter::RHI);
+ m_phongRHITechnique->graphicsApiFilter()->setMajorVersion(1);
+ m_phongRHITechnique->graphicsApiFilter()->setMinorVersion(0);
+
m_phongGL3RenderPass->setShaderProgram(m_phongGL3Shader);
m_phongGL2RenderPass->setShaderProgram(m_phongGL2ES2Shader);
m_phongES2RenderPass->setShaderProgram(m_phongGL2ES2Shader);
+ m_phongRHIRenderPass->setShaderProgram(m_phongRHIShader);
m_phongGL3Technique->addRenderPass(m_phongGL3RenderPass);
m_phongGL2Technique->addRenderPass(m_phongGL2RenderPass);
m_phongES2Technique->addRenderPass(m_phongES2RenderPass);
+ m_phongRHITechnique->addRenderPass(m_phongRHIRenderPass);
m_filterKey->setParent(q);
m_filterKey->setName(QStringLiteral("renderingStyle"));
@@ -140,10 +158,12 @@ void QPhongMaterialPrivate::init()
m_phongGL3Technique->addFilterKey(m_filterKey);
m_phongGL2Technique->addFilterKey(m_filterKey);
m_phongES2Technique->addFilterKey(m_filterKey);
+ m_phongRHITechnique->addFilterKey(m_filterKey);
m_phongEffect->addTechnique(m_phongGL3Technique);
m_phongEffect->addTechnique(m_phongGL2Technique);
m_phongEffect->addTechnique(m_phongES2Technique);
+ m_phongEffect->addTechnique(m_phongRHITechnique);
m_phongEffect->addParameter(m_ambientParameter);
m_phongEffect->addParameter(m_diffuseParameter);
diff --git a/src/extras/defaults/qphongmaterial_p.h b/src/extras/defaults/qphongmaterial_p.h
index f1e55242b..2d8ae1be2 100644
--- a/src/extras/defaults/qphongmaterial_p.h
+++ b/src/extras/defaults/qphongmaterial_p.h
@@ -91,13 +91,17 @@ public:
Qt3DRender::QTechnique *m_phongGL3Technique;
Qt3DRender::QTechnique *m_phongGL2Technique;
Qt3DRender::QTechnique *m_phongES2Technique;
+ Qt3DRender::QTechnique *m_phongRHITechnique;
Qt3DRender::QRenderPass *m_phongGL3RenderPass;
Qt3DRender::QRenderPass *m_phongGL2RenderPass;
Qt3DRender::QRenderPass *m_phongES2RenderPass;
+ Qt3DRender::QRenderPass *m_phongRHIRenderPass;
Qt3DRender::QShaderProgram *m_phongGL3Shader;
Qt3DRender::QShaderProgramBuilder *m_phongGL3ShaderBuilder;
Qt3DRender::QShaderProgram *m_phongGL2ES2Shader;
Qt3DRender::QShaderProgramBuilder *m_phongGL2ES2ShaderBuilder;
+ Qt3DRender::QShaderProgram *m_phongRHIShader;
+ Qt3DRender::QShaderProgramBuilder *m_phongRHIShaderBuilder;
Qt3DRender::QFilterKey *m_filterKey;
Q_DECLARE_PUBLIC(QPhongMaterial)
diff --git a/src/extras/defaults/qt3dwindow.cpp b/src/extras/defaults/qt3dwindow.cpp
index 4cf3af250..fa48dba50 100644
--- a/src/extras/defaults/qt3dwindow.cpp
+++ b/src/extras/defaults/qt3dwindow.cpp
@@ -183,7 +183,6 @@ Qt3DWindow::Qt3DWindow(QScreen *screen, Qt3DRender::API api)
format.setProfile(QSurfaceFormat::CoreProfile);
}
#endif
-
if (!userRequestedApi.isEmpty()) {
// This is used for RHI
format.setVersion(1, 0);
diff --git a/src/extras/extras.qrc b/src/extras/extras.qrc
index 8d7085264..e31a6164b 100644
--- a/src/extras/extras.qrc
+++ b/src/extras/extras.qrc
@@ -56,5 +56,6 @@
<file>shaders/rhi/distancefieldtext.frag</file>
<file>shaders/rhi/default.vert</file>
<file>shaders/rhi/coordinatesystems.inc</file>
+ <file>shaders/rhi/defaultuniforms.inc</file>
</qresource>
</RCC>
diff --git a/src/extras/shaders/rhi/default.vert b/src/extras/shaders/rhi/default.vert
index f97cd099d..5679d8681 100644
--- a/src/extras/shaders/rhi/default.vert
+++ b/src/extras/shaders/rhi/default.vert
@@ -48,23 +48,48 @@
**
****************************************************************************/
-#version 150 core
+#version 450
-in vec3 vertexPosition;
-in vec3 vertexNormal;
-in vec4 vertexTangent;
-in vec2 vertexTexCoord;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec3 vertexNormal;
+layout(location = 2) in vec4 vertexTangent;
+layout(location = 3) in vec2 vertexTexCoord;
-out vec3 worldPosition;
-out vec3 worldNormal;
-out vec4 worldTangent;
-out vec2 texCoord;
+layout(location = 0) out vec3 worldPosition;
+layout(location = 1) out vec3 worldNormal;
+layout(location = 2) out vec4 worldTangent;
+layout(location = 3) out vec2 texCoord;
-uniform mat4 modelMatrix;
-uniform mat3 modelNormalMatrix;
-uniform mat4 modelViewProjection;
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
-uniform float texCoordScale;
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform qt3d_extras_uniforms {
+ float texCoordScale;
+};
void main()
{
@@ -74,8 +99,8 @@ void main()
// Transform position, normal, and tangent to world space
worldPosition = vec3(modelMatrix * vec4(vertexPosition, 1.0));
worldNormal = normalize(modelNormalMatrix * vertexNormal);
- worldTangent.xyz = normalize(vec3(modelMatrix * vec4(vertexTangent.xyz, 0.0)));
- worldTangent.w = vertexTangent.w;
+ vec3 wt = normalize(vec3(modelMatrix * vec4(vertexTangent.xyz, 0.0)));
+ worldTangent = vec4(wt, vertexTangent.w);
// Calculate vertex position in clip coordinates
gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
diff --git a/src/extras/shaders/rhi/defaultuniforms.inc b/src/extras/shaders/rhi/defaultuniforms.inc
new file mode 100644
index 000000000..ad2c51d50
--- /dev/null
+++ b/src/extras/shaders/rhi/defaultuniforms.inc
@@ -0,0 +1,30 @@
+layout(std140, binding = auto) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = auto) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = auto) uniform qt3d_extras_uniforms {
+ float texCoordScale;
+};
diff --git a/src/extras/shaders/rhi/distancefieldtext.frag b/src/extras/shaders/rhi/distancefieldtext.frag
index 998fa6e79..ec42f5056 100644
--- a/src/extras/shaders/rhi/distancefieldtext.frag
+++ b/src/extras/shaders/rhi/distancefieldtext.frag
@@ -1,15 +1,17 @@
-#version 150 core
+#version 450
-uniform sampler2D distanceFieldTexture;
-uniform float minAlpha;
-uniform float maxAlpha;
-uniform float textureSize;
-uniform vec4 color;
+layout(location = 0) in vec2 texCoord;
+layout(location = 1) in float zValue;
-in vec2 texCoord;
-in float zValue;
+layout(location = 0) out vec4 fragColor;
-out vec4 fragColor;
+layout(std140, binding = 2) uniform qt3d_custom_uniforms {
+ float minAlpha;
+ float maxAlpha;
+ float textureSize;
+ vec4 color;
+};
+layout(binding = 3) uniform sampler2D distanceFieldTexture;
void main()
{
diff --git a/src/extras/shaders/rhi/distancefieldtext.vert b/src/extras/shaders/rhi/distancefieldtext.vert
index f6743001c..02efc898f 100644
--- a/src/extras/shaders/rhi/distancefieldtext.vert
+++ b/src/extras/shaders/rhi/distancefieldtext.vert
@@ -1,13 +1,20 @@
-#version 150 core
+#version 450
-in vec3 vertexPosition;
-in vec2 vertexTexCoord;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec2 vertexTexCoord;
-out vec2 texCoord;
-out float zValue;
+layout(location = 0) out vec2 texCoord;
+layout(location = 1) out float zValue;
-uniform mat4 modelView;
-uniform mat4 mvp;
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
void main()
{
diff --git a/src/extras/shaders/rhi/gooch.frag b/src/extras/shaders/rhi/gooch.frag
index 168a862f8..8a0a32f18 100644
--- a/src/extras/shaders/rhi/gooch.frag
+++ b/src/extras/shaders/rhi/gooch.frag
@@ -1,22 +1,70 @@
-#version 150 core
+#version 450
+
+layout(location = 0) in vec3 worldPosition;
+layout(location = 1) in vec3 worldNormal;
+
+layout(location = 0) out vec4 fragColor;
+
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform qt3d_custom_uniforms {
+ vec3 kd; // Diffuse reflectivity
+ vec3 ks; // Specular reflectivity
+ vec3 kblue; // Cool color
+ vec3 kyellow; // Warm color
+ float alpha; // Fraction of diffuse added to kblue
+ float beta; // Fraction of diffuse added to kyellow
+ float shininess; // Specular shininess factor
+};
+
+const int MAX_LIGHTS = 8;
+const int TYPE_POINT = 0;
+const int TYPE_DIRECTIONAL = 1;
+const int TYPE_SPOT = 2;
+
+struct Light {
+ int type;
+ vec3 position;
+ vec3 color;
+ float intensity;
+ vec3 direction;
+ float constantAttenuation;
+ float linearAttenuation;
+ float quadraticAttenuation;
+ float cutOffAngle;
+};
+
+layout(std140, binding = 3) uniform qt3d_light_uniforms {
+ uniform Light lights[MAX_LIGHTS];
+ uniform int lightCount;
+ uniform int envLightCount;
+};
-// TODO: Replace with a struct
-uniform vec3 kd; // Diffuse reflectivity
-uniform vec3 ks; // Specular reflectivity
-uniform vec3 kblue; // Cool color
-uniform vec3 kyellow; // Warm color
-uniform float alpha; // Fraction of diffuse added to kblue
-uniform float beta; // Fraction of diffuse added to kyellow
-uniform float shininess; // Specular shininess factor
-
-uniform vec3 eyePosition;
-
-in vec3 worldPosition;
-in vec3 worldNormal;
-
-out vec4 fragColor;
-
-#pragma include light.inc.frag
vec3 goochModel( const in vec3 pos, const in vec3 n )
{
diff --git a/src/extras/shaders/rhi/gooch.vert b/src/extras/shaders/rhi/gooch.vert
index 5230fb70e..0da69bce5 100644
--- a/src/extras/shaders/rhi/gooch.vert
+++ b/src/extras/shaders/rhi/gooch.vert
@@ -1,14 +1,20 @@
-#version 150 core
+#version 450
-in vec3 vertexPosition;
-in vec3 vertexNormal;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec3 vertexNormal;
-out vec3 worldPosition;
-out vec3 worldNormal;
+layout(location = 0) out vec3 worldPosition;
+layout(location = 1) out vec3 worldNormal;
-uniform mat4 modelMatrix;
-uniform mat3 modelNormalMatrix;
-uniform mat4 mvp;
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
void main()
{
diff --git a/src/extras/shaders/rhi/light.inc.frag b/src/extras/shaders/rhi/light.inc.frag
index 861e1ba4a..8079ae8a3 100644
--- a/src/extras/shaders/rhi/light.inc.frag
+++ b/src/extras/shaders/rhi/light.inc.frag
@@ -1,24 +1,26 @@
+#pragma include defaultuniforms.inc
+
const int MAX_LIGHTS = 8;
const int TYPE_POINT = 0;
const int TYPE_DIRECTIONAL = 1;
const int TYPE_SPOT = 2;
+
struct Light {
- int type;
vec3 position;
- vec3 color;
float intensity;
- vec3 direction;
+ vec3 color;
float constantAttenuation;
+ vec3 direction;
float linearAttenuation;
float quadraticAttenuation;
float cutOffAngle;
+ int type;
};
-
layout(std140, binding = auto) uniform qt3d_light_uniforms {
- uniform Light lights[MAX_LIGHTS];
- uniform int lightCount;
- uniform int envLightCount;
+ Light lights[MAX_LIGHTS];
+ int lightCount;
+ int envLightCount;
};
// Pre-convolved environment maps
diff --git a/src/extras/shaders/rhi/metalrough.inc.frag b/src/extras/shaders/rhi/metalrough.inc.frag
index cf85f3b22..817e1192c 100644
--- a/src/extras/shaders/rhi/metalrough.inc.frag
+++ b/src/extras/shaders/rhi/metalrough.inc.frag
@@ -48,11 +48,6 @@
**
****************************************************************************/
-// Exposure correction
-uniform float exposure = 0.0;
-// Gamma correction
-uniform float gamma = 2.2;
-
#pragma include light.inc.frag
int mipLevelCount(const in samplerCube cube)
diff --git a/src/extras/shaders/rhi/morphphong.vert b/src/extras/shaders/rhi/morphphong.vert
index 7a8bdd097..826145b20 100644
--- a/src/extras/shaders/rhi/morphphong.vert
+++ b/src/extras/shaders/rhi/morphphong.vert
@@ -1,17 +1,26 @@
-#version 150 core
+#version 450
-in vec3 vertexPosition;
-in vec3 vertexNormal;
-in vec3 vertexPositionTarget;
-in vec3 vertexNormalTarget;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec3 vertexNormal;
+layout(location = 2) in vec3 vertexPositionTarget;
+layout(location = 3) in vec3 vertexNormalTarget;
-out vec3 worldPosition;
-out vec3 worldNormal;
+layout(location = 0) out vec3 worldPosition;
+layout(location = 1) out vec3 worldNormal;
-uniform mat4 modelMatrix;
-uniform mat3 modelNormalMatrix;
-uniform mat4 modelViewProjection;
-uniform float interpolator;
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 3) uniform qt3d_morph_uniforms {
+ float interpolator;
+};
void main()
{
diff --git a/src/extras/shaders/rhi/pervertexcolor.frag b/src/extras/shaders/rhi/pervertexcolor.frag
index 40fc066d6..da3ea149e 100644
--- a/src/extras/shaders/rhi/pervertexcolor.frag
+++ b/src/extras/shaders/rhi/pervertexcolor.frag
@@ -1,14 +1,147 @@
-#version 150 core
+#version 450
-in vec3 worldPosition;
-in vec3 worldNormal;
-in vec4 color;
+layout(location = 0) in vec3 worldPosition;
+layout(location = 1) in vec3 worldNormal;
+layout(location = 2) in vec4 color;
-out vec4 fragColor;
+layout(location = 0) out vec4 fragColor;
-uniform vec3 eyePosition;
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
-#pragma include phong.inc.frag
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+const int MAX_LIGHTS = 8;
+const int TYPE_POINT = 0;
+const int TYPE_DIRECTIONAL = 1;
+const int TYPE_SPOT = 2;
+
+struct Light {
+ int type;
+ vec3 position;
+ vec3 color;
+ float intensity;
+ vec3 direction;
+ float constantAttenuation;
+ float linearAttenuation;
+ float quadraticAttenuation;
+ float cutOffAngle;
+};
+
+layout(std140, binding = 2) uniform qt3d_light_uniforms {
+ uniform Light lights[MAX_LIGHTS];
+ uniform int lightCount;
+ uniform int envLightCount;
+};
+
+void adsModel(const in vec3 worldPos,
+ const in vec3 worldNormal,
+ const in vec3 worldView,
+ const in float shininess,
+ out vec3 diffuseColor,
+ out vec3 specularColor)
+{
+ diffuseColor = vec3(0.0);
+ specularColor = vec3(0.0);
+
+ // We perform all work in world space
+ vec3 n = normalize(worldNormal);
+ vec3 s = vec3(0.0);
+
+ for (int i = 0; i < lightCount; ++i) {
+ float att = 1.0;
+ float sDotN = 0.0;
+
+ if (lights[i].type != TYPE_DIRECTIONAL) {
+ // Point and Spot lights
+
+ // Light position is already in world space
+ vec3 sUnnormalized = lights[i].position - worldPos;
+ s = normalize(sUnnormalized); // Light direction
+
+ // Calculate the attenuation factor
+ sDotN = dot(s, n);
+ if (sDotN > 0.0) {
+ if (lights[i].constantAttenuation != 0.0
+ || lights[i].linearAttenuation != 0.0
+ || lights[i].quadraticAttenuation != 0.0) {
+ float dist = length(sUnnormalized);
+ att = 1.0 / (lights[i].constantAttenuation +
+ lights[i].linearAttenuation * dist +
+ lights[i].quadraticAttenuation * dist * dist);
+ }
+
+ // The light direction is in world space already
+ if (lights[i].type == TYPE_SPOT) {
+ // Check if fragment is inside or outside of the spot light cone
+ if (degrees(acos(dot(-s, lights[i].direction))) > lights[i].cutOffAngle)
+ sDotN = 0.0;
+ }
+ }
+ } else {
+ // Directional lights
+ // The light direction is in world space already
+ s = normalize(-lights[i].direction);
+ sDotN = dot(s, n);
+ }
+
+ // Calculate the diffuse factor
+ float diffuse = max(sDotN, 0.0);
+
+ // Calculate the specular factor
+ float specular = 0.0;
+ if (diffuse > 0.0 && shininess > 0.0) {
+ float normFactor = (shininess + 2.0) / 2.0;
+ vec3 r = reflect(-s, n); // Reflection direction in world space
+ specular = normFactor * pow(max(dot(r, worldView), 0.0), shininess);
+ }
+
+ // Accumulate the diffuse and specular contributions
+ diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
+ specularColor += att * lights[i].intensity * specular * lights[i].color;
+ }
+}
+
+vec4 phongFunction(const in vec4 ambient,
+ const in vec4 diffuse,
+ const in vec4 specular,
+ const in float shininess,
+ const in vec3 worldPosition,
+ const in vec3 worldView,
+ const in vec3 worldNormal)
+{
+ // Calculate the lighting model, keeping the specular component separate
+ vec3 diffuseColor, specularColor;
+ adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor);
+
+ // Combine spec with ambient+diffuse for final fragment color
+ vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb
+ + specularColor * specular.rgb;
+
+ return vec4(color, diffuse.a);
+}
void main()
{
diff --git a/src/extras/shaders/rhi/pervertexcolor.vert b/src/extras/shaders/rhi/pervertexcolor.vert
index 1d721e945..3ae1c9fb0 100644
--- a/src/extras/shaders/rhi/pervertexcolor.vert
+++ b/src/extras/shaders/rhi/pervertexcolor.vert
@@ -1,16 +1,22 @@
-#version 150 core
+#version 450
-in vec3 vertexPosition;
-in vec3 vertexNormal;
-in vec4 vertexColor;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec3 vertexNormal;
+layout(location = 2) in vec4 vertexColor;
-out vec3 worldPosition;
-out vec3 worldNormal;
-out vec4 color;
+layout(location = 0) out vec3 worldPosition;
+layout(location = 1) out vec3 worldNormal;
+layout(location = 2) out vec4 color;
-uniform mat4 modelMatrix;
-uniform mat3 modelNormalMatrix;
-uniform mat4 mvp;
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
void main()
{
diff --git a/src/extras/shaders/rhi/skybox.frag b/src/extras/shaders/rhi/skybox.frag
index ceb13b628..649894b15 100644
--- a/src/extras/shaders/rhi/skybox.frag
+++ b/src/extras/shaders/rhi/skybox.frag
@@ -1,13 +1,33 @@
-#version 330
+#version 450
+
+layout(location = 0) in vec3 texCoord0;
+layout(location = 0) out vec4 fragColor;
-in vec3 texCoord0;
-out vec4 fragColor;
-uniform samplerCube skyboxTexture;
// Gamma correction
-uniform float gamma = 2.2;
-uniform float gammaStrength;
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 2) uniform qt3d_morph_uniforms {
+ float gammaStrength;
+};
+
+layout(binding = 3) uniform samplerCube skyboxTexture;
vec3 gammaCorrect(const in vec3 color)
{
diff --git a/src/extras/shaders/rhi/skybox.vert b/src/extras/shaders/rhi/skybox.vert
index cac49893a..8f3de6f62 100644
--- a/src/extras/shaders/rhi/skybox.vert
+++ b/src/extras/shaders/rhi/skybox.vert
@@ -1,11 +1,34 @@
-#version 330
+#version 450
-in vec3 vertexPosition;
-out vec3 texCoord0;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 0) out vec3 texCoord0;
-uniform mat4 modelMatrix;
-uniform mat4 viewMatrix;
-uniform mat4 projectionMatrix;
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
void main()
{
diff --git a/src/extras/shaders/rhi/unlittexture.frag b/src/extras/shaders/rhi/unlittexture.frag
index 8abbeee8f..e2b2c8fe2 100644
--- a/src/extras/shaders/rhi/unlittexture.frag
+++ b/src/extras/shaders/rhi/unlittexture.frag
@@ -1,11 +1,11 @@
-#version 150 core
+#version 450
-uniform sampler2D diffuseTexture;
+layout(location = 0) in vec3 position;
+layout(location = 1) in vec2 texCoord;
-in vec3 position;
-in vec2 texCoord;
+layout(location = 0) out vec4 fragColor;
-out vec4 fragColor;
+layout(binding = 3) uniform sampler2D diffuseTexture;
void main()
{
diff --git a/src/extras/shaders/rhi/unlittexture.vert b/src/extras/shaders/rhi/unlittexture.vert
index 7e245bd7f..08f06e817 100644
--- a/src/extras/shaders/rhi/unlittexture.vert
+++ b/src/extras/shaders/rhi/unlittexture.vert
@@ -1,14 +1,41 @@
-#version 150 core
+#version 450
-in vec3 vertexPosition;
-in vec2 vertexTexCoord;
+layout(location = 0) in vec3 vertexPosition;
+layout(location = 1) in vec2 vertexTexCoord;
-out vec3 position;
-out vec2 texCoord;
+layout(location = 0) out vec3 position;
+layout(location = 1) out vec2 texCoord;
-uniform mat4 modelView;
-uniform mat4 mvp;
-uniform mat3 texCoordTransform;
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelView;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 mvp;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform qt3d_custom_uniforms {
+ mat3 texCoordTransform;
+};
void main()
{
diff --git a/src/plugins/renderers/rhi/graphicshelpers/submissioncontext.cpp b/src/plugins/renderers/rhi/graphicshelpers/submissioncontext.cpp
index 1f243e37b..eac49f01a 100644
--- a/src/plugins/renderers/rhi/graphicshelpers/submissioncontext.cpp
+++ b/src/plugins/renderers/rhi/graphicshelpers/submissioncontext.cpp
@@ -498,6 +498,10 @@ SubmissionContext::SubmissionContext()
{
static_contexts[m_id] = this;
m_contextInfo.m_api = QGraphicsApiFilter::RHI;
+
+ // We set those version numbers because QShaderGenerator wants major > 0
+ m_contextInfo.m_major = 1;
+ m_contextInfo.m_minor = 0;
}
SubmissionContext::~SubmissionContext()
@@ -1630,6 +1634,7 @@ SubmissionContext::ShaderCreationInfo SubmissionContext::createShaderProgram(RHI
{QShader::MslShader, QShaderVersion(12)},
});
+
b.setGeneratedShaderVariants({QShader::Variant{},
#ifndef QT_NO_OPENGL
QShader::Variant{},
@@ -1637,6 +1642,7 @@ SubmissionContext::ShaderCreationInfo SubmissionContext::createShaderProgram(RHI
QShader::Variant{},
QShader::Variant{}});
+
// TODO handle caching as QShader does not have a built-in mechanism for that
QString logs;
bool success = true;
@@ -1650,7 +1656,7 @@ SubmissionContext::ShaderCreationInfo SubmissionContext::createShaderProgram(RHI
b.setSourceString(shaderCode.at(i), rhiStage);
QShader bakedShader = b.bake();
if (b.errorMessage() != QString() || !bakedShader.isValid()) {
- qDebug() << "Shader Error: " << b.errorMessage();
+ qDebug() << "Shader Error: " << b.errorMessage() << shaderCode.at(i).data() << rhiStage;
logs += b.errorMessage();
success = false;
}
diff --git a/src/plugins/renderers/rhi/managers/rhihandle_types_p.h b/src/plugins/renderers/rhi/managers/rhihandle_types_p.h
index 946d94a38..2e74131e1 100644
--- a/src/plugins/renderers/rhi/managers/rhihandle_types_p.h
+++ b/src/plugins/renderers/rhi/managers/rhihandle_types_p.h
@@ -76,9 +76,9 @@ typedef Qt3DCore::QHandle<RHIGraphicsPipeline> HRHIGraphicsPipeline;
} // namespace Qt3DRender
#if defined(_MSC_VER)
-#define RHI_UNIMPLEMENTED do { qDebug() << "Unimplemented: " << __FUNCSIG__; } while (0)
+#define RHI_UNIMPLEMENTED // do { qDebug() << "Unimplemented: " << __FUNCSIG__; } while (0)
#else
-#define RHI_UNIMPLEMENTED do { qDebug() << "Unimplemented: " << __PRETTY_FUNCTION__; } while (0)
+#define RHI_UNIMPLEMENTED // do { qDebug() << "Unimplemented: " << __PRETTY_FUNCTION__; } while (0)
#endif
QT_END_NAMESPACE
diff --git a/src/plugins/renderers/rhi/renderer/rendercommand_p.h b/src/plugins/renderers/rhi/renderer/rendercommand_p.h
index e848ae593..f4031b711 100644
--- a/src/plugins/renderers/rhi/renderer/rendercommand_p.h
+++ b/src/plugins/renderers/rhi/renderer/rendercommand_p.h
@@ -68,8 +68,6 @@ QT_BEGIN_NAMESPACE
class QRhiGraphicsPipeline;
class QRhiShaderResourceBindings;
-class QOpenGLVertexArrayObject;
-
namespace Qt3DRender {
namespace Render {
@@ -87,11 +85,12 @@ struct CommandUBO
float modelMatrix[16];
float inverseModelMatrix[16];
float modelViewMatrix[16];
+ float modelNormalMatrix[12];
float inverseModelViewMatrix[16];
float mvp[16];
float inverseModelViewProjectionMatrix[16];
};
-static_assert(sizeof(CommandUBO) == 6 * (16 * sizeof(float)), "UBO doesn't match std140");
+static_assert(sizeof(CommandUBO) == 6 * (16 * sizeof(float)) + 1 * (12 * sizeof(float)), "UBO doesn't match std140");
class Q_AUTOTEST_EXPORT RenderCommand
{
diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp
index a17d9b115..03d72e010 100644
--- a/src/plugins/renderers/rhi/renderer/renderer.cpp
+++ b/src/plugins/renderers/rhi/renderer/renderer.cpp
@@ -706,6 +706,8 @@ void Renderer::doRender(bool swapBuffers)
const bool queueIsComplete = m_renderQueue->isFrameQueueComplete();
const bool queueIsEmpty = m_renderQueue->targetRenderViewCount() == 0;
+ bool mustCleanResources = false;
+
// When using synchronous rendering (QtQuick)
// We are not sure that the frame queue is actually complete
// Since a call to render may not be synched with the completions
@@ -770,7 +772,7 @@ void Renderer::doRender(bool swapBuffers)
submissionData = submitRenderViews(rhiPassesInfo);
// Perform any required cleanup of the Graphics resources (Buffers deleted, Shader deleted...)
- cleanGraphicsResources();
+ mustCleanResources = true;
}
}
@@ -813,6 +815,9 @@ void Renderer::doRender(bool swapBuffers)
&& surfaceLock.isSurfaceValid()
&& m_shouldSwapBuffers;
m_submissionContext->endDrawing(swapBuffers);
+
+ if (mustCleanResources)
+ cleanGraphicsResources();
}
}
@@ -922,10 +927,17 @@ void Renderer::updateGraphicsPipeline(RenderCommand& cmd, RenderView *rv, int re
}
// Try to retrieve existing pipeline
+ auto& pipelineManager = *m_RHIResourceManagers->rhiGraphicsPipelineManager();
const GraphicsPipelineIdentifier pipelineKey { cmd.m_geometry, cmd.m_shaderId, renderViewIndex };
- RHIGraphicsPipeline *graphicsPipeline = m_RHIResourceManagers->rhiGraphicsPipelineManager()->getOrCreateResource(pipelineKey);
+ RHIGraphicsPipeline *graphicsPipeline = pipelineManager.getOrCreateResource(pipelineKey);
// TO DO: Ensure we find a way to know when the state is dirty to trigger a rebuild
+ if (!graphicsPipeline) {
+ qDebug() << "Warning : could not create a graphics pipeline";
+ RHIGraphicsPipeline *graphicsPipeline = m_RHIResourceManagers->rhiGraphicsPipelineManager()->getOrCreateResource(pipelineKey);
+ return;
+ }
+
// Increase score so that we know the pipeline was used for this frame and shouldn't be destroyed
graphicsPipeline->increaseScore();
@@ -966,7 +978,7 @@ void Renderer::updateGraphicsPipeline(RenderCommand& cmd, RenderView *rv, int re
auto handle = m_RHIResourceManagers->rhiBufferManager()->allocateResource();
RHIBuffer *ubo = m_RHIResourceManagers->rhiBufferManager()->data(handle);
Q_ASSERT(ubo);
- const QByteArray rawData(block.m_size, '0');
+ const QByteArray rawData(block.m_size, '\0');
ubo->allocate(m_submissionContext.data(), rawData, true);
ok = ubo->bind(m_submissionContext.data(), RHIBuffer::UniformBuffer);
uboBuffers[block.m_binding] = {handle, ubo};
@@ -1139,7 +1151,8 @@ void Renderer::updateGraphicsPipeline(RenderCommand& cmd, RenderView *rv, int re
}
// Record RHIGraphicsPipeline into command for later use
- cmd.pipeline = graphicsPipeline;
+ if (graphicsPipeline && graphicsPipeline->pipeline())
+ cmd.pipeline = graphicsPipeline;
}
// When this function is called, we must not be processing the commands for frame n+1
@@ -2141,7 +2154,6 @@ bool Renderer::uploadBuffersForCommand(QRhiCommandBuffer *cb, const RenderView *
}
for (const BlockToUBO& pack : command.m_parameterPack.uniformBuffers()) {
- qDebug() << pack.m_bufferID;
Buffer *cpuBuffer = nodeManagers()->bufferManager()->lookupResource(pack.m_bufferID);
RHIBuffer *ubo = m_submissionContext->rhiBufferForRenderBuffer(cpuBuffer);
ubo->bind(&*m_submissionContext, RHIBuffer::UniformBuffer);
@@ -2150,6 +2162,77 @@ bool Renderer::uploadBuffersForCommand(QRhiCommandBuffer *cb, const RenderView *
return true;
}
+namespace
+{
+void printUpload(const UniformValue& value,
+ const QShaderDescription::BlockVariable& member)
+{
+ switch (member.type)
+ {
+ case QShaderDescription::VariableType::Int:
+ qDebug() << "Updating" << member.name << "with int data: " << *value.constData<int>() << " (offset: " << member.offset << ", size: " << member.size << ")";
+ break;
+ case QShaderDescription::VariableType::Float:
+ qDebug() << "Updating" << member.name << "with float data: " << *value.constData<float>() << " (offset: " << member.offset << ", size: " << member.size << ")";
+ break;
+ case QShaderDescription::VariableType::Vec2:
+ qDebug() << "Updating" << member.name << "with vec2 data: "
+ << value.constData<float>()[0] << ", "
+ << value.constData<float>()[1] << " (offset: " << member.offset << ", size: " << member.size << ")";
+ ;
+ break;
+ case QShaderDescription::VariableType::Vec3:
+ qDebug() << "Updating" << member.name << "with vec3 data: "
+ << value.constData<float>()[0] << ", "
+ << value.constData<float>()[1] << ", "
+ << value.constData<float>()[2] << " (offset: " << member.offset << ", size: " << member.size << ")";
+ ;
+ break;
+ case QShaderDescription::VariableType::Vec4:
+ qDebug() << "Updating" << member.name << "with vec4 data: "
+ << value.constData<float>()[0] << ", "
+ << value.constData<float>()[1] << ", "
+ << value.constData<float>()[2] << ", "
+ << value.constData<float>()[3] << " (offset: " << member.offset << ", size: " << member.size << ")";
+ ;
+ break;
+ default:
+ qDebug() << "Updating" << member.name << "with data: " << value.constData<char>();
+ break;
+ }
+}
+
+void uploadUniform(
+ SubmissionContext& submissionContext,
+ const PackUniformHash &uniforms,
+ const RHIShader::UBO_Member& uboMember,
+ const QHash<int, RHIGraphicsPipeline::UBOBuffer>& uboBuffers,
+ const QString& uniformName,
+ const QShaderDescription::BlockVariable& member)
+{
+ const int uniformNameId = StringToInt::lookupId(uniformName);
+
+ if (!uniforms.contains(uniformNameId))
+ return;
+
+ const UniformValue value = uniforms.value(uniformNameId);
+ const ShaderUniformBlock block = uboMember.block;
+
+ // Update UBO with uniform value
+ Q_ASSERT(uboBuffers.contains(block.m_binding));
+ const RHIGraphicsPipeline::UBOBuffer& ubo = uboBuffers[block.m_binding];
+ RHIBuffer *buffer = ubo.buffer;
+
+ // TODO we should maybe have this thread_local to not reallocate memory every time
+ QByteArray rawData;
+ rawData.resize(member.size);
+ memcpy(rawData.data(), value.constData<char>(), std::min(value.byteSize(), member.size));
+ buffer->update(&submissionContext, rawData, member.offset);
+
+ // printUpload(value, member);
+}
+}
+
bool Renderer::uploadUBOsForCommand(QRhiCommandBuffer *cb, const RenderView *rv, const RenderCommand &command)
{
RHIGraphicsPipeline *pipeline = command.pipeline;
@@ -2170,41 +2253,39 @@ bool Renderer::uploadUBOsForCommand(QRhiCommandBuffer *cb, const RenderView *rv,
if (!shader)
return true;
- const QVector<RHIShader::UBO_Member> uboMembers = shader->uboMembers();
- const QHash<int, RHIGraphicsPipeline::UBOBuffer> uboBuffers = pipeline->ubos();
+ const QVector<RHIShader::UBO_Member>& uboMembers = shader->uboMembers();
+ const QHash<int, RHIGraphicsPipeline::UBOBuffer>& uboBuffers = pipeline->ubos();
const ShaderParameterPack &parameterPack = command.m_parameterPack;
const PackUniformHash &uniforms = parameterPack.uniforms();
// Update Buffer CPU side data based on uniforms being set
for (const RHIShader::UBO_Member &uboMember : uboMembers) {
- const QVector<QShaderDescription::BlockVariable> members = uboMember.members;
- for (const QShaderDescription::BlockVariable &member : members) {
- const int uniformNameId = StringToInt::lookupId(member.name);
-
-
- // Check if key is found in one of the custom UBOs
- if (uniforms.contains(uniformNameId)) {
- const UniformValue value = uniforms.value(uniformNameId);
- const ShaderUniformBlock block = uboMember.block;
-
- // Update UBO with uniform value
- Q_ASSERT(uboBuffers.contains(block.m_binding));
- const RHIGraphicsPipeline::UBOBuffer& ubo = uboBuffers[block.m_binding];
- RHIBuffer *buffer = ubo.buffer;
-
- // TODO we should maybe have this thread_local to not reallocate memory every time
- QByteArray rawData;
- rawData.resize(member.size);
- memcpy(rawData.data(), value.constData<char *>(), std::min(value.byteSize(), member.size));
- buffer->update(m_submissionContext.data(), rawData, member.offset);
- qDebug() << "Updating" << member.name << "with" << rawData;
+ for (const QShaderDescription::BlockVariable &member : qAsConst(uboMember.members)) {
+
+ if (!member.arrayDims.empty()) {
+ if (!member.structMembers.empty()) {
+ const int arr0 = member.arrayDims[0];
+ for (int i = 0; i < arr0; i++) {
+ for (const QShaderDescription::BlockVariable& structMember : member.structMembers) {
+ const QString processedName = member.name + "[" + QString::number(i) + "]." + structMember.name;
+ uploadUniform(*m_submissionContext, uniforms, uboMember, uboBuffers, processedName, structMember);
+ }
+ }
+ } else {
+ uploadUniform(*m_submissionContext, uniforms, uboMember, uboBuffers, member.name, member);
+ }
+ }
+ else
+ {
+ uploadUniform(*m_submissionContext, uniforms, uboMember, uboBuffers, member.name, member);
}
}
}
// Upload changes to GPU Buffer
- for (const RHIGraphicsPipeline::UBOBuffer& ubo : uboBuffers)
+ for (const RHIGraphicsPipeline::UBOBuffer& ubo : uboBuffers) {
// Binding triggers the upload
ubo.buffer->bind(m_submissionContext.data(), RHIBuffer::UniformBuffer);
+ }
}
return true;
}
@@ -2351,12 +2432,14 @@ void Renderer::cleanGraphicsResources()
// Remove unused GraphicsPipeline
RHIGraphicsPipelineManager *pipelineManager = m_RHIResourceManagers->rhiGraphicsPipelineManager();
const QVector<HRHIGraphicsPipeline> graphicsPipelinesHandles = pipelineManager->activeHandles();
- for (const HRHIGraphicsPipeline &pipelineHandle : graphicsPipelinesHandles) {
+ for (HRHIGraphicsPipeline pipelineHandle : graphicsPipelinesHandles) {
RHIGraphicsPipeline *pipeline = pipelineManager->data(pipelineHandle);
pipeline->decreaseScore();
// Pipeline wasn't used recently, let's destroy it
if (pipeline->score() < 0)
- pipelineManager->release(pipelineHandle);
+ {
+ pipeline->cleanup();
+ }
}
// Clean buffers
diff --git a/src/plugins/renderers/rhi/renderer/renderer_p.h b/src/plugins/renderers/rhi/renderer/renderer_p.h
index a337f267b..780b23ac2 100644
--- a/src/plugins/renderers/rhi/renderer/renderer_p.h
+++ b/src/plugins/renderers/rhi/renderer/renderer_p.h
@@ -422,6 +422,7 @@ private:
bool uploadBuffersForCommand(QRhiCommandBuffer *cb, const RenderView *rv, RenderCommand &command);
bool uploadUBOsForCommand(QRhiCommandBuffer *cb, const RenderView *rv, const RenderCommand &command);
bool performDraw(QRhiCommandBuffer *cb, const QRhiViewport& vp, const QRhiScissor* scissor, const RenderCommand &command);
+
};
} // namespace Rhi
diff --git a/src/plugins/renderers/rhi/renderer/renderview.cpp b/src/plugins/renderers/rhi/renderer/renderview.cpp
index df6345896..49a7c2d9e 100644
--- a/src/plugins/renderers/rhi/renderer/renderview.cpp
+++ b/src/plugins/renderers/rhi/renderer/renderview.cpp
@@ -479,6 +479,7 @@ void RenderView::sort()
// For RenderCommand with the same shader
// We compute the adjacent change cost
+ /*
// Minimize uniform changes
int i = 0;
const int commandSize = m_commands.size();
@@ -523,6 +524,7 @@ void RenderView::sort()
}
}
}
+ */
}
void RenderView::setRenderer(Renderer *renderer)
@@ -864,6 +866,7 @@ void RenderView::updateRenderCommand(EntityRenderCommandData *renderCommandData,
// Update CommandUBO (Qt3D standard uniforms)
const Matrix4x4 worldTransform = *(entity->worldTransform());
const Matrix4x4 inverseWorldTransform = worldTransform.inverted();
+ const QMatrix3x3 modelNormalMatrix = convertToQMatrix4x4(worldTransform).normalMatrix();
const Matrix4x4 modelViewMatrix = m_data.m_viewMatrix * worldTransform;
const Matrix4x4 inverseModelViewMatrix = modelViewMatrix.inverted();
const Matrix4x4 mvp = projectionMatrix * modelViewMatrix;
@@ -872,6 +875,20 @@ void RenderView::updateRenderCommand(EntityRenderCommandData *renderCommandData,
memcpy(&command.m_commandUBO.modelMatrix, &worldTransform, sizeof(Matrix4x4));
memcpy(&command.m_commandUBO.inverseModelMatrix, &inverseWorldTransform, sizeof(Matrix4x4));
memcpy(&command.m_commandUBO.modelViewMatrix, &modelViewMatrix, sizeof(Matrix4x4));
+ {
+ float (& normal)[12] = command.m_commandUBO.modelNormalMatrix;
+ normal[0] = modelNormalMatrix.constData()[0 * 3 + 0];
+ normal[1] = modelNormalMatrix.constData()[0 * 3 + 1];
+ normal[2] = modelNormalMatrix.constData()[0 * 3 + 2];
+
+ normal[4] = modelNormalMatrix.constData()[1 * 3 + 0];
+ normal[5] = modelNormalMatrix.constData()[1 * 3 + 1];
+ normal[6] = modelNormalMatrix.constData()[1 * 3 + 2];
+
+ normal[8] = modelNormalMatrix.constData()[2 * 3 + 0];
+ normal[9] = modelNormalMatrix.constData()[2 * 3 + 1];
+ normal[10] = modelNormalMatrix.constData()[2 * 3 + 2];
+ }
memcpy(&command.m_commandUBO.inverseModelViewMatrix, &inverseModelViewMatrix, sizeof(Matrix4x4));
memcpy(&command.m_commandUBO.mvp, &mvp, sizeof(Matrix4x4));
memcpy(&command.m_commandUBO.inverseModelViewProjectionMatrix, &inverseModelViewProjection, sizeof(Matrix4x4));
@@ -1148,8 +1165,8 @@ void RenderView::setShaderAndUniforms(RenderCommand *command,
} else {
// with some drivers, samplers (like the envbox sampler) need to be bound even though
// they may not be actually used, otherwise draw calls can fail
- static const int irradianceId = StringToInt::lookupId(QLatin1String("envLight.irradiance"));
- static const int specularId = StringToInt::lookupId(QLatin1String("envLight.specular"));
+ static const int irradianceId = StringToInt::lookupId(QLatin1String("envLight_irradiance"));
+ static const int specularId = StringToInt::lookupId(QLatin1String("envLight_specular"));
// setUniformValue(command->m_parameterPack, irradianceId, m_renderer->submissionContext()->maxTextureUnitsCount());
// setUniformValue(command->m_parameterPack, specularId, m_renderer->submissionContext()->maxTextureUnitsCount());
}
diff --git a/src/plugins/renderers/rhi/renderer/rhigraphicspipeline.cpp b/src/plugins/renderers/rhi/renderer/rhigraphicspipeline.cpp
index 62da8aa12..19fd39d8e 100644
--- a/src/plugins/renderers/rhi/renderer/rhigraphicspipeline.cpp
+++ b/src/plugins/renderers/rhi/renderer/rhigraphicspipeline.cpp
@@ -68,6 +68,9 @@ void RHIGraphicsPipeline::cleanup()
m_rvUbo = nullptr;
m_cmdUbo = nullptr;
m_pipeline = nullptr;
+ m_shaderResourceBindings = nullptr;
+ m_ubos.clear();
+ m_attributeNameIdToBindingIndex.clear();
}
} // Rhi
diff --git a/src/render/materialsystem/prototypes/default.json b/src/render/materialsystem/prototypes/default.json
index 6a25477e0..dfa51898f 100644
--- a/src/render/materialsystem/prototypes/default.json
+++ b/src/render/materialsystem/prototypes/default.json
@@ -36,8 +36,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "$type $value = $name;",
"headerSnippets": [ "add-input $qualifier $type $name" ]
@@ -71,6 +71,14 @@
"minor": 0
},
"substitution": "$type $value = $type($constant);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $value = $type($constant);"
}
]
},
@@ -115,8 +123,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "vec4 $color = texture($name, $coord);",
"headerSnippets": [ "add-sampler sampler2D $name" ]
@@ -157,8 +165,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "fragColor = $fragColor;",
"headerSnippets": [ "layout(location = 0) out vec4 fragColor;" ]
@@ -191,11 +199,11 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "vec3 $eyePosition = eyePosition;",
- "headerSnippets": [ "add-uniform vec3 eyePosition" ]
+ "headerSnippets": [ ]
}
]
},
@@ -225,8 +233,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "float $time = time;",
"headerSnippets": [ "add-uniform float time" ]
@@ -262,6 +270,14 @@
"minor": 0
},
"substitution": "$type $output = transpose($input);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = transpose($input);"
}
]
},
@@ -294,6 +310,14 @@
"minor": 0
},
"substitution": "$type $output = normalize($input);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = normalize($input);"
}
]
},
@@ -327,6 +351,14 @@
"minor": 0
},
"substitution": "$type $difference = $minuend - $subtrahend;"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $difference = $minuend - $subtrahend;"
}
]
},
@@ -360,6 +392,14 @@
"minor": 0
},
"substitution": "$type $sum = $first + $second;"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $sum = $first + $second;"
}
]
},
@@ -393,6 +433,14 @@
"minor": 0
},
"substitution": "$type $product = $first * $second;"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $product = $first * $second;"
}
]
},
@@ -426,6 +474,14 @@
"minor": 0
},
"substitution": "$type $output = $input.$fields;"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = $input.$fields;"
}
]
},
@@ -468,8 +524,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "mat3 $matrix = calcWorldSpaceToTangentSpaceMatrix($worldNormal, $worldTangent);",
"headerSnippets": [ "#pragma include :/shaders/rhi/coordinatesystems.inc" ]
@@ -511,8 +567,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "vec4 $outputColor = phongFunction($ambient, $diffuse, $specular, $shininess, $worldPosition, $worldView, $worldNormal);",
"headerSnippets": [ "#pragma include :/shaders/rhi/phong.inc.frag" ]
@@ -554,8 +610,8 @@
{
"format": {
"api": "RHI",
- "major": 4,
- "minor": 5
+ "major": 1,
+ "minor": 0
},
"substitution": "vec4 $outputColor = metalRoughFunction($baseColor, $metalness, $roughness, $ambientOcclusion, $worldPosition, $worldView, $worldNormal);",
"headerSnippets": [ "#pragma include :/shaders/rhi/metalrough.inc.frag" ]
@@ -592,6 +648,14 @@
"minor": 0
},
"substitution": "$type $output = $type($first, $second);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = $type($first, $second);"
}
]
},
@@ -626,6 +690,14 @@
"minor": 0
},
"substitution": "$type $output = $type($first, $second, $third);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = $type($first, $second, $third);"
}
]
},
@@ -661,6 +733,14 @@
"minor": 0
},
"substitution": "$type $output = $type($first, $second, $third, $fourth);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = $type($first, $second, $third, $fourth);"
}
]
},
@@ -693,6 +773,14 @@
"minor": 0
},
"substitution": "$type $output = $type($input);"
+ },
+ {
+ "format": {
+ "api": "RHI",
+ "major": 1,
+ "minor": 0
+ },
+ "substitution": "$type $output = $type($input);"
}
]
}
diff --git a/src/render/materialsystem/shaderbuilder.cpp b/src/render/materialsystem/shaderbuilder.cpp
index 996270b9e..b168756c9 100644
--- a/src/render/materialsystem/shaderbuilder.cpp
+++ b/src/render/materialsystem/shaderbuilder.cpp
@@ -234,6 +234,8 @@ void ShaderBuilder::generateCode(QShaderProgram::ShaderType type)
auto format = QShaderFormat();
format.setApi(m_graphicsApi.m_api == QGraphicsApiFilter::OpenGLES ? QShaderFormat::OpenGLES
+ : m_graphicsApi.m_api == QGraphicsApiFilter::Vulkan ? QShaderFormat::VulkanFlavoredGLSL
+ : m_graphicsApi.m_api == QGraphicsApiFilter::RHI ? QShaderFormat::RHI
: m_graphicsApi.m_profile == QGraphicsApiFilter::CoreProfile ? QShaderFormat::OpenGLCoreProfile
: m_graphicsApi.m_profile == QGraphicsApiFilter::CompatibilityProfile ? QShaderFormat::OpenGLCompatibilityProfile
: QShaderFormat::OpenGLNoProfile);
diff --git a/tests/manual/rhi/main.cpp b/tests/manual/rhi/main.cpp
index 914ebb21b..f80ccc1c8 100644
--- a/tests/manual/rhi/main.cpp
+++ b/tests/manual/rhi/main.cpp
@@ -122,6 +122,7 @@ layout(std140, binding = 1) uniform qt3d_command_uniforms {
mat4 modelMatrix;
mat4 inverseModelMatrix;
mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
mat4 inverseModelViewMatrix;
mat4 mvp;
mat4 inverseModelViewProjectionMatrix;
@@ -158,6 +159,7 @@ layout(std140, binding = 1) uniform qt3d_command_uniforms {
mat4 modelMatrix;
mat4 inverseModelMatrix;
mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
mat4 inverseModelViewMatrix;
mat4 mvp;
mat4 inverseModelViewProjectionMatrix;