배칭과 셰이더 로컬 오브젝트 위치 좌표
17 Jan 2024
버텍스 셰이더에서 로컬 버텍스 좌표값을 가지고 연산할 때에 주의해야 하는 경우가 있는데, 바로 엔진에 의해 실시간 배칭이 일어날 때이다. 다이나믹 배칭이 일어나면서 셰이더 코드 상에서 원래 기대했던 보장된 로컬 좌표값은 더이상 유효하지 않다. 이는 엔진이 배칭으로 묶인 버텍스 스트림을 기준으로 좌표값을 재구성하기 때문이다. 따라서 일반적인 개별 로컬 좌표 위치를 가정하고 작성한 셰이더들은 다이나믹 배칭이 일어나는 순간에 전혀 예상치 못한 동작을 일으킬 것이다. 만약 셰이더 코드를 그대로 사용하고 싶다면, 해당 오브젝트가 배칭 대상이 되지 않도록 해야 한다.
배칭이 일어나지 않게 하기 위한 간단한 두 가지 방법이 있을 수 있다:
첫째, 배칭을 의도적으로 깨면 된다. 동일한 머티리얼 사용하는 배칭을 위한 기본 조건을 거스르는 것이다. 예를 들자면, 원하는 곳에 개별 머티리얼로 분리해서 문제를 해결할 수 있다.
두번째, 셰이더 태그에 “DisableBatching”=”True” 을 넣어준다. 즉, 해당 셰이더를 사용하는 모든 렌더 오브젝트에 대해서 배칭이 일어나는 것을 막는 것을 의미한다. 이렇게 하면 굳이 머티리얼을 나눌 필요가 없어서 편하긴 하다. 다만, 해당 셰이더를 사용할 경우 무조건 배칭이 일어나지 않게 되기 때문에 최적화에 좋지 않은 영향을 줄 수 있다. 따라서 셰이더의 사용처를 제한하는 등의 프로젝트 관리 비용이 발생할 수 있다.