스폰서 기획: <저스트 코즈2>의 세계 – 대규모 오픈
랜드스케이프 구축을 위한 창의적인 테크놀로지
작성자: 리누스 블롬버그 (Linus Blomberg) 작성일: 2013년 5월 16일
아발란쉬 스튜디오는 10년 전에 오픈 월드 게임에 대한 열정을 품고 시작된 회사이다. 그러나 나에게 있어서는 1984년 이안 벨(Ian Bell)과 데이빗 브라벤(David Braben)의 BBC 마이크로 모델B(BBC Micro Model B)용 고전 게임 ‘엘리트(Elite)’를 플레이 할 때 이미 시작되었다. 32KB의 메모리와 2MHz로 운영되는 CPU만으로, 자유롭게 탐험할 수 있는 8,000개의 각기 다른 행성이 있는 우주를 만들어냈다는 사실에 나는 경탄했었다. 당시의 플랫폼 게임이나 사이드크롤러(sidecroller)와는 완전히 다른 경험에 나는 넋을 잃고 말았다.
침실 스페이스의 우주조종사들
나는 두 동생들과 함께 아버지가 대학 교수로 재직 중 학교에서 가져다 주신 낡은 폐기계를 사용하여 집 안 옷장에다 우주선 조종실을 만들었다. 중앙에는 BBC 와 조이스틱이 있었다. 맏형인 내가 당연히 가장 높은 계급으로 조이스틱을 맡았고, 동생들은 유도방향전환장치에 손가락을 두고 적의 미사일이 공격해 오면 즉시 긴급이동하도록 명령했다. 최악의 경우에는 탈출 작전을 펼쳐야 했다. 너무 늦게 누르면 진공의 우주공간-옷장 밖 침실-으로 빨려 들어가는 것이었다. 이렇게 심한 벌을 주었는데도 내가 운이 좋았는지 우리 형제들은 오픈 월드 게임에 대한 열정을 잃지 않았고, 결국 직접 게임을 만들어 보기에 이르렀다.
우리는 곧 프랙탈(fractal)을 발견했고 절차적(procedural) 테크닉으로서 하드웨어상의 전형적인 한계를 극복할 수 있다는 것을 깨달았다. – 몇 년 전 브라벤(Braben)과 벨(Bell)이 발견한 사실을 우리도 깨달은 것이다. 스웨덴 북부의 시골에 살고 있던 우리는 이 기술을 활용하여 창문 밖의 랜드스케이프를 묘사하고 싶어졌다. 수년에 걸친 수많은 코딩 작업 끝에 절차적인 랜드스케이프의 데모가 완성되었고, 에이도스(Eidos)의 한 프로듀서가 관심을 보여 <저스트 코즈(Just Cause)> 시리즈가 탄생하였다.
우주공간 저 너머로
<저스트 코즈> 시리즈 게임플레이의 근본은 거대한 세계에서 자유롭게 움직이는 능력이다. 또한 <저스트 코즈>의 경험에서는 원거리 표현(long draw distance)이 매우 중요하다. 플레이어의 프로그레션과 모티베이션 대부분을 비주얼 인풋으로 안내하기 때문이다. 우리는 플레이어가 수평선에서 무엇인가를 보고 저 먼 산 뒤에나 머나먼 섬에 무엇이 숨어있는지 알고 싶어하기를 바랐다. 아발란쉬 엔진은 처음부터 원거리 표현이 필요한 거대한 오픈 월드의 샌드박스 게임플레이를 위해 개발된 엔진이다.
이를 달성하기 위해서는 많은 기술이 필요하기 때문에, 기존의 게임 엔진에 오픈월드 기능을 추가하는 것은 매우 어려운 일이다. 이 글에서는 ‘지형 렌더링(terrain rendering)’이라고 하는 기술을 소개하고자 한다. 특히 <저스트 코즈>게임의 경우 어떻게 ‘지형 메쉬(terrain mesh)’가 생성되는지, 32*32 킬로미터의 세계를 모두 가시거리로 그려냈는지 설명할 것이다. 우리의 지오-모핑(geo-morphing) 테크닉으로 가시거리를 길게 하면서 동시에 ‘LOD 팝핑(level-of-detail popping)’을 제거한 과정, 리소스 관리 테크닉과 지형 메쉬의 생성에 필요한 방대한 데이터를 효과적으로 스트리밍하고 재창조한 데이터 압축에 대해서도 소개하려고 한다.
아발란쉬 엔진에서 지형 시스템을 디자인하는 목표는 다음과 같다.
메모리 효율성. 오리지날 <저스트 코즈>는 플레이스테이션 2 에서 출시되었기 때문에 우리는 이렇게 큰 월드를 구현하기에는 할당 메모리가 부족하다는 것을 예상했다. 데이터 압축과 절차적 테크닉이 필요했다.
고성능. 오픈월드 게임에서는 지형 시스템이 프로세서를 지나치게 소비하지 않도록 하기 위해 렌더링이 많이 필요하다. 이를 위해서 스태틱 버텍스 버퍼(static vertex buffer)를 사용해야 한다는 것은 알고 있었는데, 이 경우 일부 지형 렌더링 테크닉은 배제될 것이었다.
하이파이 비주얼. 이는 고해상도, LOD 팝핑의 제거, 긴 거리 묘사 등을 말한다. 다시 한 번 강조하면, 다른 두 목표를 달성하기 위해서도 절차적 테크닉은 필수적인 기술이다.
<저스트 코즈2>의 전형적인 풍경
같은 풍경을 와이어프레임으로 본 장면. 해안가나 복잡한 지역에서는 해상도가 높아지는 것을 볼 수 있다.
패치의 개념
아발란쉬 엔진에서 랜드스케이프 시스템의 핵심은 “패치”의 개념이다. 여기서 ‘패치’는 2 차원의 데이터 컨테이너 공간을 말한다.
패치의 크기는 언제나 2 차원 두 선의 제곱으로 나타나며, 포지션은 항상 자신의 사이즈의 몇 배가 되어 월드 액스(world axes)로 정렬된다. 패치에 들어 있는 실제 컨텐츠가 그 타입을 결정한다. 우리는 엔진에서 스트림(stream) 패치, 지형(terrain) 패치, 베지테이션(vegetation) 패치 등 여러가지 패치 타입을 사용한다. 이 각각의 패치 타입에 고유의 사용 목표가 있는 것이다.
같은 타입의 N*N 패치들의 모음을 ‘패치 맵(patch map)’이라고 한다. 보통 패치 맵은 카메라의 중심에 위치한다. 즉 카메라가 움직이면 패치 맵의 일부 패치는 사라지고 다른 패치가 창조되는 반면, 일부 패치는 계속 살아 있게 된다는 뜻이다.
패치 맵에는 또한 ‘패치 시스템’이라고 하는 위계가 존재한다. 패치 시스템이란 같은 타입의 패치 맵의 모음을 말한다. 각각의 패치 맵에는 같은 수의 패치가 포함되어 있지만 패치들간의 사이즈는 제곱으로 차이가 난다. 이 구조를 이용하여 같은 데이터에서 서로 다른 LOD 를 나타낼 수 있다. 우리는 이러한 위계로 되어 있는 패치들을 부모-자식 관계라고 부른다. 같은 공간에 펼쳐져 있다는 것을 제외하면 실제로 관련성은 거의 없지만 말이다.
그림 1: 카메라 중심부의 3단계 패치맵의 패치 시스템
중앙 패치 관리자가 이 패치들의 투입과 조직을 관리한다. 패치 관리자는 패치의 타입은 알지 못한다. 패치 헤더(header)와 알려지지 않은 데이터의 작은 블롭(blob)만 볼 수 있을 뿐이다. 이후 등록된 콜백(callback)에서 패치의 창조나 삭제를 비롯하여 각 타입에 맞는 액션을 취한다. 이 추상적 개념으로서 코어 패치를 더 쉽게 최적화할 수 있으며, 동시에 수천가지 패치를 운영할 수 있는 매우 유용한 방법이기도 하다. 패치 관리자는 또한 뷰 절두체(view frustum)와 대비하여 패치를 테스트하거나 메모리 관리를 하는 등 일반적인 작업들도 수행한다.
※ 자세한 내용은 첨부(PDF)화일을 참고하시기 바랍니다.
|