Files
DX12/docs/架构分析/Graphics渲染架构分析.md
SpecialX b7eebc11b2 feat: add Graphics module with D3D12 backend and documentation
Graphics Module:
- Add platform abstraction layer (GraphicsPlatformInterface)
- Add unified renderer entry point (Renderer)
- Add D3D12 backend implementation (D3D12Core, D3D12Interface)
- Add TestRenderer for multi-window rendering tests

Documentation:
- Add Graphics渲染架构分析.md
- Add D3D12学习Wiki.md
- Add changelogs directory with per-commit documentation
- Add 20260326-dx12-initial.md for initial framework
- Add 20260326-d3d12-foundation.md for Graphics module

Fixes:
- Resolve header include issues and type redefinition errors
2026-03-26 16:57:05 +08:00

183 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Graphics 渲染架构分析
## 1. 模块概述
Graphics 模块是引擎的图形渲染核心,采用**平台抽象层设计**支持多图形后端Direct3D12、Vulkan、OpenGL的统一接口调用。
## 2. 目录结构
```
Engine/Graphics/
├── Direct3D12/ # D3D12 后端实现
│ ├── D3D12CommonHeader.h # D3D12 公共头文件
│ ├── D3D12Core.h/.cpp # D3D12 核心初始化/关闭
│ └── D3D12Interface.h/.cpp # 平台接口绑定
├── GraphicsPlatformInterface.h # 平台接口抽象定义
└── Renderer.h/.cpp # 统一渲染器入口
```
## 3. 核心设计模式
### 3.1 平台抽象接口
[GraphicsPlatformInterface.h](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/GraphicsPlatformInterface.h) 定义了平台无关的接口结构:
```cpp
struct platform_interface {
bool(*initialize)(void);
void(*shutdown)(void);
};
```
这种设计允许:
- 运行时选择图形后端
- 各平台独立实现,互不干扰
- 上层代码无需关心底层 API 细节
### 3.2 渲染器入口
[Renderer.h](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Renderer.h) 提供统一的渲染器入口:
```cpp
enum class graphics_platform : u32 {
direct3d12 = 0,
vulkan = 1,
opengl = 2,
};
bool initialize(graphics_platform platform);
void shutdown();
```
### 3.3 平台接口绑定流程
[Renderer.cpp](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Renderer.cpp) 实现平台选择逻辑:
```
用户调用 graphics::initialize(direct3d12)
set_platform_interface() 根据枚举选择平台
调用 d3d12::get_platform_interface(gfx)
绑定 gfx.initialize/shutdown 到 D3D12 实现
执行实际初始化
```
## 4. Direct3D12 后端实现
### 4.1 公共头文件
[D3D12CommonHeader.h](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Direct3D12/D3D12CommonHeader.h) 引入必要的 D3D12 依赖:
| 头文件 | 用途 |
|--------|------|
| `<dxgi_6.h>` | DXGI 6.0 接口,枚举 GPU、管理交换链 |
| `<d3d12.h>` | Direct3D 12 API 核心 |
| `<wrl.h>` | COM 智能指针ComPtr |
### 4.2 核心模块
[D3D12Core.cpp](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Direct3D12/D3D12Core.cpp) 管理 D3D12 设备:
```cpp
namespace {
ID3D12Device8* main_device; // 主设备指针
}
bool initialize() {
// TODO: 确定适配器并创建设备
return true;
}
void shutdown() {
// TODO: 释放设备资源
}
```
### 4.3 接口绑定
[D3D12Interface.cpp](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Direct3D12/D3D12Interface.cpp) 将 D3D12 实现绑定到平台接口:
```cpp
void get_platform_interface(platform_interface& pi) {
pi.initialize = core::initialize;
pi.shutdown = core::shutdown;
}
```
## 5. 渲染表面Render Surface
### 5.1 数据结构
```cpp
class surface {}; // 渲染表面抽象
struct render_surface {
platform::window window{}; // 关联窗口
surface surface{}; // 渲染表面
};
```
### 5.2 多窗口支持
TestRenderer 测试展示了多窗口渲染场景:
- 支持 4 个独立渲染表面
- 每个表面关联独立的平台窗口
- 全屏切换支持Alt+Enter
## 6. 与其他模块的关系
```
┌─────────────────────────────────────────────────┐
│ EngineTest │
│ (TestRenderer 测试) │
└─────────────────────┬───────────────────────────┘
│ 调用
┌─────────────────────────────────────────────────┐
│ Graphics/Renderer │
│ (统一渲染器入口 + 平台选择) │
└─────────────────────┬───────────────────────────┘
│ 分发
┌─────────────┼─────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ D3D12 │ │ Vulkan │ │ OpenGL │
│ Backend │ │ Backend │ │ Backend │
└─────────┘ └─────────┘ └─────────┘
┌─────────────────────────────────────────────────┐
│ Platform/Window │
│ (窗口管理 + 平台抽象) │
└─────────────────────────────────────────────────┘
```
## 7. 扩展指南
### 7.1 添加新图形后端
1. 创建 `Engine/Graphics/Vulkan/``Engine/Graphics/OpenGL/` 目录
2. 实现 `XxxCore.h/.cpp`(初始化/关闭逻辑)
3. 实现 `XxxInterface.cpp``get_platform_interface` 函数)
4.`Renderer.cpp``set_platform_interface` 中添加分支
### 7.2 D3D12 后续开发重点
- 适配器枚举与选择
- 命令队列创建
- 交换链管理
- 描述符堆管理
- 资源创建与管理
- 渲染管线状态对象PSO
- 根签名Root Signature
## 8. 设计优势
1. **平台无关性**:上层代码无需关心底层图形 API
2. **可扩展性**:易于添加新的图形后端
3. **模块化**:各平台实现完全隔离
4. **测试友好**:可通过 TestRenderer 进行独立测试