언리얼의 셰이더 퍼뮤테이션이란 머테리얼에서 발생하는 추가적이고 개별적인 셰이더 코드 생성을 의미합니다. 엔진 상 머테리얼은 쿠킹 단계에서 HLSL 셰이더 코드로 컴파일되는데 한 머테리얼이 어떠한 이유로 여러 개의 셰이더 코드를 생성하는 경우를 말합니다. 이는 불필요한 셰이더 바이트 코드 용량과 쿠킹 타임 증가를 야기합니다.
아래 글이 대부분의 셰이더 퍼뮤테이션 발생 경우에 대해 잘 설명해줍니다.
Understanding Shader Permutations
역설적이게도 머테리얼의 다양한 기능들을 쓸 줄 알면 알수록 셰이더 퍼뮤테이션은 불가피하게 발생합니다. 하지만 관리 되지 않은 수많은 셰이더 퍼뮤테이션은 문제입니다.
그럼 최적화 담당자는 이 셰이더 퍼뮤테이션을 어디서 확인하면 될까요?
보다 심층적이고 프로젝트 전반의 머테리얼 현황에 대해 파악하고자 한다면 쿠킹 시 Saved 폴더에 저장되는 Stats CSV 파일을 확인하시면 됩니다. (단, 컨텐츠 쿠킹을 한번 실행해주셔야 합니다.)
테스트를 위해 M_TestMaterial 이라는 머테리얼을 만든 후 아래와 같은 머테리얼 인스턴스들을 만들어 봅니다.
MaterialStats 폴더에 있는 Stats CSV에는 셰이더(머테리얼)들의 퍼뮤테이션 갯수를 한 눈에 확인 할 수 있습니다. 엑셀 프로그램의 필터 기능을 쓰면 퍼뮤테이션이 높은 순으로 나열해볼 수 있습니다.
위 이미지에서 확인 가능한 M_TestMaterial의 퍼뮤테이션 수는 7입니다. 이는 머테리얼 자신을 포함한 수입니다.
그럼 각각의 퍼뮤테이션이 왜 일어나는지 퍼뮤테이션 스트링을 확인해볼 차례입니다. MaterialStatsDebug 폴더에 있는 StatsDebug CSV에는 퍼뮤테이션 스트링(Permutation String)이 제공됩니다. 각각의 퍼뮤테이션이 왜 발생하는지 확인 가능합니다.
또한 퍼뮤테이션 스트링을 자세히 보면 어떤 항목에서 앞으로 퍼뮤테이션이 발생할지도 확인 가능합니다.
이 중 머테리얼 인스턴스 생성 이후 수정되기 쉬운 항목들은 아래와 같습니다.
그 외 랜드스케이프 머테리얼의 경우 컴포넌트별로 사용된 레이어 구성에 따라서도 퍼뮤테이션이 발생하니 확인해보시길 바랍니다. (랜드스케이프 레이어가 많을수록 기하급수적으로 늘어나는 퍼뮤테이션...!!)
조금 더 편리한 방법은 Material Analyzer를 사용하는 것입니다. 언리얼 엔진은 Material Analyzer이라는 머테리얼 분석 툴을 제공합니다. 해당 툴은 개별 머테리얼의 사용 현황과 문제, 추천 해결법 등을 간단히 제공합니다.
Material Analyzer에 관한 설명은 아래 문서에 자세히 설명되어 있으니 참고하시길 바랍니다.
https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-material-analyzer-tool