Pipeline
Pipeline
1. Local Space -> Clip Space
렌더링 파이프라인에서 정점은 보통 아래 순서로 변환된다.
- Local(모델 로컬 좌표)
- World
- View(카메라 기준 좌표)
- 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 정밀도)”을 함께 고려하는 구조다.
GitHub 계정으로 댓글을 작성합니다.
현재 추천 수: 조회 중...
GitHub 이슈의 👍 반응을 집계합니다.
추천(👍) 남기기
이 문서 작업실에서 편집하기