상세 컨텐츠

본문 제목

[Dev][Material] Static Switch Parameter 노드에 대해..

Development

by TA's Hobbies 2025. 12. 24. 00:12

본문

문제의 요놈

 

머티리얼을 만들다보면 그래픽팀에서 스태틱 스위치에 대해 의견을 주실때가 종종 있는데 듣다보면 대부분이

그냥 "안좋으니까 쓰지말자, 최적화에 안좋다"고 합니다.

엄청 부정적인 이미지를 가지고 있는데요.

 

우선, 저의 의견을 적어보자면...

 

무조건 안좋다고 말하시는 분들에게 이것이 어떻게 작동하는지 알고계신지 물어보면 대부분이 잘 모르십니다.

그냥 안좋다면 이 노드가 왜 존재할까요?

분명 쓰임새가 있지만 조심해야되는건 맞다고 생각합니다.

 

스태틱 스위치는 런타임 도중에는 변경이 되지않고, 빌드를 하게 되면 셰이더가 분기 처리되어서 셰이더 베리에이션이 됩니다.

용어는 언리얼과 유니티가 조금씩 다른데 알고계신 용어와 조금 다르더라도 이해를 부탁드리고, 언리얼에서는 아마 

퍼뮤테이션이라고 했던걸로 기억합니다만..

 

좀더 쉽게 말하면 스태틱 스위치가 "true"일때 A라는 이름의 셰이더가 생성이 되고 "false"일때 B라는 셰이더가 추가적으로

생성이 된다고 보시면 됩니다.

 

이때 true일때 A셰이더에서는 false에서 사용한 연산이 컴파일할때 제외됩니다.

그러므로 연산이 없어진만큼 테스트를 해보면 렌더링 시간이 줄어들게 됩니다.

반면 셰이더의 개수는 늘어나게 되므로 용량이나 컴파일 시간이 늘어나게 됩니다.

 

만약에 빠지게 될 연산이 많이 무겁다면 성능상의 이점을 염두에 두고 사용하는 것도 나쁘지않다고 생각합니다.

단지 파라미터 하나를 편하게 쓰려고 한다던지 단순 연산을 스태틱 스위치로 나눠 사용한다면 저는 나쁜 상황이라고 생각하고요.

성능상의 이점은 거의 없는데 셰이더 베리언트 개수만 늘어나기 때문이죠.

 

조심해야 되는 부분에 대해서는...

베리언트에 대해 말해보자면 스태틱 스위치가 한개 추가 될때마다 경우의 수가 생겨서 x2 만큼 늘어나게 되는데요,

(언리얼에서는 사용하지않는 분기는 제외된다고 알고있는데 문제는 그래픽팀에서 사용하다보면 항상 모든 분기는 다 사용됩니다.

실제로 사용하는 것일수도 있고..  테스트해보고 끄지않는다거나... )

문제는 머티리얼에 스태틱 스위치가 하나도 없어도 셰이더 내부에서 사용되는 분기가 은근히 많습니다.

여기에 스태틱 스위치까지 추가가 되면 또 늘어나게 되죠.

이게 많을 경우 저는 프로젝트에서 만 단위의 베리언트까지 본적이 있습니다.

컴파일 시간이 엄청나게 길어집니다.

 

이런 경우는 불필요한 분기를 제거해주는 것이 좋다고 생각하고요.

머티리얼의 쓰임새를 분석해서 수정을 해주는것이 좋겠죠.

 

요즘은 대부분 PSO로 미리 컴파일을 해둔 캐시를 다운받거나,

시작전에 컴파일을 미리하고 시작하는데 컴파일 시간도 상당히 길긴합니다.

 

아무튼 하나마나한 소리지만 프로젝트를 분석하고 쓰임새를 파악해서 적절한 사용은 나쁘지않다는게

저의 생각입니다.

 

 

-만약 틀린 부분이 있다면 알려주시면 감사하겠습니다.-

관련글 더보기