From a801e7fb16143414cc11e8de31a94aae93d293d5 Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 13:25:59 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20Vulkan=20projection=20matrix=20=E2=80=94?= =?UTF-8?q?=20Y-flip=20+=20depth=20[0,1]=20remap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Negate proj.M22 for Vulkan Y-down coordinate system - Remap depth from OpenGL [-1,1] to Vulkan [0,1]: M33*0.5+0.5, M43*0.5+0.5 - FOV 45°, camera z=-5, cubes at x=±2 - 0 validation errors --- src/Engine.Graphics.Vulkan/VulkanRenderer.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index ede1981..5e4a4f4 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -191,11 +191,11 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen var angle = _totalTime * 0.2f; var rot = Matrix4x4.CreateRotationY(angle); - var model1 = Matrix4x4.CreateTranslation(-3f, 0, 0) * rot; + var model1 = Matrix4x4.CreateTranslation(-2f, 0, 0) * rot; Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex, 0, 64, &model1); Vk.vkCmdDrawIndexed(cmd, _indexCount, 1, 0, 0, 0); - var model2 = Matrix4x4.CreateTranslation(3f, 0, 0) * rot; + var model2 = Matrix4x4.CreateTranslation(2f, 0, 0) * rot; Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex, 0, 64, &model2); Vk.vkCmdDrawIndexed(cmd, _indexCount, 1, 0, 0, 0); @@ -271,8 +271,11 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen private Matrix4x4 ComputeViewProjection() { var aspect = (float)_swapchain.Extent.Width / (float)_swapchain.Extent.Height; - var proj = Matrix4x4.CreatePerspectiveFieldOfView(MathF.PI * 0.4f, aspect, 0.1f, 100f); - var view = Matrix4x4.CreateLookAt(new Vector3(0, 0, -10), Vector3.Zero, Vector3.UnitY); + var proj = Matrix4x4.CreatePerspectiveFieldOfView(MathF.PI / 4f, aspect, 0.1f, 100f); + proj.M22 *= -1; + proj.M33 = proj.M33 * 0.5f + 0.5f; + proj.M43 = proj.M43 * 0.5f + 0.5f; + var view = Matrix4x4.CreateLookAt(new Vector3(0, 0, -5), Vector3.Zero, Vector3.UnitY); return view * proj; }