Viewport로 봤을 때, 겹쳐져있거나 가려져있는 오브젝트가 정말 잘 렌더링 되었는지 확신할 수 있을까?
앞뒤나 혹은 같은 위치에 이미 그려져있지 않은지 확인해야 할 필요가 있다.
매번 픽셀을 그릴 때는 추가적인 정보가 필요하다.
픽셀의 칼라 정보나 깊이를 표현하는 뎁스(Depth) 정보를 이전 프레임으로부터 항상 저장해둘 수는 없다.
유니티는 칼라 정보는 Color Buffer에 뎁스 정보는 Depth Buffer를 이용한다. (둘의 디멘션은 같다.)
이번 포스팅에서는 Depth Buffer에 대해 알아보고, Shader를 적용해보고자 한다.
01. Opaque Object가 렌더링 되는 방법
스크린 내에서 여러 오브젝트가 같은 위치에 겹쳐져있다면, 어떤 오브젝트가 맨 위로 렌더링 되어야 할까?
유니티에서는 아주 간단하게 Depth 정보를 저장하는 Depth Buffer를 이용한다.
( 카메라와 z값 거리와 관련되어 있어 z- buffer 라고도 부른다.)
아주 심플하게도 z-distance가 값이 작으면 렌더링 하는 방식이다.
z-distance는 depth buffer에 저장된다.
렌더링 루프가 동작하는 방식은 다음과 같다.
1. Depth Buffer의 모든 값을 맥시멈 값인 1.0으로 초기화 한다. - Clearing
2. 아직 렌더링 되지 못한 불투명 (Opaque) 오브젝트를 선택한다.
3. vertex / fragment shader를 적용하여 화면안에 color 렌더링이 된다.
4. 카메라로부터 해당 오브젝트의 각 픽셀들과 카메라 사이의 z-axis 값을 계산한다.
5. 해당 위치의 z-buffer의 값과 비교한다. - Depth Test
- 만약, 새 depth가 기존 값보다 작거나 같다면, 새 Color와 Depth를 각각 버퍼에 쓴다.
- 아니라면, 새 값들은 버리며 기존 버퍼는 변경하지 않는다.
6. 다음 Opaque 오브젝트를 선택하며 2번으로 돌아간다.
02. Depth Buffer가 동작하는 방식
픽셀별로 Depth 밸류가 버퍼에 저장된다.
위의 렌더링 방식만 해도 간단해 보이지만, 실은 그렇지 않다.
Unity는 카메라로부터 픽셀 거리를 받는데, 이를 z-value라 한다.
z-value는 최소 거리는 카메라의 near clip distance이고 최대 거리는 far clip distance라 한다.
모든 픽셀들은 이 범위를 벗어나면 자동으로 가려진다. (culled)
그리고 [near, far] 이 정해지면, [0, 1]로 노말라이즈 된 값을 사용한다.
유니티의 렌더링 대상과 카메라와의 z-value를 구할 때는, precision을 유의해야 한다.
대상이 가깝고 멀고에 따라 precision loss가 발생할 수 있기 때문이다.
그렇기 떄문에 non-linear depth buffer function을 이용한다.


해당 식을 그래프로 표현하면 다음처럼 된다.
03. Render Queues
유니티에서는 오브젝트를 렌더링 할 때, Queue 시스템을 이용한다.
쉐이더를 만들 때, 반드시 Queue tag를 명시 해줘야 한다.
렌더링 순서는 Queue 값이 작은 순으로 진행된다.
그리고, 기본적으로 명시되어있는 Queue Tag가 존재한다.
| Background | 1000 |
| Geometry | 2000 |
| AlphaTest | 2450 |
| Transparent | 3000 |
| Overlay | 4000 |
HLSL 내에서 Queue Tag는 Tags Wrapper에서 명시한다.
Tags
{
"Queue" = "Geometry-1" // 2000 - 1 = 1999
}
Shader Graph 에서는 그래프 인스펙터에서 변경 가능하다.
Surface Option에 따라 Queue 값이 변경된다. (Opaque == Geometry)
04. 마치며
이번 챕터는 분량이 상당하므로 한 타임 끊어서 가겠다.
이제 책의 3분의 1을 진행 했는데..
뒷 부분은 좀 더 심화된 내용이라 정독하는데 꽤 오래 걸릴 것 같다..
'Game Dev > Unity Shader' 카테고리의 다른 글
| 08. Depth Buffer 심화 (2) - 다니엘 릿 쉐이더 프로젝트 (0) | 2025.10.16 |
|---|---|
| 07. Depth Buffer 심화 (1) - 다니엘 릿 쉐이더 프로젝트 (0) | 2025.10.15 |
| 05. Texturing 심화 - 다니엘 릿 쉐이더 프로젝트 (0) | 2025.10.11 |
| 04. 본격적인 Shader의 세계, Textures and UV Coordinates - 다니엘 릿 쉐이더 프로젝트 (1) | 2025.10.09 |
| 03. 코드 없이 쉐이더를 다룰 수 있는 Shader Graph - 다니엘 릿 쉐이더 프로젝트 (0) | 2025.10.09 |