[이득우 게임수학] 9. 게임 엔진 : 콘텐츠를 만드는 기술
- 📕 Book / 이득우 게임수학
- 2023. 2. 15.
9.1 게임 엔진의 구성요소
게임 엔진의 인터페이스는 게임 콘텐츠가 담기는 게임 공간을 설계하는 작업 공간과 게임 데이터를 관리하는 작업 공간으로 나뉜다. 게임 공간은 씬(Scene)혹은 레벨(Level)이라 부르며, 데이터는 리소스(Resource) 혹은 애셋(Asset)이라 부른다.
씬의 구조
게임 엔진은 개발자가 생성한 다양한 종류의 물체를 효과적으로 관리하기 위해 물체가 가져야 할 규격을 제시해주는데, 이를 게임오브젝트(GameObject) 또는 액터(Actor)라고 부른다. 게임 오브젝트는 게임 엔진에서 콘텐츠를 구성하는 기본 단위로 관리된다. 씬을 구성하는 게임 오브젝트는 게임 공간에 항상 존재해야 하기 때문에 언제나 공간 내 배치 정보를 가져야 한다. 게임 엔진은 게임 오브젝트의 배치 정보를 위치, 회전, 크기로 구성된 트랜스폼(Transform)의 정보를 사용해 관리한다.
모델링 행렬의 설계
트랜스폼은 크기, 회전, 이동의 세 가지 데이터로 구성된다.
- 크기(S) : 2차원 벡터 (S_x, S_y)
- 회전(R) : 각 θ
- 이동(T) : 2차원 벡터 (t_x, t_y)
각 데이터는 크기, 회전, 이동에 대한 세 가지 아핀 변환행렬에 대응된다.
┌ S_x 0 0 ┐
S = │ 0 S_y 0 │
└ 0 0 1 ┘
┌ cosθ -sinθ 0 ┐
R = │ sinθ cosθ 0 │
└ 0 0 1 ┘
┌ 1 0 t_x ┐
T = │ 0 1 t_y │
└ 0 0 1 ┘
행렬 곱은 교환 법칙이 성립하지 않기 때문에 아핀 변환을 적용하는 순서를 결정하고 행렬 곱을 진행해야 한다. 경우의 수는 총 6가지다.
- S · R · T
- S · T · R
- T · S · R
- T · R · S
- R · T · S
- R · S · T
보편적으로 사용하는 트랜스폼의 변환은 크기, 회전, 위치 순서로 일루어지는 4번 경우의수 T · R · S 이다. 트랜스폼의 정보로 만들어지는 모델링 행렬(Modeling matrix) M은 다음과 같다.
┌ cosθ·S_x -sinθ·S_y t_x ┐
M = T · R · S = │ sinθ·S_x cosθ·S_y t_y │
└ 0 0 1 ┘
로컬 공간과 로컬 축
물체의 정보를 담기 위해 부여한 공간을 로컬 공간(Local space)이라고 한다. 이러한 물체들을 모아 게임 콘텐츠를 만드는 데 사용되는 새로운 공간을 월드 공간(World space)이라고 한다. 그리고 물체를 기준으로 설정된 방향 정보를 로컬 축(Local axis)이라고 한다. 게임 엔진은 개발의 편의성을 위해 트랜스폼에서 로컬 축 데이터도 함께 제공하며 각 축은 다음과 같이 불린다.
- +X : 라이트벡터(Right Vector)
- +Y : 업벡터(Up Vector)
- +Z : 포워드벡터(Forward Vector)
트랜스폼의 이동과 크기 정보가 변경되더라도 게임 오브젝트가 보는 방향은 변함이 없기 때문에, 로컬 축 정보는 오직 회전 정보에만 영향을 받는다. 로컬 공간의 표준기저벡터 e_1이 변화된 값을 r로, e_2가 변화된 값을 u로 표현하면 트랜스폼에서 각 θ로 설정한 로컬 축의 값은 다음과 같다.
r = (cosθ, sinθ)
u = (-sinθ, cosθ)
┌ r_x u_x 0 ┐
R = │ r_y u_y 0 │
└ 0 0 1 ┘
┌ r_x·s_x u_x·s_y t_x ┐
M = │ r_y·s_x u_y·s_y t_y │
└ 0 0 1 ┘
리소스 관리
게임엔진은 씬과 무관하게 리소스를 모아두는 저장소를 별도로 제공하는데 이를 리소스 저장소(Resource repository)라고 부른다. 리소스 저장소를 효율적으로 관리하기 위해 리소스를 유형별로 나누고 각 리소스에 고유한 키를 부여한다. 그리고 게임 오브젝트에는 리소스 데이터를 가리키는 리소스 키 값만 저장하도록 설계한다. 그리하여 메모리 공간의 소비를 줄인다.
9.2 게임 엔진의 워크플로우
게임 엔진이 제공하는 실행의 흐름을 워크플로우(Workdflow)라고 하며, 게임 엔진의 워크플로우는 씬을 완성하는 과정과 완성된 씬으로부터 화면을 그려내는 과정, 두 가지로 구성된다.
CK소프트렌더러의 워크플로우
- 리소스 로딩 단계 : 게임에서 사용하는 리소스를 불러들이는 과정이다. 메시 텍스처 같은 리소스는 게임을 진행하면서 불러들이기에는 데이터 양이 크기 때문에 게임을 시작하기 전에 미리 메모리에 올려둬야 안정적으로 게임을 진행할 수 있다. LoadResources 함수가 이 역할을 한다
- 씬 구축 단계 : 게임 콘텐츠를 구성하는 씬을 설계하는 과정이다. 1 단계에서 생성된 리소스 정보가 게임 오브젝트에 연결된다. LoadScene2D 함수가 이 역할을 한다.
- 게임 로직 단계 : 프레임마다 게임 오브젝트에 포함되어 있는 트랜스폼 값을 변경하는 과정이다. Update2D 함수가 이 역할을 한다.
- 렌더링 로직 단계 : 완성된 씬 정보를 바탕으로 최종 화면을 만들어내는 과정이다. Render2D 함수가 이 역할을 수행한다.
렌더링 파이프라인
렌더링은 그릴 물체의 정보를 하드웨어인 그래픽카드 GPU에 넘겨 GPU가 처리하도록 위임하는 것이 일반적이다. GPU 내부에 설정된 워크플로우를 렌더링 파이프라인(Rendering pipeline)이라고 한다. 책에서 제공하는 CK소프트렌더러는 GPU에 렌더링 작업을 위임하지 않고 직접 구현했다.
- 정점 변환 단계 : 게임 오브젝트에 연결된 메시가 가지고 있는 모든 정점의 정보를 변환하는 과정이다.
- 정점 처리 단계 : 화면에 그려질 정점의 최종 위치 값을 구하는 과정이다.
- 픽셀화 단계 : 메시를 구성하는 삼각형마다 픽셀화를 진행하는 과정이다.
- 픽셀 처리 단계 : 삼각형을 구성하는 가 픽셀의 최종 색상을 구하는 과정이다.
레더링 파이프라인을 시작하는 함수가 호출되는 상황을 드로콜(Drawcall)이 발생된다고 표현한다. GPU에서는 삼각형을 구성하는 픽셀을 파편(Fragment)이라고도 부렴, 최종 픽셀의 색상을 개발자들이 직접 계산할 수 있도록 함수를 제공하는데 이를 파편 셰이더(Fragment shader)또는 픽셀 셰이더(Pixel shader)라고 일컫는다.
9.3 카메라 시스템
가상 공간의 카메라
카메라는 자신이 출력할 화면의 해상도 정보를 가지고 월드의 일부를 그려낸다. 카메라가 출력할 화면의 크기 정보를 뷰포트(Viewport)라고 부른다. 카메라를 중심으로 물체의 트랜스폼을 재조정하는 작업이 필요한데 이렇게 변환한 공간을 뷰 공간(View space)이라고 한다. 카메라의 트랜스폼을 설정하고 이동 행렬의 역행렬을 계산하여 뷰 행렬을 완성한다.
┌ 1 0 -t_x ┐
V = │ 0 1 -t_y │
└ 0 0 1 ┘
v_view = V · M · v_local
9-1 실습
게임 월드의 탐험

9.4 정리
- 게임 엔진을 구성하는 요소
- 물체를 효과적으로 관리하고 그려내는 전반적인 체계
출처
- 이득우의 게임수학 (https://www.onlybook.co.kr/entry/gamemath)