Shader) Surface Type의 렌더 순서
Unity에서 셰이더를 다룰 때 자주 마주치는 설정 중 하나가 바로 Surface Type이다.
특히 URP나 HDRP 같은 SRP(Scriptable Render Pipeline)를 사용할 경우, 머티리얼이 어떻게 렌더링되는지를 결정짓는 매우 중요한 역할을 한다.
이 글에서는 Surface Type의 종류와, 그에 따라 Unity가 어떤 오브젝트를 먼저 그리고 어떤 오브젝트를 나중에 그리는지 — 즉 렌더링 순서(Rendering Order) 를 정리해본다.
Surface Type의 종류
Surface Type은 기본적으로 두 가지로 나뉜다.
Opaque (불투명)
- 완전히 불투명한 표면을 표현한다.
- 빛이 내부로 들어가지 않으며, 표면에서 반사된다.
- 대부분의 일반적인 오브젝트(캐릭터, 벽, 바닥 등)에 사용한다.
- 알파 블렌딩을 사용하지 않으며, Z-buffer를 활용해 깊이값을 기록하고 테스트한다.
- 렌더링이 빠르고, 대부분의 경우 Deferred Rendering과 잘 어울린다.
Transparent (투명)
- 반투명하거나 투명한 오브젝트에 사용된다.
- 유리, 물, 연기, 홀로그램 등 투명도가 있는 효과에 적합하다.
- 알파 블렌딩을 사용하여 배경과의 색상을 혼합한다.
- Z-buffer를 사용하더라도 픽셀 단위의 깊이 테스트가 어렵기 때문에 렌더 순서가 매우 중요하다.
- 일반적으로 Forward Rendering 경로에서 사용된다.
렌더링 순서: Opaque → Transparent
Unity의 렌더링 파이프라인은 일반적으로 두 단계로 나누어 렌더링을 진행한다:
- 먼저, Opaque 오브젝트들을 렌더링한다.
- 그다음, Transparent 오브젝트들을 렌더링한다.
왜 Opaque를 먼저 그리지?
- Opaque 오브젝트는 깊이 버퍼(Z-buffer)에 깊이값을 기록하면서 그려진다.
- 이후에 그려지는 픽셀이 이 깊이값보다 멀다면, 해당 픽셀은 렌더링하지 않아도 되므로 성능상 이점이 크다.
- 즉, 투명 오브젝트를 나중에 그려서, 이미 렌더된 불투명 오브젝트들과 정확하게 블렌딩할 수 있게 된다.
렌더링 순서는 항상 Opaque → Transparent 순으로 진행된다.
또한 렌더링 순서는 **단순히 오브젝트가 씬에 배치된 순서로 결정되지 않는다. **
Surface Type에 따라 내부적으로 렌더 큐(Render Queue)와 Z-buffer 사용 여부가 달라진다.
Opaque의 렌더링 순서
- Opaque 오브젝트는 보통 Z-buffer에 깊이값을 기록하면서 렌더링된다.
- 렌더링 순서는 가까운 오브젝트부터 그리는 것이 아니라, 동일 머티리얼/셰이더끼리 묶어서 먼저 그린다.
- Batching 최적화
- GPU 상태 변경을 최소화하기 위해, 상태 변경이 적은 순서대로 정렬한다.
- 실제 시각적 출력에는 깊이 테스트(Z-test)가 개입되므로 렌더링 순서가 시각적 정확도에 영향을 주지 않는다.
- 오브젝트가 서로 가리는 경우에도 Z-buffer가 이를 자동으로 처리한다.
- 일부 상황에서는 프론트-투-백(front-to-back)으로 정렬되기도 한다.
- 오브젝트 수가 많을 때 오버드로우를 줄이기 위해
렌더 순서가 중요하지 않다.
깊이 버퍼가 정확도를 보장한다.
렌더링 정확도보다는 성능 최적화를 위해 순서를 정렬한다고 보면 된다.
Transparent의 렌더링 순서
- Transparent 타입은 Z-buffer의 깊이 테스트를 완전히 신뢰할 수 없다.
- 대신, 알파 블렌딩을 정확하게 적용하기 위해 카메라에서 먼 오브젝트부터 가까운 오브젝트 순서로 그려야 한다.
- 이것을 뒤에서 앞으로 그리는 방식(Painter’s Algorithm)이라고 한다.
- Unity는 내부적으로 카메라와의 거리 등을 기준으로 투명 오브젝트의 렌더 순서를 정리한다.
렌더 순서가 매우 중요하다.
반드시 뒤에서 앞으로 렌더링해야 한다.
예시 그림
알파 블렌딩과 알파 소팅
알파 블렌딩(Alpha Blending)
투명도를 구현할 때 사용되는 가장 일반적인 방법이다.
픽셀 색상과 배경 색상을 알파 값에 따라 섞는 방식이다.
COLOR = (Source RGB * Source Alpha) + (Destination RGB * (1 - Source Alpha))
Source
는 현재 그리고 있는 픽셀의 색Destination
은 이미 화면에 있는 배경 픽셀의 색Source Alpha
는 머티리얼의 투명도 (0 ~ 1)
알파 소팅(Alpha Sorting)
알파 블렌딩은 순서에 따라 결과가 완전히 달라지기 때문에, 투명 오브젝트끼리는 “뒤에서 앞으로” 정렬해서 그려야 한다.
이를 Alpha Sorting 또는 Back-to-Front Sorting이라고 한다.
- 예를 들어, 가까운 투명 유리창을 먼저 그리고 먼 유리창을 나중에 그리면, 먼 유리창이 사라진 것처럼 보일 수 있다.
- Unity는 이 문제를 피하기 위해, 카메라와의 거리 기준으로 투명 오브젝트들을 정렬해서 그린다.
정렬이 잘 안 되면, 이상한 투명 효과, 깜빡임, 픽셀 누락 등이 발생한다.
Render Queue
Unity는 내부적으로 Render Queue를 통해 렌더링 순서를 제어한다.
Queue 이름 | 값 범위 | 용도 |
---|---|---|
Background | 1000 이하 | 하늘, 배경 등 |
Geometry (Opaque) | 2000 전후 | 일반적인 불투명 오브젝트 |
AlphaTest | 2450 | 컷아웃 셰이더 등 |
Transparent | 3000 이상 | 투명 오브젝트 |
Overlay | 4000 이상 | UI, 화면 위 요소 |
// 셰이더 코드 예시
Tags { "RenderType"="Opaque" "Queue"="Geometry" }
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
렌더링 이슈가 발생하거나, 투명한 오브젝트가 이상하게 보일 경우에는 Surface Type, Render Queue, 그리고 렌더 순서를 반드시 체크해봐야 한다.
특히 알파 블렌딩을 쓰는 머티리얼은 순서가 아주 민감하므로 주의가 필요하다.
댓글남기기