Voxel Space의 이해: 90년대 초반 지형을 정의한 2.5D 엔진

1990년대 초반, 3D 게임의 풍경은 오늘날과는 판이하게 달랐습니다. CPU는 현재보다 수십 배 더 느렸고, 일반 소비자들에게 GPU 가속이라는 개념은 거의 존재하지 않았습니다. 당시 대부분의 3D 게임은 단일 색상의 채워진 폴리곤을 렌더링하는 방식에 의존했는데, 이는 계산 비용이 많이 들고 시각적으로 단순한 경우가 많았습니다.

이러한 환경 속에서 NovaLogic은 1992년 Comanche를 출시했습니다. 이 게임은 시대를 몇 년은 앞서간 듯한 텍스처, 셰이딩, 그림자가 포함된 숨 막히는 지형을 선보였습니다. 이는 Voxel Space라고 알려진 기술을 통해 가능해졌는데, 이는 전통적인 2D 스프라이트와 완전한 3D 폴리곤 환경 사이의 간극을 메우는 2.5D 렌더링 방식입니다.

핵심 개념: 높이 맵(Height Maps)과 컬러 맵(Color Maps)

복잡한 메쉬와 셰이더를 사용하는 현대의 3D 엔진과 달리, Voxel Space는 두 가지 주요 데이터 구조인 height mapcolor map에 의존합니다.

  • Height Map: 각 값이 특정 좌표의 지형 고도를 나타내는 2D 그리드입니다. Comanche에서는 일반적으로 1024x1024 크기의 1바이트 맵이었습니다.
  • Color Map: 지형의 색상을 저장하는 상응하는 2D 그리드입니다.

이 방식의 가장 독창적인 측면 중 하나는 컬러 맵에 종종 "baked-in" 셰이딩과 그림자가 포함되어 있다는 점입니다. 커뮤니티 구성원들이 언급했듯이, 이는 엔진이 실시간으로 조명을 계산할 필요 없이 3D 베벨 효과를 만들어내어 CPU 부하를를 크게 줄여줍니다.

하지만 이 시스템에는 근본적인 한계가 있습니다. 위치당 하나의 높이 값만 허용한다는 점입니다. 이는 산과 계곡은 쉽게 표현할 수 있지만, 돌출된 절벽, 건물, 또는 나무와 같은 복잡한 기하학적 구조는 이 특정 방식을 사용하여 렌더링할 수 없음을 의미합니다.

렌더링 알고리즘의 작동 방식

Voxel Space 엔진은 레이 캐스팅(ray casting)과 유사하게 작동합니다. 삼각형을 계산하는 대신, 높이 맵과 컬러 맵을 래스터화하고 화면에 수직선을 그립니다.

기본 프로세스

  1. Clear Screen: 프레임을 초기화합니다.
  2. Painter's Algorithm: 적절한 폐쇄(가까운 물체가 먼 물체를 가리는 현상)를 보장하기 위해, 엔진은 전통적으로 장면의 뒤쪽에서 앞쪽으로 렌더링합니다.
  3. Perspective Projection: 엔진은 관찰자의 거리와 시야각(FOV)을 고려하여 맵상의 어떤 선이 관찰자에게 해당하는지 결정하며, 이를 통해 물체가 멀어질수록 작게 보이도록 합니다.
  4. Vertical Line Drawing: 각 선의 세그먼트마다 엔진은 맵에서 높이와 색상을 가져와 투영된 높이에 따라 화면에 수직선을 그립니다.

회전 추가하기

플레이어가 북쪽 이외의 방향을 바라볼 수 있게 하기 위해, 엔진은 좌표에 삼각함수 회전을 적용합니다. 시야각($\phi$)의 sincos를 계산함으로써, 엔진은 카메라의 방향과 관계없이 샘플링할 height map의 올바른 세그먼트를 결정할 수 있습니다.

성능 최적화

이러한 엔진들은 제한된 하드웨어(예: 80286 CPU)에서 실행되었기 때문에, 개발자들은 플레이 가능한 프레임 레이트를 유지하기 위해 몇 가지 영리한 트릭을 사용해야 했습니다.

Front-to-Back 렌더링과 Y-Buffers

기본 알고리즘이 Painter's Algorithm(뒤에서 앞으로)을 사용하는 반면, 더 효율적인 방식은 앞에서 뒤로 렌더링하는 것입니다. 이는 결국 가까운 지형에 의해 가려질 픽셀을 그릴 필요가 없게 만듭니다. 시각적 오류를를 방지하기 위해, 각 열마다 그려진 가장 높은 Y-위치 값을 저장하는 Y-buffer가 사용됩니다. 만약 새로운 선이 해당 열의 이전에 그려진 선보다 높지 않다면, 그것은 버려집니다.

Level of Detail (LOD)

주기(cycles)를 더욱 절약하기 위해, 엔진은 거리($z$)에 대해 가변적인 단계 크기(step size)를 사용할 수 있습니다. 카메라로부터의 거리가 멀어질수록 단계 크기를 키움으로써, 엔진은 전경의 높은 정밀도를 유지하면서도 원경의 디테일은 적게 렌더링합니다.

역사적 맥락과 기술적 논쟁

Voxel Space의 유산은 향수와 기술적 호기심의 대상입니다. 일부 개발자들은 느린 부동 소수점 곱셈을 피하기 위해 룩업 테이블(lookup tables)을 사용하여 16MHz 프로세서에서 "모든 성능을 쥐어짜내는" 엄청난 만족감을 기억합니다.

하지만 기술적인 뉘앙스가 존재합니다. 한 기여자가 다음과 같이 지적했습니다:

기술적으로 이것은 3D 공간을 세 축 모두에서 동일하게 나누는 voxels("volumetric pixels")와는 관련이 없습니다. 이것은 단지 height map, 즉 프리즘들의 집합일 뿐입니다... Doom 맵과 크게 다르지 않습니다.

용어에 대한 논쟁에도 불구하고, 기술의 영향력은 부정할 수 없습니다. 흥미롭게도, Comanche의 개발은 프로그래머의 의료 산업 경험, 특히 실제 볼륨 데이터를 사용하는 CT 및 MRI 스캔 기술의 영향을 받은 것으로 알려져 있습니다.

Voxel Space 방식의 요약

특징 Voxel Space (2.5D) Modern 3D (Polygonal)
데이터 소스 Height/Color Maps Vertex Meshes/Textures
렌더링 Vertical Line Casting Triangle Rasterization
조명 Color Map에 사전 적용됨 실시간 셰이더/Raytracing
복잡도 $O(Distance imes Width)$ $O(Polygons)$
제약 사항 X,Y당 단일 높이 임의의 기하학적 구조

Sources