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:示例按住滑鼠左鍵可以旋轉正方體,按住滑鼠右鍵可以放大縮小正方體。