fix: transition all 6 cubemap layers — shadows now work on floor

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.
This commit is contained in:
emil28092005
2026-06-18 21:15:50 +03:00
parent fa937ecd94
commit a572f9d360
+4 -4
View File
@@ -177,7 +177,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen
// === SHADOW CUBEMAP PASSES (6 faces) === // === SHADOW CUBEMAP PASSES (6 faces) ===
TransitionImageLayoutDepth(cmd, _shadowMap.DepthImage, TransitionImageLayoutDepth(cmd, _shadowMap.DepthImage,
VkImageLayout.Undefined, VkImageLayout.DepthStencilAttachmentOptimal, VkImageLayout.Undefined, VkImageLayout.DepthStencilAttachmentOptimal,
0, 0, 0x100, 0x200); 0, 0, 0x100, 0x200, 6);
var lightPosVec = new Vector3(lightPos.X, lightPos.Y, lightPos.Z); 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 // Transition shadow cubemap: depth attachment → shader read
TransitionImageLayoutDepth(cmd, _shadowMap.DepthImage, TransitionImageLayoutDepth(cmd, _shadowMap.DepthImage,
VkImageLayout.DepthStencilAttachmentOptimal, VkImageLayout.ShaderReadOnlyOptimal, VkImageLayout.DepthStencilAttachmentOptimal, VkImageLayout.ShaderReadOnlyOptimal,
0x100, 0x200, 0x8, 0x20); 0x100, 0x200, 0x8, 0x20, 6);
// === MAIN PASS === // === MAIN PASS ===
TransitionImageLayout(cmd, _swapchain.Images[imageIndex], 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, private static void TransitionImageLayoutDepth(VkCommandBuffer cmd, VkImage image,
VkImageLayout oldLayout, VkImageLayout newLayout, VkImageLayout oldLayout, VkImageLayout newLayout,
ulong srcStage, ulong srcAccess, ulong srcStage, ulong srcAccess,
ulong dstStage, ulong dstAccess) ulong dstStage, ulong dstAccess, uint layerCount = 1)
{ {
var barrier = new VkImageMemoryBarrier2 var barrier = new VkImageMemoryBarrier2
{ {
@@ -494,7 +494,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen
{ {
AspectMask = VkImageAspectFlags.Depth, AspectMask = VkImageAspectFlags.Depth,
LevelCount = 1, LevelCount = 1,
LayerCount = 1, LayerCount = layerCount,
}, },
}; };