From a572f9d360096ba358827d3010b449472440d143 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 21:15:50 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20transition=20all=206=20cubemap=20layers?= =?UTF-8?q?=20=E2=80=94=20shadows=20now=20work=20on=20floor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: TransitionImageLayoutDepth used LayerCount=1, so only layer 0 of the 6-layer cubemap was transitioned to ShaderReadOnlyOptimal. Layers 1-5 stayed in Undefined/DepthStencilAttachmentOptimal → sampling returned garbage → no shadows on surfaces facing those directions. Fix: added layerCount parameter to TransitionImageLayoutDepth (default=1). Shadow cubemap transitions use layerCount=6. --- src/Engine.Graphics.Vulkan/VulkanRenderer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index 759d38b..45ecaf0 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -177,7 +177,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen // === SHADOW CUBEMAP PASSES (6 faces) === TransitionImageLayoutDepth(cmd, _shadowMap.DepthImage, VkImageLayout.Undefined, VkImageLayout.DepthStencilAttachmentOptimal, - 0, 0, 0x100, 0x200); + 0, 0, 0x100, 0x200, 6); var lightPosVec = new Vector3(lightPos.X, lightPos.Y, lightPos.Z); @@ -267,7 +267,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen // Transition shadow cubemap: depth attachment → shader read TransitionImageLayoutDepth(cmd, _shadowMap.DepthImage, VkImageLayout.DepthStencilAttachmentOptimal, VkImageLayout.ShaderReadOnlyOptimal, - 0x100, 0x200, 0x8, 0x20); + 0x100, 0x200, 0x8, 0x20, 6); // === MAIN PASS === TransitionImageLayout(cmd, _swapchain.Images[imageIndex], @@ -478,7 +478,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen private static void TransitionImageLayoutDepth(VkCommandBuffer cmd, VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout, ulong srcStage, ulong srcAccess, - ulong dstStage, ulong dstAccess) + ulong dstStage, ulong dstAccess, uint layerCount = 1) { var barrier = new VkImageMemoryBarrier2 { @@ -494,7 +494,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen { AspectMask = VkImageAspectFlags.Depth, LevelCount = 1, - LayerCount = 1, + LayerCount = layerCount, }, };