Lazlo,

Thank you very much for your reply.

This will definitely definitely help. I will get back here if I don’t make any 
progress in the next couple of days.

Thank you very much!

Best regards,

Nuno

> On 17 Feb 2021, at 11:19, Laszlo Agocs <laszlo.ag...@qt.io> wrote:
> 
> Hi Nuno,
> 
> Check your implementation of type(). It should return something unique for 
> all the different 'source' values (i.e. for every different vertex+fragment 
> shader combinations). Right now, with the same static type object is returns, 
> VSMaterial::createShader() is only ever called once, so all instances of 
> VSMaterial will use the same VSMaterialShader regardless of the different 
> fragment shader code in 'source', which explains the effect you are seeing.
> 
> An example of a dynamic implementation of type() you are looking for can be 
> found in ShaderEffect:
> https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickopenglshadereffectnode.cpp?h=5.15#n389
>  
> <https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickopenglshadereffectnode.cpp?h=5.15#n389>
> https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickopenglshadereffectnode.cpp?h=5.15#n453
>  
> <https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickopenglshadereffectnode.cpp?h=5.15#n453>
> 
> Best regards,
> Laszlo
> 
> From: Interest <interest-boun...@qt-project.org> on behalf of Nuno Santos 
> <nuno.san...@imaginando.pt>
> Sent: Monday, February 15, 2021 3:36 PM
> To: interestqt-project.org <interest@qt-project.org>
> Subject: [Interest] Using QSGMaterial & QSGMaterialShader with multiple 
> shaders
>  
> Hi,
> 
> I’m trying to make a shader gallery using a GridView where the model is an 
> array of shaders path.
> 
> Then, a custom QQuickView, instantiates a custom QSGGeometryNode with a 
> material that extends QSGMaterial. The QSGMaterial creates the shader:
> 
> I’m having a problem though. All the items draw the first shader in the list. 
> Shader A draws everything red, shader B draws everything blue.
> 
> If model = [A, B], the two items show as red, if I swap the model order to 
> [B, A], the two items show blue.
> 
> I’ve added debug and there are classes being instantiated correctly for each 
> item, and the right shader source is being used for each one, but it seems 
> that only the first shader that is passed to the model seems to be loaded or 
> active.
> 
> Is there any gotcha in the way QSGMateria and QSGMaterialShader are used?
> 
> Code for material and material shader are included below.
> 
> Thanks!
> 
> Nuno
> 
> VSMaterial::VSMaterial(QString source) :
>     _source(source)
> {
>     setFlag(RequiresFullMatrixExceptTranslate, true);
>     setFlag(Blending, true);
> }
> 
> int VSMaterial::compare(const QSGMaterial *other) const
> {
>     Q_UNUSED(other)
> 
>     return 0;
> }
> 
> QSGMaterialType *VSMaterial::type() const
> {
>     static QSGMaterialType type;
> 
>     return &type;
> }
> 
> QSGMaterialShader *VSMaterial::createShader() const
> {
>     return new VSMaterialShader(_source);
> }
> 
> VSMaterialShader::VSMaterialShader(QString source)
>     : QSGMaterialShader()
> {
>     setShaderSourceFile(QOpenGLShader::Vertex, 
> QString(":/shaders/rectangle.vert")); 
>     setShaderSourceFile(QOpenGLShader::Fragment, source);
> }
> 
> void VSMaterialShader::updateState(const QSGMaterialShader::RenderState 
> &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
> {
>     Q_UNUSED(newEffect)
> 
>     if (state.isOpacityDirty())
>         program()->setUniformValue(m_opacityLoc, state.opacity());
> 
>     if (state.isMatrixDirty())
>         program()->setUniformValue(m_matrixLoc, state.combinedMatrix());
> 
>     if (oldEffect == 0)
>     {
>         // The viewport is constant, so set the pixel size uniform only once.
>         QRect r = state.viewportRect();
>         program()->setUniformValue(m_pixelSizeLoc, 2.0f / r.width(), 2.0f / 
> r.height());
>     }
> 
>     VSMaterial *material = static_cast<VSMaterial*>(newEffect);
> 
>     program()->setUniformValue(_idPositionX, material->positionX);
>     program()->setUniformValue(_idPositionY, material->positionY);
> }
> 
> const char * const *VSMaterialShader::attributeNames() const
> {
>     static char const *const attributes[] = {
>         "vertex",
>         "vertexColor",
>         "vertexOffset",
>         0
>     };
> 
>     return attributes;
> }
> 
> void VSMaterialShader::initialize()
> {
>     m_matrixLoc = program()->uniformLocation("matrix");
>     m_opacityLoc = program()->uniformLocation("opacity");
>     m_pixelSizeLoc = program()->uniformLocation("pixelSize");
> 
>     _idPositionX = program()->uniformLocation("positionX");
>     _idPositionY = program()->uniformLocation("positionY");
> }

_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to