Record/TIL

[Unity] 유니티 렌더링 순서

석영 2024. 8. 19. 09:22
반응형

렌더링 순서?

최종 프로젝트를 하면서 우리가 스프라이트와 3D가 결합된 게임이라 렌더링 순서때문에 골머리를 많이 앓았다.

그것때문에 모의면접을 보면서도 튜터님이 이 질문을 하셨는데 대답을 못했던걸로 기억한다.

의외로 많이 나오는 질문이라고 알아두라고 해서 써놓는 글

 

정리

먼저 Opaque, 그 다음 Tranparent

Opaque 그룹에 속한 것부터 먼저 그리고, 그 다음에 Tranparent 그룹에 속한 것을 그린다.

여기서 렌더 큐 인덱스가 2500까지는 Opaque 그룹, 2501 이상인 경우는 Tranparent 그룹에 속한다.

다시 말해, 2500번까지의 Opaque 그룹에 속한 지오메트리들은 2501번부터 그 이후의 큐 인덱스를 갖는 Tranparent 그룹에 속한 지오메트리들보다 ‘어떤 정렬 요소와 관계없이’ 먼저 그려진다. 

 

Transparent 정렬 순서

 

 

  • Sorting Layer(SL)/Order in Layer(OiL)
    • 제일 높은 우선 순위의 정렬 요소는 바로 Sorting Layer(SL)/Order in Layer(OiL) 이다. 먼저 SL값이 주어지고, 같은 레이어 안에서 OiL값을 다르게 주어서 동일 레이어 에서의 추가 정렬이 가능하다.
      참고로, SL/OiL은 원래 2D 기반 게임에서 Tranparent 기반 객체들을 제어하기 위한 정렬 요소이다. 따라서 일반적인 메시 렌더러에서는 이 정렬 요소를 기본적으로 노출하지 않는다. 그럼에도 불구하고, 만약 일반적인 불투명 지오메트리 메시 렌더러에 명시적으로 SL/OiL값을 설정한다고 하면, 역시나 가장 높은 정렬 순위 적용을 받는다.

 

  • Sorting Group
    • Unity 게임오브젝트에 Sorting Group 컴포넌트를 추가하면, 해당 컴포넌트를 가진 오브젝트를 포함한 하위 객체들을 단일 Sorting Layer/OiL 로 묶어서 정렬하며, 하위에 추가로 중첩된(nested) Sorting Group을 둘 수도 있다. SL/OiL을 그룹화하는 것일 뿐이기 때문에, SL/OiL 정렬요소와 우선순위는 같다.
      참고로, 한 Sorting Group 내에 속한 하위 지오메트리 간에는 전혀 다른 정렬 규칙을 가지게 된다. 구체적으로 말하자면, 렌더 큐 > 그룹 내의 상대적 SL/OiL > 게임오브젝트 하이어라키 순의 우선순위를 가지게 된다. 하지만, 사실 이 부분은 Sorting Group의 용도를 제대로 알고 사용한다면 굳이 마주칠 상황은 아니지만, 잘못하면 혼란을 겪을 수 있는 부분이기에 언급

 

  • Render Queue
    • 머티리얼에 렌더 큐 인덱스를 변정하여 렌더링 순서를 변경할 수 있다. 특별한 경우가 아니라면, 셰이더 코드 내에서 지정한 기본 렌더 큐 인덱스에서 벗어난 값을 설정할 필요는 거의 없다.

 

  • Camera Sorting
    • Unity는 카메라 기준에 따라 지오메트리들을 정렬한다. Tranparent 그룹에 대해서는 지오메트리를 뒤에서 앞(back-to-front) 순으로 정렬한다. 그리고 Opaque 그룹에서는 기본적으로 앞에서 뒤(front-to-back)로 정렬한다. 참고로, HSR 기능을 갖는 특정 GPU들은 거리 기반 정렬이 의미가 없기 때문에, 그런 경우에 한해서는 엔진 내부에서 거리 정렬을 수행하지 않는다.

 

  • Engine Internal
    • 최종적으로 엔진 내부 수준에서 드로우 순서를 결정한다. 앞서 Camera Sorting에서 언급한 특정 GPU에 대한 예외처리나 렌더링 효율을 위한 동적 배칭 처리 등 여러 상황에 따라 렌더링 순서 제어를 수행할 수 있다.

 

인용

>> Unity 렌더링 순서 정렬 이해하기

 

Unity 렌더링 순서 정렬 이해하기

제대로 알지 못하면 헤어날 수 없는 렌더링 순서 지옥

micromang.github.io

 

반응형