115 lines
2.7 KiB
Markdown
115 lines
2.7 KiB
Markdown
|
|
# HelloEarth
|
|||
|
|
|
|||
|
|
基础 DirectX 12 渲染示例项目,展示如何搭建基本的渲染管线。
|
|||
|
|
|
|||
|
|
## 简介
|
|||
|
|
|
|||
|
|
HelloEarth 是 XCEngine 项目的入门级示例,通过渲染一个带纹理的球体,帮助理解 DirectX 12 的核心概念和渲染流程。
|
|||
|
|
|
|||
|
|
## 技术栈
|
|||
|
|
|
|||
|
|
- **渲染 API**: DirectX 12
|
|||
|
|
- **语言**: C++17
|
|||
|
|
- **构建系统**: CMake
|
|||
|
|
- **依赖库**: DirectX 12 SDK, stb_image
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
HelloEarth/
|
|||
|
|
├── main.cpp # 程序入口
|
|||
|
|
├── BattleFireDirect.cpp/h # DirectX 12 核心渲染实现
|
|||
|
|
├── StaticMeshComponent.cpp/h # 静态网格组件
|
|||
|
|
├── Utils.cpp/h # 工具函数
|
|||
|
|
├── stbi/ # 图像加载库
|
|||
|
|
│ ├── stb_image.h
|
|||
|
|
│ └── stb_image.cpp
|
|||
|
|
└── Res/ # 资源文件
|
|||
|
|
├── Shader/
|
|||
|
|
│ ├── gs.hlsl # 几何着色器
|
|||
|
|
│ └── ndctriangle.hlsl # 三角形着色器
|
|||
|
|
├── Model/
|
|||
|
|
│ └── Sphere.lhsm # 球体模型
|
|||
|
|
└── Image/
|
|||
|
|
└── earth_d.jpg # 地球纹理
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 构建方法
|
|||
|
|
|
|||
|
|
### 前置要求
|
|||
|
|
|
|||
|
|
- Windows 10/11
|
|||
|
|
- Visual Studio 2019 或更高版本
|
|||
|
|
- CMake 3.15+
|
|||
|
|
|
|||
|
|
### 构建步骤
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 创建并进入构建目录
|
|||
|
|
mkdir build && cd build
|
|||
|
|
|
|||
|
|
# 配置项目
|
|||
|
|
cmake ..
|
|||
|
|
|
|||
|
|
# 编译
|
|||
|
|
cmake --build . --config Release
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 运行
|
|||
|
|
|
|||
|
|
编译完成后运行 `HelloEarth.exe`(如果生成了可执行文件)
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
### 渲染管线
|
|||
|
|
- DirectX 12 渲染环境初始化
|
|||
|
|
- 命令队列和命令列表管理
|
|||
|
|
- 资源转换和同步
|
|||
|
|
|
|||
|
|
### 着色器
|
|||
|
|
- 顶点着色器(VS)
|
|||
|
|
- 几何着色器(GS)
|
|||
|
|
- 像素着色器(PS)
|
|||
|
|
|
|||
|
|
### 资源管理
|
|||
|
|
- 静态网格加载和渲染
|
|||
|
|
- 纹理加载(支持 JPG/PNG)
|
|||
|
|
- 常量缓冲区管理
|
|||
|
|
- 着色器资源视图(SRV)
|
|||
|
|
|
|||
|
|
### 数学运算
|
|||
|
|
- 投影矩阵(Perspective Projection)
|
|||
|
|
- 视图矩阵(View Matrix)
|
|||
|
|
- 模型矩阵(Model Matrix)
|
|||
|
|
- 法线矩阵计算
|
|||
|
|
|
|||
|
|
## 核心概念
|
|||
|
|
|
|||
|
|
### 渲染流程
|
|||
|
|
1. 初始化 D3D12 设备和命令队列
|
|||
|
|
2. 创建命令分配器和命令列表
|
|||
|
|
3. 加载着色器(编译 HLSL)
|
|||
|
|
4. 创建根签名和 PSO 管道状态
|
|||
|
|
5. 加载网格模型和纹理
|
|||
|
|
6. 创建常量缓冲区并更新数据
|
|||
|
|
7. 渲染循环:
|
|||
|
|
- 重置命令分配器和列表
|
|||
|
|
- 设置渲染目标
|
|||
|
|
- 设置根签名和 PSO
|
|||
|
|
- 设置描述符堆
|
|||
|
|
- 绑定常量缓冲和纹理
|
|||
|
|
- 提交绘制命令
|
|||
|
|
- 呈现交换链
|
|||
|
|
|
|||
|
|
### 关键接口
|
|||
|
|
- `InitD3D12` - 初始化 DirectX 12
|
|||
|
|
- `CreateShaderFromFile` - 从文件加载着色器
|
|||
|
|
- `CreatePSO` - 创建管道状态对象
|
|||
|
|
- `StaticMeshComponent::Render` - 渲染网格
|
|||
|
|
|
|||
|
|
## 资源说明
|
|||
|
|
|
|||
|
|
- 模型文件格式:`.lhsm`(自定义格式)
|
|||
|
|
- 纹理支持:PNG、JPG
|
|||
|
|
- 着色器:HLSL(Shader Model 5.1)
|