標籤:develop 函數 tco 產生 如何 交叉編譯器 斷點 微軟 policy
本文為(轉):Unreal 調試著色器編譯過程
調試著色器編譯過程
Rolando Caloca 在 April 19, 2016 | 學習編程
- Share on Facebook
- Share on Twitter
- Share on Google+
- Share on LinkedIn
啟用 CVAR 以允許轉儲中間著色器
在 ConsoleVariables.ini 檔案(通常位於 Engine/Config/ConsoleVariables.ini)中,啟用下列 Cvar:
在調試時構建 SHADERCOMPILEWORKER
預設情況下,UnrealBuildTool (UBT) 將為工具產生項目,以便始終在開發時進行編譯。要在調試時構建項目,請將 ShaderCompileWorker 的解決方案屬性(Visual Studio:產生 -> 組態管理員)更改為 Debug_Program:
產生中間檔案
此刻,您想要產生可調試的檔案;啟用 Cvar 將允許後續編譯轉儲所產生的檔案;要強制重建所有著色器,請在Engine/Shaders/Common.usf 中添加一個空格或變更,然後重新運行編輯器。這將重新編譯著色器並轉儲Project/Saved/ShaderDebugInfo 檔案夾中的所有中間檔案。
轉儲的著色器的檔案夾結構
讓我們分析轉儲的檔案的完整路徑:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
項目的根路徑:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
轉儲著色器的根路徑:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
現在,對於每種著色器格式/平台,您可找到一個子檔案夾,在本例中,這是 PC D3D Shader Model 5:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
現在,對於每個材質名稱都有一個對應的檔案夾,並且有一個名為 Global 的特殊檔案夾。在本例中,我們在 M_Egg 材質內:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
著色器分組在貼圖內並按頂點工廠排序,而這些頂點工廠通常最終對應於網格/元件類型;在本例中,有一個"本地頂點工廠":
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
最後,下一路徑是特性的排列;因為我們早先已啟用 r.DumpShaderDebugShortNames=1,所以名稱已壓縮(以減小路徑長度)。如果將其設定為 0,那麼完整路徑將是:
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\FLocalVertexFactory\TBasePassPSFNoLightMapPolicy\BasePassPixelShader.usf
在該檔案夾中,有一個批次檔和一個 usf 檔案。這個 usf 檔案就是要提供給平台編譯器的最終著色器代碼。您可通過這個批次檔來調用平台編譯器,以查看中間代碼。
使用 SHADERCOMPILEWORKER 進行調試
從 4.11 版開始,我們為 ShaderCompileWorker (SCW) 添加了一項功能,使其能夠調試平台編譯器調用;命令列如下所示:
PathToGeneratedUsfFile -directcompile -format=ShaderFormat -ShaderType -entry=EntryPoint
- PathToGeneratedUsfFile 是 ShaderDebugInfo 檔案夾中的最終 usf 檔案
- ShaderFormat 是您想要調試的著色器平台格式(在本例中,這是 PCD3D_SM5)
- ShaderType 是 vs/ps/gs/hs/ds/cs 中的一項,分別對應於"頂點"、"像素"、"幾何體"、"物體外殼"、"域"和"計算"著色器類型
- EntryPoint 是 usf 檔案中此著色器的進入點的函數名稱
例如,D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf-format=PCD3D_SM5 -ps -entry=Main
現在,您可以對 D3D11ShaderCompiler.cpp 中的 CompileD3D11Shader() 函數設定斷點,通過命令列運行 SCW,並且應該能夠開始瞭解如何調用平台編譯器。
有關此主題的更多資訊,請參閱虛幻引擎文檔的以下兩個頁面:
(轉)Unreal Shader模組(四): 著色器編譯