首先创建D3D12设备与命令队列,启用调试层并初始化交换链;接着配置命令列表与围栏实现同步;最后在渲染循环中清屏并提交命令,完成基础框架搭建。

要用c++和DirectX 12编写一个简单的渲染程序,你需要理解现代图形API的核心机制:设备创建、命令队列、交换链、资源管理以及如何提交绘制命令。下面是一个简化的入门流程,帮助你搭建一个基础的DirectX 12渲染框架。
初始化D3D12设备与命令队列
DirectX 12要求手动管理GPU资源和命令流。第一步是创建一个ID3D12Device对象,它是所有后续操作的基础。
在调试阶段,建议启用调试层以捕获常见错误:
- 调用
D3D12GetDebugInterface获取调试接口,并设置ID3D12Debug::EnableDebugLayer() - 使用
D3D12CreateDevice创建设备,通常传入nullptr表示默认适配器 - 创建命令队列(ID3D12CommandQueue),指定类型为
D3D12_COMMAND_LIST_TYPE_DIRECT用于图形绘制
创建交换链与后台缓冲区
要显示图像,需要通过DXGI创建交换链(IDXGISwapChain4)。它负责将渲染结果呈现到窗口。
立即学习“C++免费学习笔记(深入)”;
关键步骤包括:
- 使用
CreateDXGIFactory2创建工厂对象 - 配置
DXGI_SWAP_CHAIN_DESC:设置缓冲区数量(通常为2或3)、格式(如DXGI_FORMAT_R8G8B8A8_UNORM)、刷新率等 - 调用
factory->CreateSwapChainForHwnd创建交换链 - 从交换链获取后台缓冲区纹理,创建对应的渲染目标视图(RTV)
准备命令列表与同步机制
DirectX 12中,所有GPU操作都通过命令列表执行。你需要:
- 创建命令分配器(ID3D12CommandAllocator)和命令列表(ID3D12GraphicsCommandList)
- 每帧重用分配器前需重置(Reset)
- 记录清屏操作:
ClearRenderTargetView清除后台缓冲区 - 使用围栏(ID3D12Fence)和事件句柄实现CPU与GPU同步,防止资源冲突
- 通过命令队列的
signal和Wait控制帧间依赖
简单渲染循环示例
主循环大致结构如下:
- 等待GPU完成上一帧(可选,取决于同步策略)
- 获取当前后台缓冲区索引
- 重置命令分配器和命令列表
- 设置渲染目标并清除颜色
- 关闭命令列表并提交到队列
- 调用
Present(1, 0)显示帧 - 递增围栏值并触发信号,以便后续同步
此时你还未绘制任何几何体,但已经能看到清屏颜色变化。
基本上就这些。虽然比D3D11复杂很多,但这种显式控制带来了更高的效率和灵活性。掌握这个骨架后,你可以逐步添加顶点缓冲、着色器、管线状态对象(PSO)来绘制三角形。