4.19.2016

쉐이더 컴파일 프로세스 디버깅 하기

By Rolando Caloca

중간 처리(Intermediate) 쉐이더를 덤핑하도록 CVars 값을 설정해 줍니다.

ConsoleVariables.ini에서 (보통 Engine/Config/ConsoleVariables.ini에 있습니다.) 아래 CVars 값들을 설정합니다.

cVars

디버그 모드로 ShaderCompileWorker 빌드하기

기본적으로 UnrealBuildTool(UBT)는 항상 Development로 빌드될 것입니다. 이를 디버그 모드로 빌드하기 위해서는 솔루션의 ShaderCompileWorker 프로퍼티 값을 Debug_Program로 변경해 줍니다. (Visual Studio: Build->Configuration Manager)

solution config

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를 커맨드 라인으로 호출하면 플랫폼 컴파일러를 호출하는 단계로 갈 수 있을 것입니다.

이 주제에 대한 더 자세한 정보는 아래 언리얼 엔진 문서들을 참고해 주세요.

Recent Posts

언리얼 스튜디오 4.20 베타 출시!

언리얼 스튜디오보다 나은 것이 있을까요?  물론이죠, 언리얼 스튜디오 4.20 입니다!  메타데이터 임포트, 원활한 익스포트 프로세스,...

PixARK Dev Kit으로 만드는 나만의 복셀 월드

에픽게임즈 런처에서 Snail Games가 제공한 모드 제작 툴로 재밌는 PixARK 월드를 만들어보세요.

Drive Studio, 언리얼 엔진으로 Fox Sports의 2018 FIFA 월드컵 방송 제작

Drive Studio는 언리얼 엔진의 강력함을 활용해 FOX Sports 채널의 2018 FIFA 월드컵 중계에서 사용할 배경, 중간...