项目初始化
创建项目
D3D12项目通常是桌面程序,在新建项目时应该选择:

并选择“桌面应用程序(.exe)”,勾选”空项目“:

需要注意,对于桌面程序,其程序主入口通常是WINAPI WinMain而不是main:
支撑文件
WinInclude.h
设置一个头文件以引用在整个项目中都会引用到的依赖库,并在后续其它文件中都引用该头文件,以避免多次引用同一个库导致重复定义和其它异常。
在这里将其命名为WinInclude.h,放在/Support/下,通常一个D3D12项目的WinInclude.h文件至少需要包含以下内容:
支撑文件
项目属性
打开项目属性,分步进行以下设置:
依赖项
选择配置属性->链接器->输入->附加依赖项,增加d3d12.lib;dxgi.lib;dxguid.lib。

-
d3d12.lib
D3D12的核心静态库,提供与GPU交互的底层接口与函数,用于创建Deivce、Commond Queue、PSO和Assets(Buffer/Textrue)等。
常用于初始化d3d12设备,管理渲染管线、提交绘制命令、同步GPU和CPU等。
-
dxgi.lib
DXGI的静态库,负责图形的硬件抽象层,提供了与GPU、SwapChain、显示模式等的相关功能。
常用于枚举GPU适配器、创建SwapChain、查询显示器支持的显示模式等。
-
dxguid.lib
包含DXGI和Direct3D接口的GUID定义,用于唯一标识COM接口。
包含目录
选择配置属性->VC++目录->包含目录,添加当前项目的根目录,以便在项目中include。

浮点模型和SSE2
选择配置属性->C/C++->代码生成->浮点模型,选择快速(/fp:fast)。
同一页面找到启用增强指令集,选择流式处理SIMD拓展2(/arch:SSE2);这一步仅在x86平台是必须的,x64默认支持SSE2。

D3D初始化
总体流程:
- 创建
ID3D12Device实例 - 创建
ID3D12Fence实例,并查询Descriptor大小 - 检查设备对4X MSAA的支持情况
- 依次构建Command Queue、Command Allocator和Command List。
- 描述并创建Swap Chain。
- 创建Descriptor Heap。
- 调整后台缓冲区大小,创建RTV(渲染目标视图)
- 创建深度/模板缓冲区和关联视图
- 设置视口和裁剪矩形。