(轉)Unreal Shader模塊(四): 著色器編譯
本文為(轉):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,並且應該能夠開始了解如何調用平臺編譯器。
有關此主題的更多信息,請參閱虛幻引擎文檔的以下兩個頁面:
- 著色器開發
- HLSL 交叉編譯器
(轉)Unreal Shader模塊(四): 著色器編譯