{"record":{"id":"8b16e2fb42b46624","repo":"stride3d/stride","slug":"perview-voxelizerstorer-layout-differs-between-different","errorCode":null,"errorMessage":"PerView VoxelizerStorer layout differs between different RenderObject in the same RenderView","messagePattern":"PerView VoxelizerStorer layout differs between different RenderObject in the same RenderView","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Voxels/Voxels/GraphicsCompositor/VoxelRenderFeature.cs","lineNumber":161,"sourceCode":"                    ParameterCollection VSViewParameters = viewParameters;\n\n                    pass.storer.ApplyVoxelizationParameters(VSViewParameters);\n                    foreach (var attr in processedVolume.Attributes)\n                    {\n                        attr.Attribute.ApplyVoxelizationParameters(VSViewParameters);\n                    }\n\n                    foreach (var viewLayout in viewFeature.Layouts)\n                    {\n                        if (viewLayout.State != RenderEffectState.Normal)\n                            continue;\n\n                        var voxelizerStorer = viewLayout.GetLogicalGroup(VoxelizerStorerCasterKey);\n                        if (voxelizerStorer.Hash == ObjectId.Empty)\n                            continue;\n\n                        if (voxelizerStorer.Hash != firstViewLighting.Hash)\n                            throw new InvalidOperationException(\"PerView VoxelizerStorer layout differs between different RenderObject in the same RenderView\");\n\n\n                        var resourceGroup = viewLayout.Entries[pass.view.Index].Resources;\n                        resourceGroup.UpdateLogicalGroup(ref voxelizerStorer, VSViewParameters);\n                    }\n                }\n            }\n        }\n    }\n}\n","sourceCodeStart":143,"sourceCodeEnd":172,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Voxels/Voxels/GraphicsCompositor/VoxelRenderFeature.cs#L143-L172","documentation":"VoxelRenderFeature.Prepare verifies that all RenderObjects in a single RenderView resolve the PerView VoxelizerStorer resource group to the same layout hash. If a later object's view layout hash differs from firstViewLighting.Hash, the per-view resource group binding would be inconsistent, so the feature throws InvalidOperationException. This is an internal consistency check on shader resource group layouts for voxelization.","triggerScenarios":"Mixing RenderObjects in one RenderView whose material/effect produces different VoxelizerStorer logical group layouts (e.g. different shader permutations or material changes mid-view).","commonSituations":"Adding voxel-casting objects with mismatched shaders/effects to the same view; editing materials so one voxel caster compiles a different VoxelizerStorer layout; custom render stages that group incompatible voxel objects.","solutions":["Ensure all voxel-casting RenderObjects in a view use the same shader/effect so VoxelizerStorer has an identical layout.","Check that every voxel caster's material resolves the VoxelizerStorerCasterKey the same way (non-empty and equal hashes).","Split differently-shaded voxel objects into separate RenderViews/render stages, or update the engine if this case should be supported."],"exampleFix":"// before\n// one RenderView containing voxel objects with two different material shader variants\nmaterialA = new Material { /* uses VoxelizerStorer layout X */ };\nmaterialB = new Material { /* uses VoxelizerStorer layout Y */ }; // throws in Prepare\n// after\n// use the same shader variant / layout for all casters in the view\nmaterialB = materialA; // or move materialB objects to their own RenderView","handlingStrategy":"validation","validationCode":"// before rendering, ensure all voxel casters in the view share one material/shader variant\nbool sameLayout = casters.Select(c => c.Material).Distinct().Count() <= 1;","typeGuard":null,"tryCatchPattern":"try { renderSystem.Render(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"VoxelizerStorer\")) { /* fix materials / split views */ }","preventionTips":["Use identical materials/shader variants for all voxel-casting RenderObjects in a RenderView.","Avoid mixing hand-edited shader permutations among voxel casters.","Split incompatible voxel objects into separate views."],"tags":["stride","voxels","rendering","layout-mismatch"],"backgroundTag":"internal-invariant-violation","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"}