[DX] 정규화된 깊이 값

김진우·2025년 7월 13일

DirectX

목록 보기
20/32
post-thumbnail

정의

DirectX에서 정규화된 깊이 값은 뷰 공간(View Space)이나 월드 공간(World Space)의 깊이 정보를 0~1 범위로 정규화(normalize)한 값을 의미한다.
주로 Z-버퍼(depth buffer)에 저장될 때 사용하는 값이며, 깊이 테스트 및 Z-버퍼 기반의 효과(예: 그림자, 포스트 프로세싱 등)에 매우 중요하다.

카메라에서 가까운 지점(Near Plane)은 0, 카메라에서 먼 지점(Far Plane)은 1로 정규화 된다.

계산 과정

  1. View Space Z → Clip Space Z    (투영 행렬 적용)
  2. Clip Space Z / W → NDC Z       (-1~1)
  3. NDC Z → Depth                     ( 0~1)

1. Projection Matrix의 형태 (DirectX, LH 기준)

[a0000b0000ffn100nffn0]\begin{bmatrix} a & 0 & 0 & 0 \\ 0 & b & 0 & 0 \\ 0 & 0 & \dfrac{f}{f - n} & 1 \\ 0 & 0 & -\dfrac{nf}{f - n} & 0 \end{bmatrix}
  • n: Near Plane
  • f: Far Plane

이 행렬을 View Space Position에 곱하면 → Clip Space Position이 된다.

2. View Space Z → Clip Space Z

입력 벡터:

pview=[x,y,z,1]\mathbf{p}_{view} = [x, y, z, 1]

적용 후 Clip Z, W는 다음과 같다.

zclip=zf/(fn)+(nf/(fn))wclip=zz_{clip} = z * f / (f - n) + (-n * f / (f - n)) w_{clip} = z

즉,

zclip=ffnznffnwclip=zz_{clip} = \frac{f}{f-n}z - \frac{nf}{f-n} w_{clip} = z

3. Clip → NDC Z (Normalized Device Coordinate)

zndc=zclip/wclip=(ffnznffn)/z=ffnnf(fn)zz_{ndc} = z_{clip} / w_{clip} = \left( \frac{f}{f-n}z - \frac{nf}{f-n} \right) / z = \frac{f}{f-n} - \frac{nf}{(f-n)z}

이 값은 DirectX의 NDC z 범위 [0, 1]에 맞춰져야 하므로, 실제로는 마지막 단계에서 이렇게 정규화 한다.

4. NDC Z → 정규화된 깊이 값

DirectX 기준에서는 z_ndc ∈ [0, 1]이므로
이 값이 Z-buffer에 저장되는 값이다.

즉,

depth=zndcdepth = z_{ndc}

정리

최종적으로 View Space Z 값 z가 있을 때, 정규화된 깊이 값은 다음과 같이 계산된다.

depth=ffnnf(fn)zdepth = \frac{f}{f-n} - \frac{nf}{(f-n)z}
  • 이 수식은 비선형이며,
  • z가 작을수록 depth 변화가 더 크다. → 정밀도는 near에 몰리게 된다.

특징

구분내용
범위항상 [0.0 ~ 1.0] 사이
저장 위치Z-buffer (Depth buffer)
비선형 분포Perspective Projection에서는 가까운 곳에 깊이 정보가 더 밀집
정밀도 문제가까운 Near 값을 너무 작게 설정하면 Z-fighting 발생 가능
사용처깊이 테스트, 그림자 맵, SSAO, 깊이 기반 블러 등

0개의 댓글