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

下载完成后将整个 CommonChapter 6 Drawing in Direct3D\\Box 中的 ShadersBoxApp.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

修改步骤如下:

  1. 右键单击解决方案资源管理器的项目名称,在弹出的下拉菜单中依次选择 Properties(属性)
  2. 依次选择 C/C++ -> Preprocessor -> Preprocessor Definitions,删除其中的 _CONSOLE 添加 _WINDOWS
  3. 依次选择 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:示例按住鼠标左键可以旋转正方体,按住鼠标右键可以放大缩小正方体。

版权声明:本文为drnkcff原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/drnkcff/p/13791918.html