diff --git a/Videos/cortex_20260619_090432.mp4 b/Videos/cortex_20260619_090432.mp4 new file mode 100644 index 0000000..07982de Binary files /dev/null and b/Videos/cortex_20260619_090432.mp4 differ diff --git a/src/CortexEngine.App/Program.cs b/src/CortexEngine.App/Program.cs index d096435..e3aa3a8 100644 --- a/src/CortexEngine.App/Program.cs +++ b/src/CortexEngine.App/Program.cs @@ -329,7 +329,7 @@ class Program var w = window.Width; var h = window.Height; var fps = (int)Math.Round(1000.0 / timing.DeltaTime); - var ffmpegArgs = $"-y -f rawvideo -pixel_format rgba -video_size {w}x{h} -framerate {Math.Min(fps, 60)} -i - -c:v libx264 -preset fast -crf 23 -pix_fmt yuv420p -vf fps=30 {recordingPath}"; + var ffmpegArgs = $"-y -f rawvideo -pixel_format bgra -video_size {w}x{h} -framerate {Math.Min(fps, 60)} -i - -c:v libx264 -preset fast -crf 23 -pix_fmt yuv420p -vf fps=30 {recordingPath}"; var psi = new ProcessStartInfo { diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index 22ba848..b010ef9 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -149,12 +149,7 @@ public sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreensh Marshal.Copy((nint)pData, result, 0, (int)_screenshotBufferSize); Vk.vkUnmapMemory(_ctx.Device, _screenshotMemory); - // Vulkan data is BGRA, convert to RGBA - for (int i = 0; i < result.Length; i += 4) - { - (result[i], result[i + 2]) = (result[i + 2], result[i]); - } - + // Data is BGRA from swapchain — no conversion needed, FFmpeg handles bgra return result; } @@ -520,10 +515,11 @@ public sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreensh Vk.vkCmdEndRendering(cmd); - // Capture frame AFTER render pass ends, BEFORE present transition + // Capture frame for video recording — AFTER render pass, BEFORE present + // This captures scene + ImGui. To capture without UI, we'd need separate render pass. if (IsRecording) { - CaptureFrame(cmd, imageIndex); // Only records GPU commands, does NOT overwrite CapturedFrame + CaptureFrame(cmd, imageIndex); } TransitionImageLayout(cmd, _swapchain.Images[imageIndex],