feat: ImGui 叠加层接入 RenderGraph(docking 分支,dynamic rendering)

框架与 UI 的职责边界:
- ImGuiLayer(Engine/ImGui):只做管线桥接——上下文初始化、
  NewFrame/BuildDrawData、draw data 录入 cmd;框架自身永不绘制
  任何 ImGui 控件,UI 内容全部由派生类在 OnRenderOverlay() 定义
- 每帧顺序:NewFrame → OnRenderOverlay(声明控件)→ BuildDrawData →
  Renderer.Render(RG: Forward → ImGui(loadOp=Load 叠加) → Present)
- ImGui pass 常驻 RG,未启用叠加层时空转,无图结构开销
- 后端共存:VK_EXT_shader_object 引擎无 vk::Pipeline,ImGui 用
  UseDynamicRendering + PipelineInfoMain.PipelineRenderingCreateInfo
  (swapchain 格式),不需要 RenderPass
- 析构序:ImGuiLayer 在 Application 成员序中后声明(先于 Renderer
  析构),析构内 waitIdle 保证后端资源安全销毁

App 示例(证明职责边界):Scene Debug 面板实时拖动阴影光方向,
` 键反折叠加层
This commit is contained in:
2026-09-22 17:09:55 +08:00
parent bc63f76fc1
commit 07792c34d7
10 changed files with 338 additions and 11 deletions
+40
View File
@@ -19,6 +19,7 @@
#include <Engine/Vulkan/UniformBuffer.h>
#include <Engine/Core/Window.h>
#include <Engine/Core/Log.h>
#include <Engine/ImGui/ImGuiLayer.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
@@ -208,6 +209,16 @@ namespace Engine
vkDevice.destroyDescriptorSetLayout(m_ShadowSetLayout);
}
vk::Format Renderer::GetSwapchainFormat() const
{
return m_Swapchain->GetFormat();
}
u32 Renderer::GetSwapchainImageCount() const
{
return m_Swapchain->GetImageCount();
}
void Renderer::BuildGraph()
{
m_RenderGraph = CreateScope<RG::RenderGraph>(
@@ -455,6 +466,35 @@ namespace Engine
.Read(m_ShadowMap, RG::ResourceUse::ShaderRead,
vk::ShaderStageFlagBits::eFragment);
// ---- ImGui pass:叠加层(loadOp=Load,不清屏)----
// 框架只负责把 draw data 录进 cmd;UI 内容全部由派生类
// 在 OnRenderOverlay() 里构建,框架自身不画任何 ImGui 控件。
// 未启用叠加层时空转(begin/end 一次空 rendering region)。
m_RenderGraph->AddPass("ImGui",
[this](RG::RenderGraphContext& ctx) {
const vk::CommandBuffer cmd = ctx.cmd;
vk::RenderingAttachmentInfo colorAttachment;
colorAttachment.setImageView(ctx.View(m_Backbuffer))
.setImageLayout(vk::ImageLayout::eColorAttachmentOptimal)
.setLoadOp(vk::AttachmentLoadOp::eLoad) // 关键:叠加
.setStoreOp(vk::AttachmentStoreOp::eStore);
vk::RenderingInfo renderingInfo;
renderingInfo.setRenderArea({{0, 0}, ctx.extent})
.setLayerCount(1)
.setColorAttachments(colorAttachment);
cmd.beginRendering(renderingInfo);
if (m_ImGuiLayer) {
m_ImGuiLayer->RenderDrawData(cmd);
}
cmd.endRendering();
})
.Write(m_Backbuffer, RG::ResourceUse::ColorAttachment);
// ---- Present pass:transition 到 ePresentSrcKHR ----
m_RenderGraph->AddPass("Present",
[](RG::RenderGraphContext&) {