0x00 安装 Visual Studio 2019
安装 Visual Studio 2019 以及相关组件。
注:安装组件时带的 Windows 10 SDK 可以在 Individual components 中更换,这里更换为 10.0.19041.0。
0x01 新建工程
打开 Visual Studio 2019 并创建一个空项目,名字随意。
0x02 下载源码
源码下载地址:https://github.com/d3dcoder/d3d12book
下载完成后将整个 Common
及 Chapter 6 Drawing in Direct3D\\Box
中的 Shaders
和 BoxApp.cpp
复制到 0x02 步骤创建的项目中。
我的项目名为 dx12
,拷贝后的文件结构如下(红色框中的是复制过来的文件):
0x03 构建项目
1.右键单击解决方案资源管理器
的项目名称,在弹出的下拉菜单中依次选择 Add(添加)
-> Existing Item(现有项)
,将文件 BoxApp.cpp
以及 Common
文件夹中的所有文件添加到项目中。添加后,解决方案资源管理器看起来应该和下图相同。
2.右键单击解决方案资源管理器
的项目名称,在弹出的下拉菜单中选择 Properties(属性)
。再从 Configuration Properties(配置属性)
-> General(常规)
选项卡中,将 Windows SDK Version
设置为版本10.0.19041.0(0x01 安装的 Windows 10 SDK 版本)。
3.在主菜单中选择 Debug(调试)
-> Start Debugging(开始调试)
进行编译。
0x04 解决报错
点击开始调试后并没有成功运行项目,还有一些报错需要解决。
error C1083
首先是 BoxApp.cpp
中,遇到报错,无法打开源文件:
这一报错是由于我们创建的项目的文件结构与官方示例项目的文件结构有所不同。这里可以按照示例的文件结构来构建我们的项目,也可以修改这里的引用路径,使之符合我们的项目结构。我用的是第二种方法,修改后报错消失:
error C2664
error C2664: 'HANDLE CreateEventExW(LPSECURITY_ATTRIBUTES,LPCWSTR,DWORD,DWORD)': cannot convert argument 2 from 'bool' to 'LPCWSTR'
这里的报错位于 d3dApp.cpp
的 547 行,无法将 bool
转换为 LPCWSTR
。这里可以将第二个参数修改为 nullptr
来解决。
// 修改前
HANDLE eventHandle = CreateEventEx(nullptr, false, false, EVENT_ALL_ACCESS);
// 修改后
HANDLE eventHandle = CreateEventEx(nullptr, nullptr, false, EVENT_ALL_ACCESS);
error LNK2019
error LNK2019: unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
这里的错误是因为,新建的空项目默认使用的是 main
函数作为入口,需要将它修改为符合示例项目的 WinMain
。
修改步骤如下:
- 右键单击
解决方案资源管理器
的项目名称,在弹出的下拉菜单中依次选择Properties(属性)
。 - 依次选择
C/C++
->Preprocessor
->Preprocessor Definitions
,删除其中的_CONSOLE
添加_WINDOWS
。 - 依次选择
Linker
->System
->SubSystem
,选择Windows(/SUBSYSTEM:WINDOWS)
。
HR Failed
运行后,弹出错误提示窗:
hr failed in dx12\Common\d3dUtil.cpp; line 111; error: The system cannot find the path specified.
这里的错误是因为,Start Debugging
运行生成的 .exe
位于 Debug
文件夹下,不符合项目指定的 Shader 路径(位于 BoxApp.cpp
第 354 行):
mvsByteCode = d3dUtil::CompileShader(L"Shaders\\color.hlsl", nullptr, "VS", "vs_5_0");
mpsByteCode = d3dUtil::CompileShader(L"Shaders\\color.hlsl", nullptr, "PS", "ps_5_0");
打开项目目录,结构如下:
这里简单地将上面的路径修改一下即可:
// 修改后
mvsByteCode = d3dUtil::CompileShader(L"..\\Shaders\\color.hlsl", nullptr, "VS", "vs_5_0");
mpsByteCode = d3dUtil::CompileShader(L"..\\Shaders\\color.hlsl", nullptr, "PS", "ps_5_0");
0x05 最终运行
在解决了上面的错误之后,不出意外的话,再次点击 Start Debugging(开始调试)
,项目就应该可以成功运行 Box 演示程序了。
ps:示例按住鼠标左键可以旋转正方体,按住鼠标右键可以放大缩小正方体。