들어가며
게임 개발은 가상 환경을 구현해 규칙과 인공지능을 구현하며 새로운 세상을 만드는 과정이다.
그렇기에 개발은 결코 쉽지 않다.
게임 개발자들은 개발 기간을 축소하고
더 효율적으로 개발하기 위해 다양한 방법들을 시도했다.


그 방법 중 하나는 게임을 3D로 개발하고 2D처럼 보이게 하는 것이다.
우리가 흔히 2D라고 알아온 게임들은 사실 3D로 만들어져 있다.
엥? 3D면 모델도 필요하고 더 복잡한 거 아니야?
하는 생각이 들 수 있지만

3D는 모델 하나로 모든 방향에서 바라본 구현할 수 있으며 편집에도 유리하다.
2D로 모든 것을 그리는 것보다 경제적이며 효과적이다.
하지만 반대의 경우도 있다.
이는 한 낭만의 시대 이야기이다.
1. 울펜슈타인 3D와 레이케스팅


이드 소프트웨어의 개발자, 존 카멕(John D. Carmack)은 2D를 3D처럼 보이게 만들었다.
지금 사진에 보이는 게 3D가 아니고 뭐냐고?
이는 명백하게 3D로 제작된 게 아니다.

당시 사양으로는 3D를 구현할 수 없었기에,
울펜슈타인 3D의 맵은 다음과 같이 평면으로 만들어져있다.
그래서 존 카멕과 개발자들은 수학적 부하를 줄이기 위해 한가지 꼼수를 생각한다.

플레이어를 기준으로 일종의 광선(Ray)를 투사해 빛에 닿는 표면을 파악한 후
출력 단계에서 입체감이 있도록 바꿔서 보여주는 일종의 꼼수이다.
이를 레이 캐스트(Raycast)라고 한다.
방법은 다음과 같다.
1. 플레이어 기준, 화면의 X축으로 모든 픽셀마다 광선을 투사한다.
광선이 벽을 마주치면 그 거리를 측정한다
2. 거리에 길고 짧음에 따라 플레이어가 마주하는 벽면의 크고 작음 판단한다.
3. 게임 화면에 출력할 때, 그 크고 작음을 고려하며 타일의 크기를 조절하여 보여준다.

그림으로 나타내면 이런 식이다.
모든 것은 2D 환경에서 구현됬지만,
우리 눈에는 깊이감이 있는 것처럼 보이게 된다
이 방법은 렌더링 속도가 매우 빠름과 동시에
실수가 아닌 정수 계산만으로도 가능하기에 계산 속도에서도 이점이 있다.
그리고 이 과정은 현재 시야에 들어와 있지 않은 맵은 출력하지 않음으로써
최적화가 가능해진다.
이를 컬링(Cuilling)이라고 한다.
마치 현실과 비슷하다.
양자역학에서 물질은 관측하기 전에는 파동으로만 존재한다.
존재할 수 있다는 상태에서, 우리가 관측하는 순간
하나의 상태로 확정되게 된다.
조금 다른 점이라면,
게임에서는 모든 정보와 위치가 이미 주어진 상태이고,
현실의 미시 세계는 아니라는 점이다.
울펜슈타인 3D에서는 맵을 가지고 컬링을 진행했지만
후에 3차원 기술 구현이 가능해지고는 한 모델에서도 컬링을 적용하곤 한다.
울펜슈타인 3D는 이 레이캐스트와 컬링으로 현대식 FPS 장르의 초석을 다진 동시에,
말 그대로 한 차원 더 높은 혁신을 불러왔다.
2. 둠(Doom)과 BSP
하지만 울펜슈타인 3D에도 한계는 있다.
2차원 맵을 3차원처럼 보이게 했기 때문에
Z축 자체가 존재하지 않아 계단과 같이 높이를 구현할 수 없었다

보이는 것 처럼 벽과 천장의 각도 역시 조절할 수 없다.
하지만 울펜슈타인 3D의 개발 1년 후,
혁신적인 게임이 이 모든 문제들을 해결하며 등장한다

바로 둠(Doom)이다.


둠에서는 계단을 올라갈 수도 있고, 계단 아래 있는 적에게 총을 쏴도 피해를 입는다!
드디어 3차원 공간을 구현했을까?
하드웨어의 발전이 있었나?
그게 아니다.
여전히 3D가 아니라 2D를 3D처럼 보이게 했다
하지만 기술이 바뀌었다.
이번에 사용된 기술은 이진 공간 분할법(Binary Space Partitioning, BSP)이다.
방법은 다음과 같다

맵 디자이너가 이런식으로 2차원 맵을 그려서 준다.

이제 개발자는 이 공간을 작게 쪼갠다.
이때, 쪼개는 과정은 재귀적으로 진행된다.
이 분할 과정을 통해 공간들을 하나의 트리(Tree)안에 저장한다

트리(Tree)란 하나의 부모 데이터에서 자식 데이터로 작게 작게 나뉘는 자료구조이다.
쉽게 얘기해서, 그냥 목차같은 거다.

"주제"라는 가장 상위 노드(루트) 아래에
1. 개요, 2. 정의, 3. 용어, 4. 자료구조...
라는 자식 분류가 존재하고
또 어떤 자식 노드에는 4.1, 4.2라는 하위 분류들이 존재한다.
이런 식으로 점차 내려가는 방식의 데이터 정렬 방식이다.
다시 돌아가보자.


이렇게 생긴 공간을 잘게 잘게 자른다고 했다.
이제 작게 잘린 공간들을 트리에 넣어준다.
트리의 특성 상 근처에 있는 공간 블럭들끼리 자연스레 가깝게 모이게 된다

이제 플레이어가 남색 블록에 위치에 있다고 하자.

플레이어가 위치해있는 공간을 렌더링하고
현재 있는 남색 가지와 가까운 가지들을 하나하나 렌더링한다.
만약 한 가지가 차지하는 공간이 화면상 앞에 가로막혀 보이지 않는다면
그 가지는 렌더링하지 않는다
그리고 이 방법을 시야에 해당하는 모든 공간이 렌더링될 때까지 반복한다
BSP는 어떤 정렬이나 새로운 축이 필요없이
단순히 트리의 가지들을 차례로 지나는 것 만으로 3차원을 구현할 수 있다

이런 방법으로
광선(Ray)를 쏘지 않고도
3차원 환경을 구현할 수 있게 되었으며,
벽의 각도나 크기도 자유롭게 제작할 수 있게 된다.
하지만 진정한 3차원은 아니다.
이는 단순히 2차원 공간을 3차원처럼 보이게 했을 뿐이다.

그렇기에 계단 아래있는 적에게 총을 발사해도 피격이 되는 이유이다.
실제로 적과 나는 같은 높이에 서있다.

이후 1996년,
이드 소프트웨어는 완전한 3D 엔진을 구현한다.
이 게임이 바로 퀘이크(Quake)이다.


적이나 맵이 모두 2D였던 둠, 울펜슈타인 시절과 다르게
모든 사물과 렌더링 방식이 모두 3D이며,
퀘이크 엔진은 OpenGL에 기반한다.
심지어 이 엔진은 어셈블리와 로우 레벨 C로 만들어졌다.
로우 레벨은 기계어에 가까운 언어를 의미한다

기계어는 알다싶이 0과 1이다.
어셈블리어와 로우 레벨 C는 그냥 쉽게 말해서 만들기 뒤지게 어려웠다는 의미이다.
인터넷 상에 좋은 비유가 있는데,
삽 한 자루가지고 아파트를 짓는 셈이다.
단순히 드래그 앤 드랍만으로 3D가 구현되는 요즘같은 시대에
그때 그 낭만의 시절 개발자들은 참...
시간이 되면 80~90년대 그 시절의
낭만 넘치는 슈퍼 개발자들과 개발 방법에 대해 조금 더 작성해보겠다.
'게임 칼럼' 카테고리의 다른 글
| Stellaris의 과학: 은하를 건너는 방법 (8) | 2025.07.29 |
|---|