Files
XCEngine/docs/plan/第二阶段计划.md

14 KiB
Raw Blame History

XCEngine 渲染引擎 - 第二阶段计划

目标: 构建 RHI 抽象层,将 HelloEarth 的 D3D12 最小可行系统封装为引擎基础设施 版本: 1.0 日期: 2026-03-13 前置依赖: 第一阶段数学库、Core基础类型、线程系统、内存管理、容器库、日志系统


阶段背景

本阶段基于以下代码基础进行构建:

  1. HelloEarth 最小可行渲染系统 (mvs/HelloEarth/)

    • 已实现完整的 D3D12 渲染流程
    • 包含窗口创建、设备初始化、Shader 加载、网格渲染、纹理绑定
    • 可直接运行并渲染地球模型
  2. XCEngine 架构设计书 (docs/XCEngine渲染引擎架构设计.md)

    • 定义了 RHI 抽象层接口规范
    • 定义了渲染资源封装接口
    • 定义了渲染管线基础架构

阶段目标

将 HelloEarth 中散落的 D3D12 代码重构为引擎的 RHI 抽象层,建立可复用的渲染基础设施,为第三阶段的 Component/GameObject 体系提供渲染支撑。


模块规划

2.1 RHI 公共定义 (RHIDefines)

项目 内容
优先级 P0
预计工作量 1天
包含内容 枚举定义 (Format, ShaderStage, ResourceState, PrimitiveTopology 等)、公共结构体 (Viewport, Rect)、DXGI/D3D12 类型映射
参考来源 docs/XCEngine渲染引擎架构设计.md 4.1 节

2.2 RHI 接口层

项目 内容
优先级 P0
预计工作量 2天
包含接口 IRHIDevice, ICommandList, ICommandAllocator, ICommandQueue, IFence, ISwapChain, IDescriptorHeap, IRootSignature, IPipelineState
功能要求 跨平台抽象接口定义,不包含平台特定实现
补充说明 必须包含 SetPrimitiveTopology() 图元类型设置接口
参考来源 docs/XCEngine渲染引擎架构设计.md 4.1 节 RHI 接口定义

2.3 D3D12 后端实现

项目 内容
优先级 P0
预计工作量 4天
包含内容 D3D12Device 实现 IRHIDevice 接口、D3D12CommandListD3D12CommandAllocatorD3D12FenceD3D12SwapChainD3D12DescriptorHeapD3D12RootSignatureD3D12PipelineState
迁移参考 mvs/HelloEarth/BattleFireDirect.h/cpp 中的全局函数封装为类接口
依赖 RHI 接口层

迁移映射表

HelloEarth 原有实现 新架构 RHI 接口
InitD3D12() D3D12Device::Initialize()
GetD3DDevice() IRHIDevice::GetNativeDevice()
GetCommandList() ICommandList
GetCommandAllocator() ICommandAllocator
InitRootSignature() D3D12RootSignature
CreatePSO() D3D12PipelineState
SwapD3D12Buffers() ISwapChain::Present()
CreateBufferObject() IVertexBuffer / IIndexBuffer
CreateConstantBufferObject() IConstantBuffer
CreateTexture2D() ITexture2D

2.4 渲染资源封装

项目 内容
优先级 P0
预计工作量 2天
包含内容 VertexBuffer, IndexBuffer, ConstantBuffer, Texture2D, Sampler
功能要求 封装 RHI 资源创建/更新/绑定逻辑
参考来源 docs/XCEngine渲染引擎架构设计.md 4.0 节渲染资源类型定义
迁移参考 mvs/HelloEarth/main.cpp 中的 VB/IB/CB/Texture 创建逻辑

2.5 RenderTarget / DepthStencil 管理

项目 内容
优先级 P0
预计工作量 1天
包含内容 RenderTarget, DepthStencil, 交换链缓冲管理、Resource Barrier 状态转换、SRV/RTV/DSV 创建
功能要求 渲染目标创建、深度模板缓冲管理、状态转换 (Present ↔ RenderTarget)、视图创建
补充说明 必须包含纹理完整创建流程SRV 创建 + Copy 过程 + Barrier 转换ClearRenderTarget/ClearDepthStencil 命令
迁移参考 mvs/HelloEarth/BattleFireDirect.cpp 中的 gDSRT, gColorRTs 管理逻辑、InitResourceBarrier() 函数、CreateTexture2D() 中的 SRV 创建和资源复制逻辑

2.6 Shader / PSO 管理

项目 内容
优先级 P1
预计工作量 2天
包含内容 Shader 加载编译、PipelineState 缓存管理、InputLayout 顶点布局定义、BlendState/DepthStencilState/RasterizerState 渲染状态
功能要求 HLSL 文件加载、编译、PSO 创建与缓存、顶点布局定义
补充说明 必须定义渲染状态结构BlendState (混合模式)、DepthStencilState (深度测试)、RasterizerState (光栅化)
迁移参考 mvs/HelloEarth/main.cppCreateShaderFromFile()CreatePSO() 逻辑PSO 中的硬编码状态

2.7 渲染上下文 (RenderContext)

项目 内容
优先级 P1
预计工作量 2天
包含内容 渲染上下文管理、SwapChain 渲染循环封装、Viewport/Scissor 设置、Clear 命令
功能要求 帧开始/结束、渲染目标切换、视口裁剪设置、背景清除、Present
补充说明 必须包含 ClearRenderTargetView 和 ClearDepthStencilView 命令
迁移参考 mvs/HelloEarth/main.cpp 中渲染循环逻辑、BeginRenderToSwapChain() / EndRenderToSwapChain() 中的 Clear 调用

2.8 静态网格组件 (StaticMeshComponent)

项目 内容
优先级 P1
预计工作量 1天
包含内容 网格加载 (.lhsm 格式)、顶点/索引缓冲绑定、渲染调用
功能要求 模型文件加载、顶点数据上传、DrawCall 封装
迁移参考 mvs/HelloEarth/StaticMeshComponent.h/cpp

2.9 CMake 构建配置

项目 内容
优先级 P1
预计工作量 1天
包含内容 RHI/D3D12 子目录 CMakeLists.txt、引擎库配置更新
功能要求 添加 D3D12 后端到构建系统、链接 DirectX 库

2.10 Demo 整合验证

项目 内容
优先级 P1
预计工作量 1天
包含内容 使用新 RHI 架构重写 HelloEarth Demo
验证目标 渲染效果与原 HelloEarth 一致,验证 RHI 层功能完整

目录结构

engine/include/XCEngine/
├── RHI/
│   ├── RHIDefines.h          # 公共枚举定义
│   ├── IRHIDevice.h          # 抽象设备接口
│   ├── ICommandList.h        # 命令列表接口
│   ├── ICommandAllocator.h   # 命令分配器接口
│   ├── ICommandQueue.h       # 命令队列接口
│   ├── IFence.h             # 同步围栏接口
│   ├── ISwapChain.h          # 交换链接口
│   ├── IDescriptorHeap.h      # 描述符堆接口
│   ├── IRootSignature.h      # 根签名接口
│   ├── IPipelineState.h      # PSO 接口
│   ├── IRenderTargetView.h   # RTV 接口
│   ├── IDepthStencilView.h   # DSV 接口
│   ├── IShaderResourceView.h # SRV 接口
│   └── RHISystem.h           # RHI 系统入口
│
├── Rendering/
│   ├── Buffer.h              # 缓冲区基类
│   ├── VertexBuffer.h        # 顶点缓冲区
│   ├── IndexBuffer.h         # 索引缓冲区
│   ├── ConstantBuffer.h       # 常量缓冲区
│   ├── Texture.h             # 纹理
│   ├── RenderTarget.h        # 渲染目标
│   ├── DepthStencil.h        # 深度模板缓冲
│   ├── Shader.h              # Shader 抽象
│   ├── Sampler.h             # 采样器
│   ├── InputLayout.h         # 顶点输入布局
│   ├── RenderState.h         # 渲染状态 (Blend/Depth/Rasterizer)
│   ├── StaticMeshComponent.h # 静态网格组件
│   └── RenderContext.h       # 渲染上下文
│
engine/src/
├── RHI/
│   ├── CMakeLists.txt        # RHI 构建配置
│   └── D3D12/
│       ├── CMakeLists.txt    # D3D12 构建配置
│       ├── D3D12Device.cpp
│       ├── D3D12CommandList.cpp
│       ├── D3D12CommandAllocator.cpp
│       ├── D3D12CommandQueue.cpp
│       ├── D3D12Fence.cpp
│       ├── D3D12SwapChain.cpp
│       ├── D3D12DescriptorHeap.cpp
│       ├── D3D12RootSignature.cpp
│       ├── D3D12PipelineState.cpp
│       ├── D3D12Resource.cpp
│       └── D3D12Texture.cpp
│
└── Rendering/
    ├── CMakeLists.txt        # Rendering 构建配置
    ├── Buffer.cpp
    ├── Texture.cpp
    ├── RenderTarget.cpp
    ├── Shader.cpp
    ├── RenderState.cpp
    ├── StaticMeshComponent.cpp
    └── RenderContext.cpp

时间安排

天数 内容
第1天 RHI 公共定义
第2-3天 RHI 接口层定义
第4-7天 D3D12 后端实现
第8-9天 渲染资源封装 (VB/IB/CB/Texture)
第10天 RenderTarget/DepthStencil 管理
第11-12天 Shader / PSO 管理 + InputLayout
第13-14天 渲染上下文 (RenderContext)
第15天 StaticMeshComponent 迁移
第16天 CMake 构建配置
第17-18天 Demo 整合验证 + 调试修复

注:总计约 18 个工作日,可根据实际情况调整


依赖关系

第一阶段 (已完成)
     │
     ├──▶ RHI 公共定义 (无依赖)
     │         │
     │         ├──▶ RHI 接口层 (依赖 RHI 公共定义)
     │         │
     │         └──▶ D3D12 后端 (依赖 RHI 接口层, 复用 HelloEarth 实现)
     │
     ├──▶ 渲染资源封装 (依赖 RHI 接口层, 复用 HelloEarth 资源创建逻辑)
     │         │
     │         └──▶ RenderTarget/DepthStencil (依赖 RHI 接口层)
     │
     ├──▶ Shader/PSO 管理 (依赖 RHI 接口层, 复用 HelloEarth 编译逻辑)
     │
     ├──▶ 渲染上下文 (依赖 RHI 接口层, 渲染资源, 复用 HelloEarth 渲染循环)
     │
     ├──▶ StaticMeshComponent (依赖 RHI 接口层, 渲染资源)
     │
     └──▶ CMake 构建配置 (依赖引擎构建系统)

验收标准

  • RHI 接口编译通过
  • D3D12 后端完整实现 RHI 接口
  • 可创建 VertexBuffer/IndexBuffer/ConstantBuffer/Texture2D
  • RenderTarget/DepthStencil 创建与管理正常
  • Resource Barrier 状态转换正常
  • Shader 加载编译正常工作
  • PipelineState 创建与管理正常
  • InputLayout 顶点布局定义正确
  • 渲染状态 (Blend/Depth/Rasterizer) 定义正确
  • PrimitiveTopology 图元类型设置正常
  • 纹理 SRV/RTV/DSV 视图创建正常
  • ClearRenderTarget/ClearDepthStencil 清除命令正常
  • Viewport/Scissor 设置正常
  • 渲染上下文帧循环正常
  • StaticMeshComponent 网格加载与渲染正常
  • CMake 构建配置完整
  • 新架构 Demo 运行效果与原 HelloEarth 一致
  • 窗口/渲染/退出流程无崩溃

测试方案

测试用例设计

模块 测试类别 测试用例示例
RHI 设备初始化 D3D12 设备创建成功、获取适配器信息
RHI 命令列表 Reset/Close/Begin 流程正常、PrimitiveTopology 设置
RHI 同步 Fence Signal/Wait 正常工作
RHI 交换链 Present/Resize 正常工作
Resources 缓冲区 VB/IB 创建、数据更新、绑定正确
Resources 纹理 2D 纹理创建、Mipmap 生成、SRV 绑定、资源状态转换
Resources 视图 RTV/DSV 创建正确
Shader 编译 VS/PS/GS 编译成功、错误信息正确
Pipeline PSO 图形 PSO 创建成功、渲染状态配置正确
Pipeline 渲染状态 Blend/Depth/Rasterizer 状态正确应用
RenderContext 渲染循环 帧循环正常、Clear 命令正常、资源释放正确

执行命令

# 编译引擎
cmake --build build --target XCEngine

# 编译 Demo
cmake --build build --target HelloEarth

# 运行 Demo
./build/bin/HelloEarth.exe

迁移对照表

以下表格详细说明 HelloEarth 原有实现到新架构的映射关系:

功能 HelloEarth 实现 新架构实现 接口位置
初始化 D3D12 InitD3D12(hwnd, width, height) device->Initialize(windowHandle, desc) IRHIDevice
获取 D3D12 设备 GetD3DDevice() device->GetNativeDevice() IRHIDevice
命令分配器 GetCommandAllocator() device->CreateCommandAllocator() IRHIDevice
命令列表 GetCommandList() device->CreateCommandList() IRHIDevice
创建根签名 InitRootSignature() device->CreateRootSignature() IRHIDevice
创建 PSO CreatePSO(rs, vs, ps, gs) device->CreatePipelineState() IRHIDevice
创建顶点缓冲 CreateBufferObject() device->CreateVertexBuffer() IRHIDevice
创建常量缓冲 CreateConstantBufferObject() device->CreateConstantBuffer() IRHIDevice
创建纹理 CreateTexture2D() device->CreateTexture2D() IRHIDevice
纹理 SRV 创建 CreateShaderResourceView() texture->CreateSRV() ITexture
资源状态转换 InitResourceBarrier() ICommandList::ResourceBarrier() ICommandList
设置图元类型 IASetPrimitiveTopology() ICommandList::SetPrimitiveTopology() ICommandList
清除渲染目标 ClearRenderTargetView() ICommandList::ClearRenderTargetView() ICommandList
清除深度模板 ClearDepthStencilView() ICommandList::ClearDepthStencilView() ICommandList
渲染到交换链 BeginRenderToSwapChain() context->BeginFrame() RenderContext
结束渲染 EndRenderToSwapChain() context->EndFrame() RenderContext
呈现 SwapD3D12Buffers() swapChain->Present() ISwapChain
等待 GPU WaitForCompletionOfCommandList() fence->Wait() IFence
网格渲染 StaticMeshComponent::Render() StaticMeshComponent::Render() StaticMeshComponent

备注

  1. DirectX Math: 本阶段继续使用 DirectX::XMMatrix 等数学库,待第三阶段替换为 XCEngine Math
  2. HelloEarth 复用: HelloEarth 的 Shader 文件 (Res/Shader/*.hlsl)、模型文件 (Res/Model/*.lhsm)、纹理文件 (Res/Image/*) 均可直接复用
  3. 后续阶段: Component/GameObject 体系在第三阶段实现,届时将整合渲染组件