{"record":{"id":"70e0974781741666","repo":"stride3d/stride","slug":"non-matching-vertex-buffer-declarations","errorCode":null,"errorMessage":"Non-matching vertex buffer declarations.","messagePattern":"Non-matching vertex buffer declarations\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Rendering/Extensions/MergeExtensions.cs","lineNumber":52,"sourceCode":"            var firstVertexBuffer = firstMeshDrawData.VertexBuffers[0];\n            var hasIndexBuffer = IsIndexed(meshDrawDatas);\n            int totalVertexCount = 0;\n            int totalIndexCount = 0;\n\n            //TODO: extend to non-simple vertex declarations, fill with default values it missing declarations etc. ?\n\n            for (int i = 0; i < meshDrawDatas.Count; i++)\n            {\n                var meshDrawData = meshDrawDatas[i];\n\n                // This should not happen anymore\n                if (i != 0)\n                {\n                    if (!meshDrawData.IsSimple())\n                        throw new InvalidOperationException(\"Can only merge simple MeshDrawData.\");\n\n                    if (meshDrawData.VertexBuffers.Length != firstMeshDrawData.VertexBuffers.Length)\n                        throw new InvalidOperationException(\"Non-matching vertex buffer declarations.\");\n\n                    if (!meshDrawData.VertexBuffers[0].Declaration.Equals(firstMeshDrawData.VertexBuffers[0].Declaration))\n                        throw new InvalidOperationException(\"Non-matching vertex buffer declarations.\");\n                }\n\n                if (meshDrawData.PrimitiveType != PrimitiveType.TriangleList)\n                    throw new InvalidOperationException(\"Can only merge TriangleList.\");\n\n                // Update vertex/index counts\n                totalVertexCount += meshDrawData.VertexBuffers[0].Count;\n                if (hasIndexBuffer)\n                {\n                    if (meshDrawData.IndexBuffer != null)\n                        totalIndexCount += meshDrawData.IndexBuffer.Count;\n                    else\n                        totalIndexCount += meshDrawData.VertexBuffers[0].Count;\n                }\n            }","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Rendering/Extensions/MergeExtensions.cs#L34-L70","documentation":"MergeDrawData merges multiple MeshDrawData into one, and requires every mesh to declare an identical vertex buffer layout. This error is thrown when a candidate mesh has a different NUMBER of vertex buffers than the first mesh in the merge group. The library can only concatenate meshes whose vertex buffer declarations match exactly.","triggerScenarios":"Calling MergeDrawData (via GroupDrawData) on a set of MeshDrawData where meshDrawData.VertexBuffers.Length differs from firstMeshDrawData.VertexBuffers.Length (e.g. first mesh has 1 vertex buffer, another has 2).","commonSituations":"Mixing meshes built with interleaved single-buffer layouts with meshes split into separate position/normal/uv buffers; merging procedurally generated meshes with meshes loaded from different pipeline stages; model importers that emit different buffer counts per material.","solutions":["Ensure all meshes destined for merging have the same VertexBuffers.Length; rebuild meshes into a single interleaved vertex buffer if needed","Exclude the offending mesh from the merge group (check IsSimple and buffer count before adding)","Normalize buffer declarations by copying vertex data into a new VertexBufferBinding with the same declaration as the first mesh"],"exampleFix":"// before\nmergeList.Add(meshWithTwoBuffers);\nMergeExtensions.MergeDrawData(mergeList);\n// after\nif (mesh.VertexBuffers.Length == firstMesh.VertexBuffers.Length)\n    mergeList.Add(mesh);\nelse\n    ConvertToSingleVertexBuffer(mesh); // re-interleave into one buffer","handlingStrategy":"validation","validationCode":"bool canMerge = meshes.All(m => m.IsSimple()\n    && m.VertexBuffers.Length == meshes[0].VertexBuffers.Length);","typeGuard":"static bool HasMatchingBufferCount(MeshDrawData m, MeshDrawData first) =>\n    m.VertexBuffers != null && m.VertexBuffers.Length == first.VertexBuffers.Length;","tryCatchPattern":"try { MergeDrawData(meshes); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"Non-matching vertex buffer\")) {\n    // split meshes into groups by buffer count and merge each group\n}","preventionTips":["Group meshes by vertex buffer count before merging","Standardize on a single interleaved vertex buffer layout across your content pipeline","Assert IsSimple() and declaration equality in unit tests for mergeable assets"],"tags":["csharp","rendering","mesh-merging"],"backgroundTag":"schema-validation-failed","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}