중간 처리(Intermediate) 셰이더를 덤핑하도록 CVars 값을 설정해 줍니다.
ConsoleVariables.ini에서 (보통 Engine/Config/ConsoleVariables.ini에 있습니다.) 아래 CVars 값들을 설정합니다.
디버그 모드로 ShaderCompileWorker 빌드하기
기본적으로 UnrealBuildTool(UBT)는 항상 Development로 빌드될 것입니다. 이를 디버그 모드로 빌드하기 위해서는 솔루션의 ShaderCompileWorker 프로퍼티 값을 Debug_Program로 변경해 줍니다. (Visual Studio: Build->Configuration Manager)
Intermediate 파일 생성하기
이 시점에서 디버깅할 파일들을 생성해야 할 것입니다. CVars값을 설정하는 것은 연결된 처리 과정에서 생성된 파일을 덤핑할 수 있도록 합니다. 모든 셰이더를 강제로 리빌드 하려면 빈칸을 추가하거나 Engine/Shaders/Common.usf를 변경하고 에디터를 재실행 합니다. 이렇게 하시면 셰이더를 리컴파일하고 모든 Intermediate 파일을 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 셰이더 모델 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
셰이더들은 맵에서 버텍스 팩토리(vertex factories, 메시/컴포넌트 타입에 따라 구분)에 따라 그룹으로 정렬됩니다. 로컬 버텍스 팩토리가 있는 경우라면
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf
마지막으로, 주소 관련 CVars값에 따른 변경 사항을 살펴봅니다. 앞에서 r.DumpShaderDebugShortNames=1값으로 변경하였기 때문에 이름이 단축되었습니다.(주소의 길이를 줄이기 위해서) 그러므로 값을 0으로 변경하면 주소는 아래와 같습니다.
D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\FLocalVertexFactory\TBasePassPSFNoLightMapPolicy\BasePassPixelShader.usf
이 폴더에는 배치 파일과 usf 파일이 하나씩 들어 있습니다. 이 usf 파일은 플랫폼의 컴파일러에 들어갈 최종 셰이더 입니다. 배치 파일은 플랫폼 컴파일러로 intermediate 코드를 들여다보는 방법입니다.
디버그를 위한 ShaderCompileWorker 사용하기
4.11부터 에픽은 ShaderCompileWorker(SCW)이 플랫폼 컴파일러를 호출할 수 있는 기능을 추가하였습니다. 커맨드 라인은 아래와 같습니다.
PathToGeneratedUsfFile -directcompile -format=ShaderFormat -ShaderType -entry=EntryPoint
- PathToGeneratedUsfFile은 ShaderDebugInfo 폴더의 최종 usf 파일입니다.
- ShaderFormat은 디버그하려는 셰이더 플랫폼 포맷입니다. (우리 경우에는 PCD3D_SM5)
- ShaderType은 Vertex/Pixel/Geometry/Hull/Domain/Compute 셰이더 타입에 따르는 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를 커맨드 라인으로 호출하면 플랫폼 컴파일러를 호출하는 단계로 갈 수 있을 것입니다.
이 주제에 대한 더 자세한 정보는 아래 언리얼 엔진 문서들을 참고해 주세요.