feat: depth buffer + 3D model matrix — rotating cube now looks correct

- Depth image (D32_SFLOAT) + image view created in VulkanSwapchain
- VkPipelineDepthStencilStateCreateInfo: depth test + write enabled, CompareOp=Less
- Push constant changed from float angle (4B) to mat4 model (64B)
- 3D rotation: RotateY * RotateX in renderer, applied via push constant
- Vertex shader: gl_Position = vp * model * vec4(pos, 1.0)
- Depth attachment in VkRenderingInfo + depth clear (1.0)
- Depth image layout transition (Undefined → DepthStencilAttachmentOptimal)
- New Vulkan functions: vkCreateImage, vkDestroyImage, vkGetImageMemoryRequirements, vkBindImageMemory
- New structs: VkPipelineDepthStencilStateCreateInfo, VkStencilOpState, VkImageCreateInfo
- New enums: VkCompareOp, VkImageType, VkImageTiling
- 0 validation errors
This commit is contained in:
emil28092005
2026-06-18 02:14:54 +03:00
parent fde8b0f63a
commit d6bd1807cf
9 changed files with 265 additions and 18 deletions
+12
View File
@@ -47,6 +47,10 @@ internal static unsafe class Vk
public delegate VkResult VkGetFenceStatus(VkDevice device, VkFence fence);
public delegate VkResult VkCreateBuffer(VkDevice device, VkBufferCreateInfo* pCreateInfo, nint pAllocator, VkBuffer* pBuffer);
public delegate void VkDestroyBuffer(VkDevice device, VkBuffer buffer, nint pAllocator);
public delegate VkResult VkCreateImage(VkDevice device, VkImageCreateInfo* pCreateInfo, nint pAllocator, VkImage* pImage);
public delegate void VkDestroyImage(VkDevice device, VkImage image, nint pAllocator);
public delegate void VkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements);
public delegate VkResult VkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, ulong memoryOffset);
public delegate VkResult VkAllocateMemory(VkDevice device, VkMemoryAllocateInfo* pAllocateInfo, nint pAllocator, VkDeviceMemory* pMemory);
public delegate void VkFreeMemory(VkDevice device, VkDeviceMemory memory, nint pAllocator);
public delegate VkResult VkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, ulong memoryOffset);
@@ -124,6 +128,10 @@ internal static unsafe class Vk
public static VkGetFenceStatus vkGetFenceStatus;
public static VkCreateBuffer vkCreateBuffer;
public static VkDestroyBuffer vkDestroyBuffer;
public static VkCreateImage vkCreateImage;
public static VkDestroyImage vkDestroyImage;
public static VkGetImageMemoryRequirements vkGetImageMemoryRequirements;
public static VkBindImageMemory vkBindImageMemory;
public static VkAllocateMemory vkAllocateMemory;
public static VkFreeMemory vkFreeMemory;
public static VkBindBufferMemory vkBindBufferMemory;
@@ -208,6 +216,10 @@ internal static unsafe class Vk
vkGetFenceStatus = LoadDev<VkGetFenceStatus>(p, "vkGetFenceStatus");
vkCreateBuffer = LoadDev<VkCreateBuffer>(p, "vkCreateBuffer");
vkDestroyBuffer = LoadDev<VkDestroyBuffer>(p, "vkDestroyBuffer");
vkCreateImage = LoadDev<VkCreateImage>(p, "vkCreateImage");
vkDestroyImage = LoadDev<VkDestroyImage>(p, "vkDestroyImage");
vkGetImageMemoryRequirements = LoadDev<VkGetImageMemoryRequirements>(p, "vkGetImageMemoryRequirements");
vkBindImageMemory = LoadDev<VkBindImageMemory>(p, "vkBindImageMemory");
vkAllocateMemory = LoadDev<VkAllocateMemory>(p, "vkAllocateMemory");
vkFreeMemory = LoadDev<VkFreeMemory>(p, "vkFreeMemory");
vkBindBufferMemory = LoadDev<VkBindBufferMemory>(p, "vkBindBufferMemory");