編譯器二進位檔
對於 Windows,可以從 GitHub 下載最新的編譯器二進位檔。建議您一律更新至最新版本。對於 XBOX,二進位檔會隨 Microsoft Game Development Kit (GDK) 一起安裝,且版本與每個發行版本對應。請注意,對於 .dll 與標頭,XBOX One 使用 “_x” 命名慣例,XBOX Series X|S 使用 “_xs” 命名慣例。 Windows不支援使用針對特定平台設計與測試的編譯器,為另一個平台編譯著色器。
DXC 命令列介面
執行dxc.exe -? 即可取得命令列旗標的完整清單。如果您熟悉 FXC,許多命令列引數都是相同的。以下是一些常見的旗標。
DXC 已更新為預設不再將 .pdb (程式資料庫/偵錯資訊) 內嵌在著色器中。根據預設,.pdb 是外部的。
dxc.exe -? 也會回報其編譯器變體:“HLSL Compiler for Windows”、“HLSL Compiler for XBOX One” 或 “HLSL Compiler for XBOX Series X|S”。
以下是使用命令列介面的範例。
-Fo 旗標的指定寫入 myshader.bin。偵錯資訊以 -Zi 旗標啟用,.pdb 則以 -Fd 旗標寫出至 myshader.pdb。如果您希望編譯器自動產生 .pdb 名稱,可以提供 .\ 作為 -Fd 引數。同樣地,PDB 中的偵錯資訊不會內嵌在著色器中。此外,在 XBOX 上,必須提供根簽章才能預先編譯著色器。
著色器雜湊
可以使用-Fsh 命令列旗標將著色器的雜湊儲存至檔案。透過 .dll 介面,一律可以使用 IDxcResult::GetOutput 取得。
在 Windows 上,會對著色器 DXIL 進行雜湊以決定其值。
在 XBOX 上,雜湊取決於所要求的編譯類型。
- 如果停用預先編譯,雜湊是針對著色器 DXIL。
- 如果啟用預先編譯,雜湊是針對預先編譯的著色器。
對於預先編譯的著色器,雜湊會因是否移除 DXIL 而不同,因為包含 DXIL 的著色器支援執行階段編譯 (如有需要),但已移除 DXIL 的著色器則不支援。
反映
根據預設,反映資料會儲存在著色器中。可以使用-Qstrip_reflect 旗標將其移除。現在可以使用 -Fre 旗標將反映資料儲存至個別檔案,即使使用了 -Qstrip_reflect 也會儲存該檔案。同樣地,即使使用了 -Qstrip_reflect,也可以使用 IDxcResult::GetOutput 取得個別的反映 Blob。IDxcUtils::CreateReflection 可以從這些個別的反映 Blob 建立反映介面。
PDBs
編譯著色器時,.pdb 檔案名稱 (以-Fd 選項提供) 與著色器的雜湊會儲存在著色器中。PIX 會使用此資訊尋找著色器 .pdb。
在 XBOX 上,如果您將著色器序列化,則只會保留著色器雜湊。在此情況下,最好使用 -Fd .\ 選項,以著色器雜湊作為 .pdb 名稱,讓 PIX 可以輕鬆找到您的 pdb。如果基於某些原因您需要載入不同名稱的 .pdb,可以在 PIX 中手動載入 .pdb。
精簡 .pdb
新的編譯旗標 “-Zs” 會建立一種新類型的 .pdb,比傳統 .pdb 小得多,並可縮短產生 .pdb 時的編譯時間。這些「精簡」.pdb 只包含用於產生著色器的原始程式碼與編譯引數。偵錯著色器時,PIX 會「隨需」產生所需的其他偵錯資訊。 請注意,完整的 .pdb (包含精簡 .pdb 的所有內容,以及偵錯工具所使用的完整偵錯資訊) 仍可透過 “-Zi” 旗標支援。關於編譯器版本的注意事項。
產生 .pdb 時,編譯器的版本會儲存在 .pdb 中,讓 PIX 能夠知道最初編譯著色器時使用的是哪個編譯器。如果與 PIX 相關聯的目前編譯器與用於產生著色器的編譯器不相符,PIX 會回報,如有需要也可以提供相符的編譯器。新的 pdb 介面。
dxcapi.h 中引進了一個名為 IDxcPdbUtils 的新介面。此介面可讓您檢查原始程式碼、編譯引數、編譯器版本與雜湊,也可讓您視需要從 pdb 重新編譯著色器。光線追蹤的 .pdb (預覽)
現已啟用對光線追蹤的有限 .pdb 支援。若要使用此功能,請使用 -Zi -Qembed_debug 旗標編譯光線追蹤程式庫。無論是 PC 端的離線 RTPSO 建立或執行階段 RTPSO 建立,都請使用新的呼叫 ID3D12Device8::SetCompileTimeShaderPdbPathX 指定 PDB 位置。如果設定了此路徑,驅動程式會儲存與每個 RTPSO 相關聯的 .pdb 檔案。PIX 接著就可以載入並使用產生的 .pdb。 或者,也可以使用 -Zs -Fd 旗標產生精簡的光線追蹤 .pdb,並將其儲存至個別的 .pdb 檔案,而不是內嵌在著色器中。目前建立光線追蹤狀態物件 .pdb 時,仍需使用 ID3D12Device8::SetCompileTimeShaderPdbPathX API。PIX 將能夠使用 RTPSO 的多個程式庫 .pdb 來顯示所有著色器原始程式碼。如需詳細資訊,請參閱 PIX 中的著色器 PDB 文件。DXCompiler DLL 介面
下列資訊適用於 Windows、XBOX One 與 XBOX Series X|S 編譯器變體。如果不需要,我們將省略 “_x” 與 “_xs” 的任何提及,但資訊仍適用於所有三個平台。 若要使用 .dll 介面,請包含 dxcapi.h 與 d3d12shader.h,並連結至 dxcompiler.lib 程式庫或直接載入 dxcompiler.dll。不支援手動載入與卸載編譯器所需的其他 .dll。建議您在程式的整個生命週期內保持 .dll 載入,而不是在每次編譯著色器時載入與卸載它。
DxcCreateInstance 以建立各種編譯器介面。
對
DxcCreateInstance 的呼叫是安全執行緒的,但由 DxcCreateInstance 建立的物件不是安全執行緒的。編譯器物件應在同一個執行緒上建立並使用。跨平台編譯
如果您選擇建立一個可為多個平台編譯的可執行檔,則無法連結任何 dxcompiler 程式庫。您需要直接載入個別的 .dll,並取得各自DxcCreateInstance 函式的處理序位址。為某個編譯器平台目標建立的物件,無法以任何方式與為另一個編譯器平台目標建立的物件搭配使用。可以使用 “_xs” 標頭,但並非所有功能都在三個平台上完全受支援。此外,必須小心確保 dxcompiler.dll 所載入的 .dll 能被正確處理。
使用編譯器介面
建議您使用最新的IDxcCompiler3 介面,以利用最新的功能,包括指定更多引數的能力。例如,與命令列相同的引數、具名 Blob,以及直接存取著色器雜湊。如果您是從 IDxcCompiler2 移植,且偏好類似 IDxcCompiler::Compile 或 IDxcCompiler2::CompileWithDebug 的介面,可以使用 IDxcUtils::BuildArguments。
雖然 IDxcCompiler3::Compile 介面類似命令列介面,但引數是以個別字串傳遞。此外,命令列中用於將含空格的引數組成單一引數的引號可以省略,也不需要特殊命令列字元所需的逸出序列。
下列範例程式碼使用此介面編譯 myshader.hlsl,同時產生 .pdb。一般流程是呼叫
IDxcCompiler3::Compile,然後檢查 IDxcResult 中的錯誤緩衝區、編譯後的著色器、.pdb 與著色器雜湊。
必須使用
-Fd 引數將 .pdb 名稱傳入 Compile 函式。與命令列相同,可以使用 -Fd .\ 讓編譯器自動產生 PDB 名稱。如果 PDB 名稱是自動產生的,您必須使用此名稱儲存 .pdb 檔案,PIX 才能找到它。