정의
DirectX에서 정규화된 깊이 값은 뷰 공간(View Space)이나 월드 공간(World Space)의 깊이 정보를 0~1 범위로 정규화(normalize)한 값을 의미한다.
주로 Z-버퍼(depth buffer)에 저장될 때 사용하는 값이며, 깊이 테스트 및 Z-버퍼 기반의 효과(예: 그림자, 포스트 프로세싱 등)에 매우 중요하다.
카메라에서 가까운 지점(Near Plane)은 0, 카메라에서 먼 지점(Far Plane)은 1로 정규화 된다.
계산 과정
- View Space Z → Clip Space Z (투영 행렬 적용)
- Clip Space Z / W → NDC Z (-1~1)
- NDC Z → Depth ( 0~1)
1. Projection Matrix의 형태 (DirectX, LH 기준)
⎣⎢⎢⎢⎢⎢⎢⎡a0000b0000f−nf−f−nnf0010⎦⎥⎥⎥⎥⎥⎥⎤
n: Near Plane
f: Far Plane
이 행렬을 View Space Position에 곱하면 → Clip Space Position이 된다.
2. View Space Z → Clip Space Z
입력 벡터:
pview=[x,y,z,1]
적용 후 Clip Z, W는 다음과 같다.
zclip=z∗f/(f−n)+(−n∗f/(f−n))wclip=z
즉,
zclip=f−nfz−f−nnfwclip=z
3. Clip → NDC Z (Normalized Device Coordinate)
zndc=zclip/wclip=(f−nfz−f−nnf)/z=f−nf−(f−n)znf
이 값은 DirectX의 NDC z 범위 [0, 1]에 맞춰져야 하므로, 실제로는 마지막 단계에서 이렇게 정규화 한다.
4. NDC Z → 정규화된 깊이 값
DirectX 기준에서는 z_ndc ∈ [0, 1]이므로
이 값이 Z-buffer에 저장되는 값이다.
즉,
depth=zndc
정리
최종적으로 View Space Z 값 z가 있을 때, 정규화된 깊이 값은 다음과 같이 계산된다.
depth=f−nf−(f−n)znf
- 이 수식은 비선형이며,
- z가 작을수록 depth 변화가 더 크다. → 정밀도는 near에 몰리게 된다.
특징
| 구분 | 내용 |
|---|
| 범위 | 항상 [0.0 ~ 1.0] 사이 |
| 저장 위치 | Z-buffer (Depth buffer) |
| 비선형 분포 | Perspective Projection에서는 가까운 곳에 깊이 정보가 더 밀집됨 |
| 정밀도 문제 | 가까운 Near 값을 너무 작게 설정하면 Z-fighting 발생 가능 |
| 사용처 | 깊이 테스트, 그림자 맵, SSAO, 깊이 기반 블러 등 |