셰이더 멀티 패스 렌더링 순서

unity에서의 멀티 패스 셰이더의 렌더링 순서

멀티 패스로 렌더링되는 여러 오브젝트가 있을 때, 각각의 셰이더 패스가 렌더링되는 순서는 조건에 따라 다를 수 있다. (프로젝트는 빌트인 렌더 파이프라인 환경이다.) 동일한 정렬 순서 상에서의 서로 다른 오브젝트 A와 B가 멀티 패스로 그려진다고 가정해보자. 두 오브젝트는 서로 동일한 혹은 다른 머티리얼(셰이더도 다를 수 있음)을 가질 수도 있다. 단지 셰이더가 멀티 패스로 작성되어 있을 뿐이다.

불투명 렌더큐에서의 멀티패스 렌더링 순서

  • 서로 같은 머티리얼의 경우 다음과 같은 순서로 렌더링된다: A-Pass#0 -> B-Pass#0 -> C-Pass#0 -> A-Pass#1 -> B-Pass#1 -> C-Pass#1 -> A-Pass#2…
    낮은 인덱스의 셰이더 패스들이 먼저 렌더링된다.
    Untitled

  • 서로 다른 머티리얼의 경우 이 경우엔 인지할 수 있는 정확한 규칙을 찾을 수 없다.
    Untitled

투명 렌더큐에서의 멀티패스 렌더링 순서

다음과 같은 순서로 렌더링된다: A-Pass#0 -> A-Pass#1 -> A-Pass#2 -> B-Pass#0 -> B-Pass#1 -> B-Pass#2 -> C-Pass#0 -> … 각각의 오브젝트에 대해 셰이더 패스들을 나눠서 렌더링한다.
Untitled

렌더링 순서가 다른 이유

투명 렌더큐에서는 반투명 오브젝트들을 그리기 때문에 렌더링 순서가 매우 중요하다. (이는 멀티 패스라고 해도 예외는 아닐 것이다.) 반면에 불투명 렌더큐는 이러한 제한이 없기 때문에 엔진 내부에서 성능 최적화를 위한 다른 규칙이 적용될 수 있다.

(참고: 투명 렌더큐에서는 오브젝트 간의 렌더 순서 결정을 위한 핵심 조건인 clip space의 z값이 완벽히 일치해서 그 순서를 정확히 정할 수 없을 경우에, 불투명 렌더큐에서의 규칙을 적용한다. 아마 순서를 정하기 위한 차선 조건이 없기 때문에 일종의 폴백으로써 동작했다고 이해할 수 있다.)

명확하게 렌더링 순서를 정하고 싶다면

순서를 보장하고 싶은 멀티패스 오브젝트에 한해, 자신만의 렌더큐를 지정하도록 하면 된다. 그 외에도 소팅 순서를 직접 제어할 수 있는 것들을 활용하면 강제적으로 오브젝트 간의 멀티 패스가 뒤섞이지 않도록 할 수는 있다.

마치며

작업자는 멀티 패스 셰이더를 작성할 때, 렌더링 순서가 다양하게 변할 수 있음을 인지하고 있어야 한다.