2016. 4. 19.

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

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

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

최근 게시글

언리얼 엔진 4.19 프리뷰 1 출시

현재 에픽게임즈 런처에서 언리얼 엔진 4.19의 첫번째 프리뷰를 다운로드하실 수 있습니다. 지금 다운로드하셔서 새로운 기능들을 확

...

에픽게임즈, 총 200,000 달러 규모의 새로운 언리얼 데브 그랜트 수상 발표

인디 게임, 툴, 그리고 애니메이션을 언리얼 엔진으로 제작하고 있는 세계 여러 개발자들을 선정해 언리얼 데브 그랜트를 수여했습니다.

이미지를 넘어서: 비주얼 디자인을 경험해보다

디자인 경험이라는 것이 과연 무엇을 뜻할까요? 현재 기업들이 언리얼 엔진을 어떻게 작업물의 새롭고 강력한 테스트 방법으로 활용하고 있는...