diff options
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 ¶meterPack = 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; |