diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index 1899a3b1e439e67a5ccee7bc21bf7366c1db8b2e..684e78111821df546e95d8a2caf6b10e4d6744ae 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -178,26 +178,25 @@ int main(int argc, const char** argv) {
 		vkcv::SamplerAddressMode::REPEAT
 	);
 
-	// prepare per mesh descriptor sets
-	std::vector<vkcv::DescriptorSetHandle> perMeshDescriptorSets;
+	// create descriptor sets
+	std::vector<vkcv::DescriptorSetHandle> materialDescriptorSets;
 	std::vector<vkcv::Image> sceneImages;
-	for (const auto& vertexGroup : scene.vertexGroups) {
-		perMeshDescriptorSets.push_back(core.createDescriptorSet(forwardProgram.getReflectedDescriptors()[1]));
-
-		const auto& material = scene.materials[vertexGroup.materialIndex];
 
+	for (const auto& material : scene.materials) {
 		int baseColorIndex = material.baseColor;
 		if (baseColorIndex < 0) {
 			vkcv_log(vkcv::LogLevel::WARNING, "Material lacks base color");
 			baseColorIndex = 0;
 		}
 
+		materialDescriptorSets.push_back(core.createDescriptorSet(forwardProgram.getReflectedDescriptors()[1]));
+
 		vkcv::asset::Texture& sceneTexture = scene.textures[baseColorIndex];
 
 		sceneImages.push_back(core.createImage(vk::Format::eR8G8B8A8Srgb, sceneTexture.w, sceneTexture.h, 1, true));
 		sceneImages.back().fill(sceneTexture.data.data());
 		sceneImages.back().generateMipChainImmediate();
-        sceneImages.back().switchLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
+		sceneImages.back().switchLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
 
 		vkcv::DescriptorWrites setWrites;
 		setWrites.sampledImageWrites = {
@@ -206,7 +205,12 @@ int main(int argc, const char** argv) {
 		setWrites.samplerWrites = {
 			vkcv::SamplerDescriptorWrite(1, colorSampler),
 		};
-		core.writeDescriptorSet(perMeshDescriptorSets.back(), setWrites);
+		core.writeDescriptorSet(materialDescriptorSets.back(), setWrites);
+	}
+
+	std::vector<vkcv::DescriptorSetHandle> perMeshDescriptorSets;
+	for (const auto& vertexGroup : scene.vertexGroups) {
+		perMeshDescriptorSets.push_back(materialDescriptorSets[vertexGroup.materialIndex]);
 	}
 
 	const vkcv::PipelineConfig forwardPipelineConfig {