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
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -24,4 +24,4 @@
|
|||||||
*.db
|
*.db
|
||||||
*.db-shm
|
*.db-shm
|
||||||
*.db-wal
|
*.db-wal
|
||||||
Engine/Graphics_Beta/
|
Graphics_Beta/
|
||||||
|
|||||||
@@ -33,6 +33,10 @@
|
|||||||
<ClInclude Include="EngineAPI\ScriptComponent.h" />
|
<ClInclude Include="EngineAPI\ScriptComponent.h" />
|
||||||
<ClInclude Include="EngineAPI\TransformComponent.h" />
|
<ClInclude Include="EngineAPI\TransformComponent.h" />
|
||||||
<ClInclude Include="EngineAPI\Light.h" />
|
<ClInclude Include="EngineAPI\Light.h" />
|
||||||
|
<ClInclude Include="Graphics\Direct3D12\D3D12CommonHeader.h" />
|
||||||
|
<ClInclude Include="Graphics\Direct3D12\D3D12Core.h" />
|
||||||
|
<ClInclude Include="Graphics\Direct3D12\D3D12Interface.h" />
|
||||||
|
<ClInclude Include="Graphics\GraphicsPlatformInterface.h" />
|
||||||
<ClInclude Include="Graphics\Renderer.h" />
|
<ClInclude Include="Graphics\Renderer.h" />
|
||||||
<ClInclude Include="Platform\IncludeWindowCpp.h" />
|
<ClInclude Include="Platform\IncludeWindowCpp.h" />
|
||||||
<ClInclude Include="Platform\Platform.h" />
|
<ClInclude Include="Platform\Platform.h" />
|
||||||
@@ -53,6 +57,8 @@
|
|||||||
<ClCompile Include="Content\ContentToEngine.cpp" />
|
<ClCompile Include="Content\ContentToEngine.cpp" />
|
||||||
<ClCompile Include="Core\EngineWin32.cpp" />
|
<ClCompile Include="Core\EngineWin32.cpp" />
|
||||||
<ClCompile Include="Core\MainWin32.cpp" />
|
<ClCompile Include="Core\MainWin32.cpp" />
|
||||||
|
<ClCompile Include="Graphics\Direct3D12\D3D12Core.cpp" />
|
||||||
|
<ClCompile Include="Graphics\Direct3D12\D3D12Interface.cpp" />
|
||||||
<ClCompile Include="Graphics\Renderer.cpp" />
|
<ClCompile Include="Graphics\Renderer.cpp" />
|
||||||
<ClCompile Include="Platform\PlatformWin32.cpp" />
|
<ClCompile Include="Platform\PlatformWin32.cpp" />
|
||||||
<ClCompile Include="Platform\Window.cpp" />
|
<ClCompile Include="Platform\Window.cpp" />
|
||||||
|
|||||||
@@ -25,6 +25,10 @@
|
|||||||
<ClInclude Include="EngineAPI\Camera.h" />
|
<ClInclude Include="EngineAPI\Camera.h" />
|
||||||
<ClInclude Include="EngineAPI\Light.h" />
|
<ClInclude Include="EngineAPI\Light.h" />
|
||||||
<ClInclude Include="Graphics\Renderer.h" />
|
<ClInclude Include="Graphics\Renderer.h" />
|
||||||
|
<ClInclude Include="Graphics\Direct3D12\D3D12CommonHeader.h" />
|
||||||
|
<ClInclude Include="Graphics\Direct3D12\D3D12Core.h" />
|
||||||
|
<ClInclude Include="Graphics\Direct3D12\D3D12Interface.h" />
|
||||||
|
<ClInclude Include="Graphics\GraphicsPlatformInterface.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="Components\Entity.cpp" />
|
<ClCompile Include="Components\Entity.cpp" />
|
||||||
@@ -37,5 +41,8 @@
|
|||||||
<ClCompile Include="Platform\PlatformWin32.cpp" />
|
<ClCompile Include="Platform\PlatformWin32.cpp" />
|
||||||
<ClCompile Include="Platform\Window.cpp" />
|
<ClCompile Include="Platform\Window.cpp" />
|
||||||
<ClCompile Include="Content\ContentToEngine.cpp" />
|
<ClCompile Include="Content\ContentToEngine.cpp" />
|
||||||
|
<ClCompile Include="Graphics\Renderer.cpp" />
|
||||||
|
<ClCompile Include="Graphics\Direct3D12\D3D12Core.cpp" />
|
||||||
|
<ClCompile Include="Graphics\Direct3D12\D3D12Interface.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
17
Engine/Graphics/Direct3D12/D3D12CommonHeader.h
Normal file
17
Engine/Graphics/Direct3D12/D3D12CommonHeader.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CommonHeader.h"
|
||||||
|
#include "Graphics\Renderer.h"
|
||||||
|
|
||||||
|
// 引入 DirectX Graphics Infrastructure(DXGI)6.0
|
||||||
|
// 头文件,用于访问 DXGI 接口(如 IDXGIFactory6、
|
||||||
|
// IDXGIAdapter4 等),支持枚举 GPU、查询显示模式、管理
|
||||||
|
// 交换链等底层图形功能
|
||||||
|
#include <dxgi1_6.h>
|
||||||
|
// 引入 Direct3D 12 头文件,提供 D3D12 API 接口,
|
||||||
|
// 用于创建渲染管线、管理资源与 GPU 命令
|
||||||
|
#include <d3d12.h>
|
||||||
|
|
||||||
|
// 引入 Windows Runtime C++ 模板库(WRL)头文件,提供智能指针(如 Microsoft::WRL::ComPtr)
|
||||||
|
// 用于简化 COM 对象的生命周期管理
|
||||||
|
#include <wrl.h>
|
||||||
20
Engine/Graphics/Direct3D12/D3D12Core.cpp
Normal file
20
Engine/Graphics/Direct3D12/D3D12Core.cpp
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#include "D3D12Core.h"
|
||||||
|
#include "D3D12CommonHeader.h"
|
||||||
|
|
||||||
|
namespace XEngine::graphics::d3d12::core{
|
||||||
|
namespace{
|
||||||
|
|
||||||
|
ID3D12Device8* main_device;
|
||||||
|
|
||||||
|
}// anonymous namespace
|
||||||
|
bool
|
||||||
|
initialize()
|
||||||
|
{
|
||||||
|
// determine which adapter
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
shutdown()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}// namespace XEngine::graphics::d3d12::core
|
||||||
6
Engine/Graphics/Direct3D12/D3D12Core.h
Normal file
6
Engine/Graphics/Direct3D12/D3D12Core.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace XEngine::graphics::d3d12::core{
|
||||||
|
bool initialize();
|
||||||
|
void shutdown();
|
||||||
|
}// namespace XEngine::graphics::d3d12
|
||||||
14
Engine/Graphics/Direct3D12/D3D12Interface.cpp
Normal file
14
Engine/Graphics/Direct3D12/D3D12Interface.cpp
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#include "D3D12Interface.h"
|
||||||
|
#include "D3D12Core.h"
|
||||||
|
#include "Graphics\GraphicsPlatformInterface.h"
|
||||||
|
|
||||||
|
namespace XEngine::graphics::d3d12{
|
||||||
|
void get_platform_interface(platform_interface& pi)
|
||||||
|
{
|
||||||
|
pi.initialize = core::initialize;
|
||||||
|
pi.shutdown = core::shutdown;
|
||||||
|
}
|
||||||
|
}// namespace XEngine::graphics::d3d12
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
9
Engine/Graphics/Direct3D12/D3D12Interface.h
Normal file
9
Engine/Graphics/Direct3D12/D3D12Interface.h
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace XEngine::graphics{
|
||||||
|
struct platform_interface;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace XEngine::graphics::d3d12{
|
||||||
|
void get_platform_interface(platform_interface& gfx);
|
||||||
|
}// namespace XEngine::graphics::d3d12
|
||||||
11
Engine/Graphics/GraphicsPlatformInterface.h
Normal file
11
Engine/Graphics/GraphicsPlatformInterface.h
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CommonHeader.h"
|
||||||
|
#include "Renderer.h"
|
||||||
|
|
||||||
|
namespace XEngine::graphics{
|
||||||
|
struct platform_interface{
|
||||||
|
bool(*initialize)(void);
|
||||||
|
void(*shutdown)(void);
|
||||||
|
};
|
||||||
|
}// namespace XEngine::graphics
|
||||||
|
|
||||||
38
Engine/Graphics/Renderer.cpp
Normal file
38
Engine/Graphics/Renderer.cpp
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#include "Renderer.h"
|
||||||
|
#include "GraphicsPlatformInterface.h"
|
||||||
|
#include "Direct3D12/D3D12Interface.h"
|
||||||
|
|
||||||
|
namespace XEngine::graphics {
|
||||||
|
namespace {
|
||||||
|
platform_interface gfx{};
|
||||||
|
bool
|
||||||
|
set_platform_interface(graphics_platform platform)
|
||||||
|
{
|
||||||
|
switch (platform)
|
||||||
|
{
|
||||||
|
case graphics_platform::direct3d12:
|
||||||
|
d3d12::get_platform_interface(gfx);
|
||||||
|
break;
|
||||||
|
case graphics_platform::vulkan:
|
||||||
|
//vulkan::get_platform_interface(gfx);
|
||||||
|
break;
|
||||||
|
case graphics_platform::opengl:
|
||||||
|
//opengl::get_platform_interface(gfx);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return gfx.initialize();
|
||||||
|
}
|
||||||
|
}// anonymous namespace
|
||||||
|
|
||||||
|
bool initialize(graphics_platform platform)
|
||||||
|
{
|
||||||
|
return set_platform_interface(platform);
|
||||||
|
}
|
||||||
|
|
||||||
|
void shutdown()
|
||||||
|
{
|
||||||
|
gfx.shutdown();
|
||||||
|
}
|
||||||
|
}// namespace XEngine::graphics
|
||||||
28
Engine/Graphics/Renderer.h
Normal file
28
Engine/Graphics/Renderer.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "CommonHeader.h"
|
||||||
|
#include "..\Platform\Window.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace XEngine::graphics {
|
||||||
|
|
||||||
|
class surface
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
struct render_surface
|
||||||
|
{
|
||||||
|
platform::window window{};
|
||||||
|
surface surface{};
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class graphics_platform : u32
|
||||||
|
{
|
||||||
|
direct3d12 = 0,
|
||||||
|
vulkan = 1,
|
||||||
|
opengl = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool initialize(graphics_platform platform);
|
||||||
|
void shutdown();
|
||||||
|
|
||||||
|
}
|
||||||
111
EngineTest/TestRenderer.cpp
Normal file
111
EngineTest/TestRenderer.cpp
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
/**
|
||||||
|
* @file TestRenderer.cpp
|
||||||
|
* @brief 渲染功能综合测试实现。
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "TestRenderer.h"
|
||||||
|
#include "Graphics/Renderer.h"
|
||||||
|
#include "Platform/Platform.h"
|
||||||
|
#include "Platform/PlatformTypes.h"
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
|
#if TEST_RENDERER
|
||||||
|
using namespace XEngine;
|
||||||
|
|
||||||
|
graphics::render_surface _surfaces[4];
|
||||||
|
|
||||||
|
LRESULT win_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||||
|
{
|
||||||
|
bool toggle_fullscreen{ false };
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_DESTROY:
|
||||||
|
{
|
||||||
|
bool all_closed{ true };
|
||||||
|
for (u32 i{ 0 }; i < _countof(_surfaces); ++i)
|
||||||
|
{
|
||||||
|
if(!_surfaces[i].window.is_closed())
|
||||||
|
{
|
||||||
|
all_closed = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (all_closed)
|
||||||
|
{
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_SYSCHAR:
|
||||||
|
{
|
||||||
|
|
||||||
|
if(wparam == VK_RETURN && (HIWORD(lparam) & KF_ALTDOWN))
|
||||||
|
{
|
||||||
|
platform::window win{ platform::window_id{(id::id_type)GetWindowLongPtr(hwnd, GWLP_USERDATA)} };
|
||||||
|
win.set_fullscreen(!win.is_fullscreen());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return DefWindowProc(hwnd, msg, wparam, lparam);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
create_render_surface(graphics::render_surface& surface, const platform::window_init_info info)
|
||||||
|
{
|
||||||
|
surface.window = platform::create_window(&info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_destroy_render_surface(graphics::render_surface& surface)
|
||||||
|
{
|
||||||
|
platform::remove_window(surface.window.get_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
engine_test::initialize()
|
||||||
|
{
|
||||||
|
bool result{ graphics::initialize(graphics::graphics_platform::direct3d12) };
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
platform::window_init_info info[]
|
||||||
|
{
|
||||||
|
{&win_proc, nullptr, L"Test Window 1", 200, 100,400,400},
|
||||||
|
{&win_proc, nullptr, L"Test Window 2", 700, 100,400,400},
|
||||||
|
{&win_proc, nullptr, L"Test Window 2", 700, 100,400,400},
|
||||||
|
{&win_proc, nullptr, L"Test Window 3", 1200,100,400,400},
|
||||||
|
};
|
||||||
|
static_assert(_countof(info) == _countof(_surfaces));
|
||||||
|
for (u32 i{ 0 }; i < _countof(_surfaces); ++i)
|
||||||
|
{
|
||||||
|
create_render_surface(_surfaces[i], info[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
engine_test::run()
|
||||||
|
{
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
engine_test::shutdown()
|
||||||
|
{
|
||||||
|
for (u32 i{ 0 }; i < _countof(_surfaces); ++i)
|
||||||
|
{
|
||||||
|
_destroy_render_surface(_surfaces[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics::shutdown();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
15
EngineTest/TestRenderer.h
Normal file
15
EngineTest/TestRenderer.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* @file TestRenderer.h
|
||||||
|
* @brief 渲染测试用例类声明。
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include "Test.h"
|
||||||
|
|
||||||
|
|
||||||
|
class engine_test : public Test
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
bool initialize() override;
|
||||||
|
void run() override;
|
||||||
|
bool shutdown() override;
|
||||||
|
};
|
||||||
101
docs/changelogs/2026-03/20260326-d3d12-foundation.md
Normal file
101
docs/changelogs/2026-03/20260326-d3d12-foundation.md
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
# 变更记录:D3D12 基础框架
|
||||||
|
|
||||||
|
**提交日期**: 2026-03-26
|
||||||
|
**提交哈希**: `16723ba`
|
||||||
|
**变更类型**: 新增功能
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 变更概述
|
||||||
|
|
||||||
|
本次提交新增了 Graphics 渲染模块和 Direct3D12 后端框架,实现了平台抽象层设计,为后续图形渲染功能奠定基础。
|
||||||
|
|
||||||
|
## 新增文件
|
||||||
|
|
||||||
|
### Engine/Graphics/Direct3D12/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `D3D12CommonHeader.h` | D3D12 公共头文件,引入 DXGI、D3D12、WRL 依赖 |
|
||||||
|
| `D3D12Core.h` | D3D12 核心模块头文件 |
|
||||||
|
| `D3D12Core.cpp` | D3D12 核心初始化/关闭实现(框架代码) |
|
||||||
|
| `D3D12Interface.h` | 平台接口绑定声明 |
|
||||||
|
| `D3D12Interface.cpp` | 将 D3D12 实现绑定到平台接口 |
|
||||||
|
|
||||||
|
### Engine/Graphics/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `GraphicsPlatformInterface.h` | 平台抽象接口定义 |
|
||||||
|
| `Renderer.h` | 统一渲染器入口声明 |
|
||||||
|
| `Renderer.cpp` | 渲染器初始化与平台选择逻辑 |
|
||||||
|
|
||||||
|
### EngineTest/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `TestRenderer.h` | 渲染测试类声明 |
|
||||||
|
| `TestRenderer.cpp` | 多窗口渲染测试实现 |
|
||||||
|
|
||||||
|
### docs/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `架构分析/Graphics渲染架构分析.md` | Graphics 模块架构分析文档 |
|
||||||
|
| `wiki/D3D12学习Wiki.md` | D3D12 学习知识汇总 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 技术要点
|
||||||
|
|
||||||
|
### 1. 平台抽象接口
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
struct platform_interface {
|
||||||
|
bool(*initialize)(void);
|
||||||
|
void(*shutdown)(void);
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
通过函数指针实现运行时平台选择,支持 D3D12/Vulkan/OpenGL 多后端。
|
||||||
|
|
||||||
|
### 2. 渲染器入口
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
enum class graphics_platform : u32 {
|
||||||
|
direct3d12 = 0,
|
||||||
|
vulkan = 1,
|
||||||
|
opengl = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool initialize(graphics_platform platform);
|
||||||
|
void shutdown();
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 多窗口测试
|
||||||
|
|
||||||
|
TestRenderer 支持创建 4 个独立渲染窗口,并实现 Alt+Enter 全屏切换。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 依赖引入
|
||||||
|
|
||||||
|
- `<dxgi_6.h>` - DXGI 6.0 接口
|
||||||
|
- `<d3d12.h>` - Direct3D 12 API
|
||||||
|
- `<wrl.h>` - COM 智能指针
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 后续工作
|
||||||
|
|
||||||
|
- [ ] 适配器枚举与设备创建
|
||||||
|
- [ ] 命令队列实现
|
||||||
|
- [ ] 交换链管理
|
||||||
|
- [ ] 描述符堆
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [Graphics渲染架构分析](../架构分析/Graphics渲染架构分析.md)
|
||||||
|
- [D3D12学习Wiki](../wiki/D3D12学习Wiki.md)
|
||||||
116
docs/changelogs/2026-03/20260326-dx12-initial.md
Normal file
116
docs/changelogs/2026-03/20260326-dx12-initial.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# 变更记录:DX12 初始框架
|
||||||
|
|
||||||
|
**提交日期**: 2026-03-26
|
||||||
|
**提交哈希**: `60f73b5`
|
||||||
|
**变更类型**: 初始化项目
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 变更概述
|
||||||
|
|
||||||
|
本次提交是项目的初始版本,建立了完整的引擎基础框架,包括组件系统、平台抽象层、内容加载器和测试框架。
|
||||||
|
|
||||||
|
## 新增模块
|
||||||
|
|
||||||
|
### Engine/Common/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `CommonHeader.h` | 公共头文件,定义基础类型和宏 |
|
||||||
|
| `Id.h` | 强类型 ID 系统 |
|
||||||
|
| `XEnginType.h` | 引擎类型定义 |
|
||||||
|
|
||||||
|
### Engine/Components/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `Entity.cpp/.h` | 实体组件实现 |
|
||||||
|
| `Script.cpp/.h` | 脚本组件实现 |
|
||||||
|
| `Transform.cpp/.h` | 变换组件实现 |
|
||||||
|
|
||||||
|
### Engine/EngineAPI/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `Camera.h` | 相机 API |
|
||||||
|
| `GameEntity.h` | 游戏实体 API |
|
||||||
|
| `Light.h` | 光源 API |
|
||||||
|
| `ScriptComponent.h` | 脚本组件 API |
|
||||||
|
| `TransformComponent.h` | 变换组件 API |
|
||||||
|
|
||||||
|
### Engine/Platform/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `Platform.h` | 平台抽象接口 |
|
||||||
|
| `PlatformTypes.h` | 平台类型定义 |
|
||||||
|
| `PlatformWin32.cpp` | Win32 平台实现 |
|
||||||
|
| `Window.cpp/.h` | 窗口管理 |
|
||||||
|
|
||||||
|
### Engine/Content/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `ContentLoader.cpp/.h` | 内容加载器 |
|
||||||
|
| `ContentToEngine.cpp/.h` | 内容到引擎转换 |
|
||||||
|
|
||||||
|
### Engine/Utilities/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `FreeList.h` | 空闲列表内存池 |
|
||||||
|
| `IOStream.h` | IO 流工具 |
|
||||||
|
| `Math.h` | 数学工具 |
|
||||||
|
| `MathTypes.h` | 数学类型 |
|
||||||
|
| `Vector.h` | 向量容器 |
|
||||||
|
| `Utilities.h` | 通用工具 |
|
||||||
|
|
||||||
|
### ContentTools/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `FbxImporter.cpp/.h` | FBX 模型导入 |
|
||||||
|
| `Geometry.cpp/.h` | 几何处理 |
|
||||||
|
| `MeshPrimitives.cpp/.h` | 网格图元 |
|
||||||
|
|
||||||
|
### EngineTest/
|
||||||
|
|
||||||
|
| 文件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `Main.cpp` | 测试入口 |
|
||||||
|
| `Test.h` | 测试框架基类 |
|
||||||
|
| `TestEntityComponent.h` | 实体组件测试 |
|
||||||
|
| `ShaderComponents.cpp/.h` | 着色器组件测试 |
|
||||||
|
| `Lights.cpp` | 光源测试 |
|
||||||
|
| `RenderItem.cpp` | 渲染项测试 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 核心设计
|
||||||
|
|
||||||
|
### 1. 强类型 ID 系统
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
DEFINE_TYPED_ID(id_type);
|
||||||
|
```
|
||||||
|
|
||||||
|
通过宏生成类型安全的 ID,支持代数校验防止使用已删除对象。
|
||||||
|
|
||||||
|
### 2. 组件系统架构
|
||||||
|
|
||||||
|
- **EngineAPI 层**: 对外契约,暴露稳定接口
|
||||||
|
- **Components 层**: 运行时实现,管理内部存储
|
||||||
|
|
||||||
|
### 3. 平台抽象
|
||||||
|
|
||||||
|
Win32 平台实现封装,上层代码通过抽象接口访问平台功能。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 相关文档
|
||||||
|
|
||||||
|
- [Id机制分析](../架构分析/Id机制分析.md)
|
||||||
|
- [Entity组件分析](../架构分析/Entity组件分析.md)
|
||||||
|
- [Script组件分析](../架构分析/Script组件分析.md)
|
||||||
|
- [Transform组件分析](../架构分析/Transform组件分析.md)
|
||||||
|
- [项目约定规范](../架构分析/项目约定规范.md)
|
||||||
24
docs/changelogs/README.md
Normal file
24
docs/changelogs/README.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# 变更日志索引
|
||||||
|
|
||||||
|
本目录记录每次代码提交的详细变更文档。
|
||||||
|
|
||||||
|
## 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
changelogs/
|
||||||
|
├── README.md # 本文件 - 索引
|
||||||
|
├── 2026-03/ # 按月份组织
|
||||||
|
│ └── xxx.md # 具体变更文档
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## 变更记录
|
||||||
|
|
||||||
|
| 日期 | 提交 | 变更内容 |
|
||||||
|
|------|------|----------|
|
||||||
|
| 2026-03-26 | [Graphics模块](./2026-03/20260326-d3d12-foundation.md) | Graphics 模块与 D3D12 后端框架 |
|
||||||
|
| 2026-03-19 | [DX12初始框架](./2026-03/20260326-dx12-initial.md) | 初始 DX12 基础框架 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> 每次提交变更后,请在对应月份目录下创建独立的变更文档。
|
||||||
230
docs/wiki/D3D12学习Wiki.md
Normal file
230
docs/wiki/D3D12学习Wiki.md
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
# Direct3D 12 学习 Wiki
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
本文档是项目中 Direct3D 12 学习的基础知识汇总,帮助理解 D3D12 的核心概念和项目中的实现方式。
|
||||||
|
|
||||||
|
## 1. D3D12 核心概念
|
||||||
|
|
||||||
|
### 1.1 什么是 Direct3D 12?
|
||||||
|
|
||||||
|
Direct3D 12 是微软推出的底层图形 API,相比 D3D11,它提供了:
|
||||||
|
|
||||||
|
- **更底层的硬件控制**:开发者可以更精细地控制 GPU
|
||||||
|
- **更低的 CPU 开销**:减少驱动程序的 CPU 时间
|
||||||
|
- **更好的多线程支持**:支持多线程命令录制
|
||||||
|
- **显式的资源管理**:开发者完全控制资源生命周期
|
||||||
|
|
||||||
|
### 1.2 核心组件
|
||||||
|
|
||||||
|
| 组件 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| **Device(设备)** | 代表物理 GPU 的逻辑抽象,用于创建所有 D3D12 对象 |
|
||||||
|
| **Command Queue(命令队列)** | GPU 执行命令的队列 |
|
||||||
|
| **Command List(命令列表)** | 记录 GPU 命令的容器 |
|
||||||
|
| **Swap Chain(交换链)** | 管理后台缓冲区和前台显示 |
|
||||||
|
| **Descriptor Heap(描述符堆)** | 存储资源描述符(视图)的内存池 |
|
||||||
|
| **Root Signature(根签名)** | 定义着色器如何访问资源 |
|
||||||
|
|
||||||
|
## 2. DXGI(DirectX Graphics Infrastructure)
|
||||||
|
|
||||||
|
### 2.1 DXGI 的作用
|
||||||
|
|
||||||
|
DXGI 是 DirectX 与图形硬件之间的抽象层,负责:
|
||||||
|
|
||||||
|
- 枚举显示适配器
|
||||||
|
- 管理显示输出
|
||||||
|
- 创建交换链
|
||||||
|
- 处理全屏/窗口切换
|
||||||
|
|
||||||
|
### 2.2 关键接口
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
IDXGIFactory6 // DXGI 工厂,创建其他 DXGI 对象
|
||||||
|
IDXGIAdapter4 // 代表物理 GPU 适配器
|
||||||
|
IDXGIOutput // 代表显示器输出
|
||||||
|
IDXGISwapChain // 交换链接口
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 项目中的使用
|
||||||
|
|
||||||
|
在 [D3D12CommonHeader.h](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Direct3D12/D3D12CommonHeader.h) 中引入了 `dxgi_6.h`:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <dxgi_6.h> // DXGI 6.0,支持枚举 GPU、查询显示模式
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. D3D12 初始化流程
|
||||||
|
|
||||||
|
### 3.1 标准初始化步骤
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 创建 DXGI Factory
|
||||||
|
↓
|
||||||
|
2. 枚举并选择适配器(GPU)
|
||||||
|
↓
|
||||||
|
3. 创建 D3D12 Device
|
||||||
|
↓
|
||||||
|
4. 创建命令队列
|
||||||
|
↓
|
||||||
|
5. 创建交换链
|
||||||
|
↓
|
||||||
|
6. 创建描述符堆
|
||||||
|
↓
|
||||||
|
7. 创建命令分配器和命令列表
|
||||||
|
↓
|
||||||
|
8. 创建同步对象(Fence)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 项目当前状态
|
||||||
|
|
||||||
|
[D3D12Core.cpp](file:///d:/AllWX/AllC/FeatureExtractDemo/Engine/Graphics/Direct3D12/D3D12Core.cpp) 目前是框架代码:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
namespace {
|
||||||
|
ID3D12Device8* main_device; // 已声明主设备
|
||||||
|
}
|
||||||
|
|
||||||
|
bool initialize() {
|
||||||
|
// TODO: 实现适配器选择和设备创建
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. COM 对象管理
|
||||||
|
|
||||||
|
### 4.1 什么是 COM?
|
||||||
|
|
||||||
|
COM(Component Object Model)是微软的组件对象模型,D3D12 对象都是 COM 对象。
|
||||||
|
|
||||||
|
### 4.2 智能指针
|
||||||
|
|
||||||
|
项目使用 WRL 库的 `ComPtr` 管理 COM 对象生命周期:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <wrl.h> // 提供 Microsoft::WRL::ComPtr
|
||||||
|
|
||||||
|
// 使用示例
|
||||||
|
Microsoft::WRL::ComPtr<ID3D12Device8> device;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 ComPtr 的优势
|
||||||
|
|
||||||
|
- **自动引用计数**:无需手动 AddRef/Release
|
||||||
|
- **异常安全**:即使发生异常也能正确释放
|
||||||
|
- **代码简洁**:减少内存管理代码
|
||||||
|
|
||||||
|
## 5. 平台抽象设计
|
||||||
|
|
||||||
|
### 5.1 设计理念
|
||||||
|
|
||||||
|
项目采用**平台抽象层**设计,将图形 API 的差异封装在统一接口后:
|
||||||
|
|
||||||
|
```
|
||||||
|
┌────────────────────────────────────┐
|
||||||
|
│ 上层渲染代码 │
|
||||||
|
│ graphics::initialize(platform) │
|
||||||
|
└──────────────┬─────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌────────────────────────────────────┐
|
||||||
|
│ platform_interface │
|
||||||
|
│ - initialize() │
|
||||||
|
│ - shutdown() │
|
||||||
|
└──────────────┬─────────────────────┘
|
||||||
|
│
|
||||||
|
┌──────────┼──────────┐
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌───────┐ ┌───────┐ ┌───────┐
|
||||||
|
│ D3D12 │ │Vulkan │ │OpenGL │
|
||||||
|
└───────┘ └───────┘ └───────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 接口绑定机制
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// D3D12Interface.cpp
|
||||||
|
void get_platform_interface(platform_interface& pi) {
|
||||||
|
pi.initialize = core::initialize;
|
||||||
|
pi.shutdown = core::shutdown;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
这种设计允许:
|
||||||
|
- 编译时或运行时切换图形后端
|
||||||
|
- 各后端独立开发和测试
|
||||||
|
- 上层代码与具体 API 解耦
|
||||||
|
|
||||||
|
## 6. 渲染表面与窗口
|
||||||
|
|
||||||
|
### 6.1 render_surface 结构
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
struct render_surface {
|
||||||
|
platform::window window{}; // 平台窗口
|
||||||
|
surface surface{}; // 渲染表面
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 多窗口支持
|
||||||
|
|
||||||
|
TestRenderer 测试展示了多窗口渲染:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
graphics::render_surface _surfaces[4]; // 支持 4 个窗口
|
||||||
|
|
||||||
|
// 创建多个渲染表面
|
||||||
|
for (u32 i{0}; i < _countof(_surfaces); ++i) {
|
||||||
|
create_render_surface(_surfaces[i], info[i]);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 全屏切换
|
||||||
|
|
||||||
|
通过 `WM_SYSCHAR` 消息处理 Alt+Enter:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
if (wparam == VK_RETURN && (HIWORD(lparam) & KF_ALTDOWN)) {
|
||||||
|
win.set_fullscreen(!win.is_fullscreen());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. 后续学习路径
|
||||||
|
|
||||||
|
### 7.1 基础阶段
|
||||||
|
|
||||||
|
- [ ] 完成设备创建和适配器枚举
|
||||||
|
- [ ] 创建命令队列和命令列表
|
||||||
|
- [ ] 实现交换链和后台缓冲区
|
||||||
|
- [ ] 渲染第一个三角形
|
||||||
|
|
||||||
|
### 7.2 进阶阶段
|
||||||
|
|
||||||
|
- [ ] 描述符堆管理
|
||||||
|
- [ ] 根签名和管线状态对象
|
||||||
|
- [ ] 资源屏障和同步
|
||||||
|
- [ ] 常量缓冲区和着色器资源
|
||||||
|
|
||||||
|
### 7.3 高级阶段
|
||||||
|
|
||||||
|
- [ ] 多线程渲染
|
||||||
|
- [ ] 资源绑定策略
|
||||||
|
- [ ] 动态资源管理
|
||||||
|
- [ ] 性能优化
|
||||||
|
|
||||||
|
## 8. 参考资源
|
||||||
|
|
||||||
|
### 8.1 官方文档
|
||||||
|
|
||||||
|
- [Microsoft D3D12 文档](https://docs.microsoft.com/en-us/windows/win32/direct3d12/direct3d-12-graphics)
|
||||||
|
- [DXGI 文档](https://docs.microsoft.com/en-us/windows/win32/direct3ddxgi/dx-graphics-dxgi)
|
||||||
|
|
||||||
|
### 8.2 推荐书籍
|
||||||
|
|
||||||
|
- 《Introduction to 3D Game Programming with DirectX 12》
|
||||||
|
- 《Real-Time 3D Rendering with DirectX and HLSL》
|
||||||
|
|
||||||
|
### 8.3 项目相关文档
|
||||||
|
|
||||||
|
- [Graphics渲染架构分析](./Graphics渲染架构分析.md)
|
||||||
|
- [项目约定规范](./项目约定规范.md)
|
||||||
182
docs/架构分析/Graphics渲染架构分析.md
Normal file
182
docs/架构分析/Graphics渲染架构分析.md
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
# 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 进行独立测试
|
||||||
Reference in New Issue
Block a user