1. 程式人生 > >(轉)Unreal Shader模塊(四): 著色器編譯

(轉)Unreal Shader模塊(四): 著色器編譯

pat facebook 通過 variable 工具 sspi uil 命令 分組

本文為()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模塊(四): 著色器編譯