뭐라도 쓰겠지
25.04.15 / 스페이스(Space), 좌표 공간 본문
3D 게임 엔진에서 객체가 렌더링될 때는 여러 가지 "좌표 공간(Coordinate Space)"을 거치며 변환이 이루어진다. 다음은 주로 사용되는 공간들이다.
1. 오브젝트 스페이스(Object Space) 또는 로컬 스페이스(Local Space)
- 정의:
- 모델(메시)이 처음 정의된 고유 좌표계이다. 3D 모델링 툴에서 만든 상태 그대로의 좌표축과 원점(0, 0, 0)을 기준으로 한다.
- 특징:
- 오브젝트(메시)의 버텍스 정보가 저장된 기본 좌표 공간이다.
- 여러 개의 동일한 3D 모델을 다른 위치나 크기로 배치할 때, 먼저 오브젝트 스페이스에서 정의된 버텍스를 가져와서 월드 스페이스로 변환한다.
- 애니메이션 스켈레톤 구조(본/조인트)도 대개 이 로컬 스페이스를 기준으로 움직인다.
2. 월드 스페이스(World Space)
- 정의:
- 게임 엔진에서 정의한 "전역" 좌표계이다. 모든 오브젝트가 어느 위치에 있는지, 어떤 방향을 바라보는지, 어떤 크기를 가지는지 등을 나타내기 위해 사용한다.
- 특징:
- 서로 다른 오브젝트 사이의 "상대적 위치와 크기"를 한 좌표계에서 비교할 수 있다.
- 씬(Scene) 전체의 광원이나 물리 계산, 충돌 체크 등이 월드 스페이스를 기준으로 일어난다.
- "모델 매트릭스"를 이용해 오브젝트 스페이스에서 월드 스페이스로 변환한다.
3. 뷰 스페이스(View Space) 또는 카메라 스페이스(Camera Space)
- 정의:
- 카메라(혹은 관찰자)의 위치를 원점(0, 0, 0)으로 하는, 카메라가 바라보는 방향이 주요 축이 되는 좌표계이다.
- 특징:
- 카메라 변환(View Matrix)를 적용하면, 월드 스페이스에서 카메라를 원점으로 옮기고 카메라가 바라보는 방향이 Z-축(또는 -Z축)이 되도록 회전시킨다.
- 광원 계산, 시야 프러스텀 계산, 클리핑(보이는 영역 제거) 등을 위해 자주 사용된다.
- "카메라가 본다면 이 위치가 어떻게 보일까"를 수학적으로 다룰 때 편리하다.
4. 클립 스페이스(Clip Space)
- 정의:
- 뷰 스페이스에서 "투영 변환(Projection Matrix)"을 적용한 뒤의 좌표계이다. 즉, 카메리 시야각(FOV)이나 종횡비, 클리핑 평면이 반영된 상태이다.
- 특징:
- 투영 매트릭스(Projection Matrix)를 통해 원근 투시(Perspective)나 직교(Orthographic) 투영이 적용된다.
- "클립"이라는 이름 그대로, 시야 범위 밖(near/far plane 밖 등)은 렌더링 대상에서 제거된다.
- 보통 4차원 좌표 (x, y, z, w) 형태로 표현되어, 이후 w로 나누는 "퍼스펙티브 디바이드(perspective divide)" 과정을 거쳐 NDC 스페이스로 넘어간다.
5. NDC 스페이스(Normalized Device Coordinates Space)
- 정의:
- 클립 스페이스에서 퍼스펙티브 디바이드를 수행한 뒤의 좌표계를 말한다. 보통 -1 <= x, y, z <= 1 범위로 정규화된다.
- 특징:
- GPU에서 래스터라이즈(rasterize) 과정을 시작하기 전의 "표준화된" 좌표계이다.
- x, y, z 범위가 -1부터 +1 사이에 들어오는 객체만 최종 렌더링 대상이 된다.
- 보통 그래픽스 파이프라인에서 "클립 -> NDC -> 뷰포트 변환" 순서로 이어진다.
6. 스크린 스페이스(Screen Space)
- 정의:
- 디바이스(모니터, 스마트폰 화면 등)에서 실제 픽셀 좌표를 기준으로 하는 2D 공간을 말한다.
- 특징:
- 일반적으로 화면 왼쪽 위(또는 왼쪽 아래)를 (0, 0)으로 잡고, 오른쪽 아래로 갈수록 x, y 값이 커지는 2D 좌표계이다.
- NDC에서 다시 뷰포트 변환(Viewport Transform)을 거쳐 [0, width] x [0, height] 범위 안으로 들어오게 된다.
- UI, 2D 스프라이트 표시, 2D 포스트 프로세싱 등을 적용할 때 주로 사용된다.
7. 탄젠트 스페이스(Tangent Space)
- 정의:
- 각 폴리곤의 표면(정점)에서 "법선(normal)", "탄젠트(tangent)", "바이노멀(binormal 또는 bitangent)" 벡터로 정의된 로컬 3축 좌표계를 말한다.
- 특징:
- 보통 노멀 매핑(흔히 사용하는 범프/패럴랙스 매핑 등)에서 사용된다.
- 메시 표면의 미세한 디테일(주름, 기복 등을 가짜로 표현)을 위해, 픽셀 셰이더에서 탄젠트 스페이스 기준의 노멀 맵을 월드 스페이스나 뷰 스페이스로 변환하는 과정이 필요하다.
- "한 폴리곤(또는 정점) 단위로 정의되는 로컬 스페이스"라는 점이 특징이다.
8. 라이트 스페이스(Light Space) - 선택적 활용
- 정의:
- 특정 광원(특히 디렉셔널 라이트, 스포트 라이트 등)에서 바라본 시점으로 정의되는 좌표계를 말한다.
- 특징:
- 그림자 매핑(Shadow Mapping) 기법에서 광원이 본 시야에 맞춰서 깊이 텍스처(Shadow Map)을 그릴 때 주로 사용한다.
- "광원에서 보는 시점"이므로, 여기에서의 z값이 라이트 카메라와의 거리(그림자 투사에 쓰이는 깊이)가 된다.
그 외에 참고할 만한 스페이스들엔
- Joint(혹은 Bone) Space: 스켈레톤 애니메이션에서 각 관절(본)마다의 로컬 좌표계
- UV(혹은 Texture) Space: 2D 텍스처 위의 좌표계를 나타내며, 보통 0~1 범위로 정규화
- View-Projection Space: 뷰 스페이스에서 투영 매트릭스가 곱해져 클립 스페이스 직전까지의 상태를 지칭
가 있다.
보통 렌더링 파이프라인에서는 오브젝트 스페이스 -> 월드 스페이스 -> 뷰(카메라) 스페이스 -> 클립 스페이스 -> NDC 스페이스 -> 스크린 스페이스 순서로 변환을 거쳐 최종 픽셀이 결정된다. 여기에 각종 셰이더에서 탄젠트 스페이스나 라이트 스페이스를 활용해 다양한 조명, 매핑 효과를 넣을 수 있다.
'프로그래밍 > 게임 개발' 카테고리의 다른 글
25.04.18 / 조명(Light), 그림자(Shadow), 쉐이딩 모델(Shading) (0) | 2025.04.18 |
---|---|
25.04.18 / 컬링(Culling)을 통한 최적화 (0) | 2025.04.18 |
25.04.11 / Picking, Ray, Raycast (0) | 2025.04.11 |
25.04.11 / AddComponent, GetComponent, RequireComponent (0) | 2025.04.11 |
25.04.11 / 카메라 프러스텀(Camera Frustum) (0) | 2025.04.11 |