// // Created by atdunbg on 2026/9/23. // #include #include namespace Engine::Passes { void ImGuiPass::Register(RG::RenderGraph& rg) { rg.AddPass("ImGui", [this](RG::RenderGraphContext& ctx) { const vk::CommandBuffer cmd = ctx.cmd; // loadOp 按显示模式分支:Direct = blit 已铺满场景(Load 叠加); // Viewport = 本 pass 是唯一写入者(Clear 为"桌面底色") const bool direct = (m_Frame.displayMode == kDisplayDirect); vk::ClearValue clearValue; clearValue.color = vk::ClearColorValue( std::array{0.04f, 0.045f, 0.06f, 1.0f}); vk::RenderingAttachmentInfo colorAttachment; colorAttachment.setImageView(ctx.View(m_Backbuffer)) .setImageLayout(vk::ImageLayout::eColorAttachmentOptimal) .setLoadOp(direct ? vk::AttachmentLoadOp::eLoad : vk::AttachmentLoadOp::eClear) .setStoreOp(vk::AttachmentStoreOp::eStore) .setClearValue(clearValue); vk::RenderingInfo renderingInfo; // 渲染区域 = backbuffer 物理尺寸(窗口大小),不是 ctx.extent //(= RG 目标尺寸 = 场景渲染分辨率)。Editor 视口模式下场景链 // 按面板尺寸渲染,而 backbuffer 是全窗口——若跟随目标尺寸, // 整个 ImGui 会被裁剪到面板大小 renderingInfo.setRenderArea({{0, 0}, ctx.Extent(m_Backbuffer)}) .setLayerCount(1) .setColorAttachments(colorAttachment); cmd.beginRendering(renderingInfo); if (*m_Layer) { (*m_Layer)->RenderDrawData(cmd); } cmd.endRendering(); }).Write(m_Backbuffer, RG::ResourceUse::ColorAttachment) // 场景纹理在本 pass 内被 ImGui::Image 的描述符采样:声明读让 RG // 补 ColorAttachment→ShaderRead barrier,并推导 eSampled usage .Read(m_PresentTarget, RG::ResourceUse::ShaderRead, vk::ShaderStageFlagBits::eFragment); } } // namespace Engine::Passes