Pipeline

1. Local Space -> Clip Space

렌더링 파이프라인에서 정점은 보통 아래 순서로 변환된다.

  1. Local(모델 로컬 좌표)
  2. World
  3. View(카메라 기준 좌표)
  4. Clip

행렬 형태로 쓰면 다음과 같다.

clipPos = P * V * M * localPos
  • M(Model): 보통 SRT(Scale, Rotation, Translation) 조합
  • V(View): 카메라의 RT(회전/이동) 행렬의 역행렬
  • P(Projection): View 공간을 Clip 공간으로 보내는 투영 행렬

2. Projection을 왜 하는가?

3D 좌표를 2D 화면으로 보이게 하려면 결국 “화면 평면에 어떻게 대응시킬지”가 필요하다.
Perspective든 Orthographic이든 핵심은 x, y를 정규화된 화면 좌표(nx, ny)로 보내는 것이다.

Perspective의 경우 먼 물체가 작게 보이도록 z를 이용한 나눗셈(원근 분할)이 들어간다.

  • 같은 시선 방향(같은 기울기)의 점들이 같은 투영 방향으로 모인다.
  • 그래서 멀리 있는 물체가 더 작게 보인다.

3. 왜 Clip Space에서 먼저 자를까?

Perspective divide(x/w, y/w, z/w) 전에 클리핑을 수행하는 이유는 안정성 때문이다.

  • w가 0 또는 0에 매우 가까우면 나눗셈 결과가 급격히 커지거나 불안정해진다.
  • 따라서 Clip Space 단계에서 시야 밖/유효하지 않은 정점을 먼저 제거한 뒤 divide를 수행한다.

4. FOV와 Aspect Ratio

실무에서(DX11 기준) 보통 FOV_y를 기준으로 투영행렬을 만들고,
화면 비율(aspect ratio = width / height)로 x축 스케일을 보정한다.

즉, 세로 기준 시야각을 정하고 가로는 화면 비율에 맞춰 자동 조정하는 방식이다.

5. Z-fighting

깊이 버퍼는 일반적으로 1/z 성질을 갖는다.
그래서 멀리 갈수록 깊이 값 차이가 촘촘하지 않게 표현되어(정밀도 손실) 거의 같은 깊이로 판정될 수 있다.

그 결과:

  • 두 면이 비슷한 깊이에 있을 때
  • 픽셀마다 어느 면이 앞인지 번갈아 뒤집히며 깜빡이는 현상
  • 이것이 Z-fighting

정밀도 개선 아이디어: Reversed-Z

가까운 영역의 정밀도를 높이기 위해 near = 1, far = 0 방향으로 깊이를 뒤집는 방식(Reversed-Z)을 사용하기도 한다.

핵심 아이디어:

  • 부동소수점 표현 특성상 특정 구간에서 더 유리한 정밀도를 얻을 수 있다.
  • 깊이 범위를 뒤집고(필요 시 무한 원근평면 조합) 가까운 영역에서 더 안정적인 depth 비교를 노린다.

요약하면, 파이프라인에서 MVP는 단순 좌표 변환이 아니라
“화면 투영”과 “수치 안정성(clip, depth 정밀도)”을 함께 고려하는 구조다.