이전 글에서는 View Matrix가 왜 중요한지를 살펴보았습니다.
View Matrix는 월드 공간(World Space)에 있는 객체를 카메라 기준 공간(View Space)으로 변환하는 행렬이며, 렌더링 과정에서는 카메라를 움직이는 대신 세상을 반대로 이동시키는 방식으로 계산이 이루어진다는 점도 함께 알아보았습니다.
하지만 아직도 화면에는 아무것도 그려지지 않습니다.
객체를 카메라 기준으로 변환했다고 해서 곧바로 모니터에 표시할 수 있는 것은 아니기 때문입니다.
이번에는 3차원 공간을 2차원 화면으로 변환하는 Projection Matrix가 왜 필요한지를 살펴보려고 합니다.
디스플레이 장치는 2차원이다
우리가 만드는 게임은 대부분 3차원 공간에서 동작합니다.
객체는 X축과 Y축, Z축 좌표를 가지고 있으며, 카메라 역시 3차원 공간 안에서 움직입니다.
하지만 플레이어가 실제로 바라보는 모니터는 평면입니다.
즉, 화면은 가로와 세로만 존재하는 2차원 공간입니다.
결국 렌더링 시스템은 3차원 공간에 있는 모든 정점을 2차원 화면으로 변환해야 합니다.
이 과정이 바로 Projection Matrix의 역할입니다.
멀리 있는 물체가 작아 보이는 이유
우리는 현실에서 자연스럽게 원근감을 느끼며 살아갑니다.
눈앞에 있는 자동차는 크게 보이고, 멀리 있는 자동차는 작게 보입니다.
건물도 가까이 다가가면 크게 보이고, 멀리 떨어질수록 점점 작아집니다.
하지만 컴퓨터는 이런 원근감을 스스로 이해하지 못합니다.
컴퓨터에게는 가까운 물체도, 먼 물체도 단순한 좌표일 뿐입니다.
따라서 “멀리 있는 물체일수록 작게 보이도록 계산하는 과정”이 필요합니다.
Projection Matrix는 바로 이러한 원근감을 수학적으로 표현하는 역할을 합니다.
Projection Matrix는 원근감을 만든다
Projection Matrix를 적용하면 카메라에서 가까운 물체는 크게 보이고,
멀리 있는 물체는 작게 보입니다.
즉, 우리가 현실에서 보는 것과 비슷한 화면을 만들 수 있습니다.
만약 Projection Matrix를 사용하지 않는다면 어떤 일이 일어날까요?
멀리 있는 건물도 가까운 건물과 동일한 크기로 보일 것입니다.
철길도 끝까지 평행하게 보일 것이고,
도로 역시 멀어져도 폭이 줄어들지 않습니다.
결국 현실과는 전혀 다른 어색한 화면이 만들어집니다.

원근 투영과 직교 투영
Projection에는 크게 두 가지 방식이 있습니다.
첫 번째는 Perspective Projection(원근 투영)입니다.
Perspective Projection은 거리에 따라 크기가 달라집니다.
그래서 대부분의 3D 게임은 이 방식을 사용합니다.
FPS와 TPS, 오픈월드 게임 등 대부분의 게임이 Perspective Projection을 사용합니다.
반면 Orthographic Projection(직교 투영)은 거리에 관계없이 크기가 변하지 않습니다.
멀리 있는 물체도 가까운 물체와 같은 크기로 표현됩니다.
그래서 CAD 프로그램이나 전략 게임, 2D 게임, UI 렌더링 등에서는 Orthographic Projection이 자주 사용됩니다.
즉, Projection Matrix는 하나만 존재하는 것이 아니라, 목적에 따라 서로 다른 형태를 사용할 수 있습니다.
게임 엔진에서는 어떻게 사용할까
Unity와 Unreal Engine에서는 개발자가 Projection Matrix를 직접 계산하는 경우는 거의 없습니다.
대신 카메라의 Field of View(FOV)와 화면 비율(Aspect Ratio), Near Plane과 Far Plane 값을 설정하면 엔진이 내부적으로 Projection Matrix를 생성합니다.
예를 들어 FOV를 크게 설정하면 주변이 더 넓게 보이는 대신 왜곡이 심해집니다.
반대로 FOV를 작게 설정하면 망원렌즈처럼 멀리 있는 물체가 더 크게 보입니다.
즉, 게임에서 자주 조절하는 카메라 옵션들은 결국 Projection Matrix를 구성하는 값이라고 볼 수 있습니다.
Projection Matrix 다음에는 무엇이 일어날까
Projection Matrix를 적용하면 정점은 화면에 그릴 수 있는 형태로 변환됩니다.
하지만 GPU는 아직도 삼각형을 바로 그리지 않습니다.
이후에는 정규화 장치 좌표(Normalized Device Coordinates)와 뷰포트(Viewport) 변환을 거쳐 최종적인 화면 좌표(Screen Space)가 계산됩니다.
즉, Projection Matrix는 화면에 그리기 직전 단계의 핵심 변환이라고 볼 수 있습니다.
지금까지의 흐름을 정리하면 렌더링 파이프라인은 아래와 같습니다.
Model Space
↓
World Matrix
↓
World Space
↓
View Matrix
↓
View Space
↓
Projection Matrix
↓
Clip Space
↓
NDC
↓
Viewport
↓
Screen Space
마무리
Projection Matrix는 3차원 공간을 2차원 화면으로 변환하기 위한 핵심 행렬입니다.
이 행렬 덕분에 가까운 물체는 크게 보이고, 멀리 있는 물체는 작게 보이는 자연스러운 원근감을 표현할 수 있습니다.
또한 Perspective Projection과 Orthographic Projection을 통해 게임의 장르와 목적에 맞는 화면을 만들 수 있습니다.
지금까지 살펴본 World Matrix와 View Matrix, Projection Matrix는 렌더링 파이프라인에서 가장 중요한 세 개의 공간 변환 행렬입니다.
다음 글에서는 이 세 가지 행렬이 실제로 어떻게 연결되어 하나의 MVP(Model-View-Projection) 변환을 구성하는지, 그리고 게임 엔진이 모델을 화면에 그리는 전체 과정을 하나의 흐름으로 정리해보겠습니다.