# 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 进行独立测试
