diff --git a/src/quick3d/qquick3deffect.cpp b/src/quick3d/qquick3deffect.cpp
index 43284c16b49bcab3a07e542f800e3870c485f334..f09b8bf67e0d3de68248cd4ba2b60765b5161bc1 100644
--- a/src/quick3d/qquick3deffect.cpp
+++ b/src/quick3d/qquick3deffect.cpp
@@ -258,7 +258,15 @@ QSSGRenderGraphObject *QQuick3DEffect::updateSpatialNode(QSSGRenderGraphObject *
         // Properties -> uniforms
         QByteArray uniforms;
         const int propCount = metaObject()->propertyCount();
-        const int propOffset = metaObject()->propertyOffset();
+        int propOffset = metaObject()->propertyOffset();
+
+        // Effect can have multilayered inheritance structure, so find the actual propOffset
+        const QMetaObject *superClass = metaObject()->superClass();
+        while (superClass && qstrcmp(superClass->className(), "QQuick3DEffect") != 0)  {
+            propOffset = superClass->propertyOffset();
+            superClass = superClass->superClass();
+        }
+
         QVector<QMetaProperty> textureProperties; // We'll deal with these later
         for (int i = propOffset; i != propCount; ++i) {
             const auto property = metaObject()->property(i);