서론
게임에서 무언가가 모니터 화면에 보여지고 있다는 것(렌더링)은 게임 엔진이 렌더링 파이프라인 이라는 정해진 과정을 열심히 수행하고 있다는 증거이다. 게임 엔진은 일반적으로 렌더링 파이프라인 이라는 것을 수행해 이미지 또는 프레임을 화면에 렌더링 한다. 본 게시글은 Unreal Engine에서 이 렌더링 파이프라인이 어떤 방식으로 이루어지고 어떻게 플레이어의 화면에 무언가를 렌더링 할 수 있는지에 대해 다루도록 하겠다.
Rendering Pipeline?
렌더링 파이프라인의 과정에 대해 설명한 글은 정말 많다. 하지만 그 글들을 보면 과정이 조금씩 다르거나 똑같은 과정이라도 지칭하는 이름이 다르다. 렌더링 파이프라인은 렌더링의 목적에 따라 여러가지 종류의 렌더링 파이프라인이 존재하고, 설명하는 주체가 GPU의 관점에서 실행하는 렌더링 파이프라인과 그래픽 API(Open GL, DirectX 등)의 관점에서의 렌더링 파이프라인도 차이가 있고, 렌더링의 목적이 오프라인 렌더링(영화나 애니메이션)이냐 리얼타임 렌더링(게임이나 시뮬레이션)이냐에 따라서도 차이가 있다. 우선 Unreal Engine의 렌더링 파이프 라인에 대해 다루기 전에 모든 렌더링 파이프라인의 기초인 하드웨어(GPU)의 관점에서의 렌더링 파이프라인을 알아보자.
GPU에서 내부적으로 어떤 단계로 데이터가 처리되는가에 따른 추상적인 파이프라인 흐름은 이와 같다. 물론 여러가지 서브태스크들이 존재하지만 개괄적인 흐름은 이 세가지 단계를 거쳐 CPU 상에 존재하는 가상의 점들이 Screen에 렌더링 되는 것이다.
1. Application
Application 단계는 통상적으로 CPU로부터 오브젝트 데이터를 받아오는 과정을 말한다. GPU는 Buffer라고 부르는 Vertex로 이루어진 물체의 데이터 값을 읽고 저장한다. 이때 Buffer는 GPU의 Memory에 저장되며 Vertex의 Index, Position, Normal, Color 등의 정보를 가지고 있으며 이 단계에서 GPU는 해당 정보들을 가지고 삼각형 면(Triangle)을 생성한다고 생각하면 된다.
2. Geometry
Model Matrix
우선 Vertex의 위치는 Local 좌표계로 설정이 되어 있기 때문에 월드 변환 행렬(Model Matrix)을 곱해서 Local 좌표계를 World 좌표계로 변환을 한다.
View Matrix
이때 카메라가 없으면 화면에 보일 수 없기 때문에 카메라를 중심으로 Vertex에 카메라 행렬(View Matrix)을 곱해서 World 좌표계 에서 카메라 좌표계로 정렬을 해준다.
Projection Matrix
카메라 좌표계로 정렬이 된 후 투영(Projection)을 통해 Projection Matrix를 곱해 동차 좌표계(Homogeneous Coordinates)로 변환한다. 이때 주로 사용되는 투영 방법은 대표적으로 Orthographic projection과 Perspective projection 두 가지 방식이 있으며 Orthographic projection은 Parallel Projection 이라고도 하며 Vertex를 평행하게 투영하여 원근 효과 없이 크기가 일정하게 표현되므로 이는 UI나 2D 렌더링에서 주로 사용된다.
또 다른 Projection 방법으로 Perspective projection은 원근감을 표현하기 위해 삼각형의 닮음비를 이용해 실제 비율에 맞추어서 사실과 같은 크기로 투영을 하는 방식이다.
Perspective projection은 Orthographic projection이 사용되는 UI나 2D 환경을 제외한 모든 3D 환경에서 사용되는 Projection 방법이므로 Unreal Engine과 같은 게임 엔진에서는 서로 다른 렌더링 파이프라인을 통해 UI는 Orthographic projection으로 3D 객체들은Perspectiveprojection으로 렌더링을 한다.
3. Rasterizer
모니터 화면은 하나하나의 작은 Pixel이 $W \times H$개로 이루어져있으며 이는 2차원 좌표로 나타낼 수 있다. Geometry 단계를 통해 정규화된(정확히는 Normalized Device Coordinates 라고 한다.) 3차원 Vertex들을 어느 Pixel로 표현될 것인지를 정해주는 과정을 래스터라이져(Rasterizer) 또는 래스터화(Rasterization)라고 한다.
여기까지의 과정만 거쳐도 이제 모니터 화면에 무언가를 나타낼 수 있다. 아래 그림은 Unreal의 뷰포트에서 모드를 Unlit으로 설정하면 나오는 화면이다.
마무리
이로써 GPU 관점에서의 렌더링 파이프라인, 즉 모든 렌더링 파이프라인의 근본적인 개념에 대해 알아보았다. 물론 실제 게임 엔진, 특히 Unreal Engine에서는 이보다 훨씬 복잡하고 정교한 렌더링 단계와 최적화 기법이 적용되어, 리얼타임 렌더링과 성능을 동시에 달성하고 있다. 본 글은 필자가 학습을 통해 얻은 이해를 바탕으로 작성한 것이며, 이후 작성하는 글 또한 필자의 주관이 반영될 수 있음을 고려하여 읽어주길 바란다.
'Computer Graphics' 카테고리의 다른 글
2. [Unreal 5] 언리얼 엔진의 렌더링 파이프라인 (Rendering Pipeline) (0) | 2025.03.27 |
---|