2016-4-19

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

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

리얼타임 기술의 잠재력을 선보인 Theia Interactive의 Harley Davidson AR

증강 현실은 리얼타임 프로젝트 샘플을 통해 비즈니스 고객들을 설득하는 중요한 도구로 자리잡았습니다. Theia Interactive가 ...

2018년 4월 NVIDIA Edge 프로그램 수상자

4월에도 NVIDIA Edge 프로그램에 멋진 작품들이 많이 제출되었으며, 그 중에서 세 개의 작품을 뽑아 수상작으로 선정하였습니다. ...

언리얼 엔진으로 BMW 차량 디자인에 혼합 현실 구현

리얼타임 기술과 VR이 자동차 제조의 새로운 시대를 열고 있는 가운데, 자동차 디자인 분야는 빠르게 변화하고 있습니다. BMW와 MIN...