게임 엔진 아키텍처를 향한 여정을 시작한 여러분을 환영한다. 이 책에서 이루고자 하는 목표는 통상적으로 상용 게임 엔진을 이루는 모든 구성 요소를 두루 살펴보는 것이다. 게임 프로그래밍은 굉장히 방대한 주제이므로 살펴봐야 할 것이 한두 가지가 아니다. 그렇지만 이 책을 읽고 나면 책에 나오는 각각의 엔지니어링 분야에 대해 이론뿐 아니라 통례까지 확실하게 이해할 수 있을 거라고 생각한다. 다 읽고 나면 여러분은 앞으로 접하게 될 흥미로우면서 동시에 일평생 공부해야 할 여정의 또 다른 출발점에 서게 될 것이다. 세상에는 게임에 쓰이는 온갖 기술들에 대한 정보가 가득하며, 이 책의 역할은 기반을 다지는 동시에 더 깊은 공부를 위한 발판이 되는 것이다.
이 책에서 주로 다룰 내용은 게임 엔진 기술과 구조(아키텍처)다. 즉, 상용 게임 엔진을 이루는 여러 하부 시스템의 바탕이 되는 이론뿐 아니라 그것들을 구현하는 데 필요한 자료 구조, 알고리즘, 소프트웨어 인터페이스를 모두 다룬다. 게임 엔진과 게임의 경계는 다소 불분명하다. 이 책에서는 주로 게임 엔진 자체에 집중할 텐데, 여기에는 여러 가지 로우레벨 기반 시스템 및 렌더링 엔진, 충돌 시스템, 물리 시뮬레이션, 캐릭터 애니메이션 등이 포함되며, 마지막으로 내가 개인적으로 게임플레이 기반 계층이라 부르는 부분에 대한 심층적 논의도 포함된다. 이 계층은 게임의 객체 모델과 월드 에디터, 이벤트 시스템, 스크립트 시스템을 아우른다. 뿐만 아니라 게임플레이 프로그래밍의 여러 측면에 대해서도 간단히 다룰 텐데, 여기에는 플레이어 메카닉, 카메라, AI 등이 포함된다. 하지만 어쩔 수 없이 이런 분야에 대해서는 게임플레이 시스템과 게임 엔진 사이의 인터페이스에 관련된 부분만으로 한정한다.
이 책을 쓴 것은 중급 게임 프로그래밍에 관한 두세 학기 분량의 대학 교재가 필요했기 때문이다. 그렇긴 해도 아마추어 소프트웨어 엔지니어를 비롯해 취미로 게임을 공부하거나 혼자서 게임 프로그래밍을 배우는 사람, 그리고 이미 게임 업계에서 일하는 사람이 읽어도 유용한 내용이 많다. 아직 배울 것이 많은 엔지니어는 이 책을 통해 게임에 쓰이는 수학, 엔진 구조, 게임 기법 등을 분명히 이해할 수 있게 될 것이다. 또한 특정 분야에 깊은 경력을 쌓은 엔지니어도 이 책을 통해 큰 그림을 더 잘 이해하게 될 수도 있다.
이 책을 가장 잘 이해하기 위해서는 기본 객체지향 프로그래밍 개념에 대해 실용적인 지식을 갖추고 적어도 약간의 C++ 프로그래밍 경험이 있어야 한다. 근래 게임에도 새롭고 신기한 여러 언어들이 쓰이기 시작했지만, 상용 레벨의 3D 게임 엔진을 만드는 데는 거의 대부분 C나 C++를 쓴다. 따라서 게임 프로그래밍을 진지하게 할 요량이면 반드시 C++를 알아야 한다. 3장에서 기본적인 객체지향 프로그래밍에 대해 되짚어 볼 기회가 있을 것이고, 책을 읽어 가면서 몇 가지 C++ 트릭을 알게 되겠지만 C++를 제대로 공부하기 위해서는 참고 문헌의 [39], [31], [32]를 읽어 보는 것이 최선이다. C++에 대한 기억이 가물거린다면 책을 읽어 가면서 위의 책들이나 그와 비슷한 책을 읽어 기억을 되살리기를 권장한다. C++를 전혀 써보지 않은 독자라면 이 책을 본격적으로 시작하기 전에 [39]의 앞부분을 조금 읽어 보거나 온라인 C++ 튜토리얼이라도 몇 번 살펴보기 바란다.
컴퓨터 프로그래밍을 배우는 가장 좋은 방법은 직접 코드를 짜 보는 것이다. 이 책을 읽어 가면서 흥미가 동하는 주제를 골라 그에 대한 프로젝트를 직접 진행해보기 바란다. 캐릭터 애니메이션에 흥미가 있는 독자라면 당장 오거(Ogre)3D를 설치해 스킨 애니메이션 데모를 살펴보자. 그런 후 오거를 사용해 이 책에서 설명한 애니메이션 블렌딩 기법을 몇 가지 구현해 보는 것도 좋다. 다음 단계로 조이패드를 조작해 애니메이션하는 캐릭터를 이리저리 돌아다니게 만드는 기능을 구현할 수도 있다. 일단 간단하더라도 제대로 돌아가는 것을 구현하고 나면 그 위에 다른 것을 얹어 확장하면 된다. 이것저것 해본 후에 다른 게임 기법으로 옮겨 앞의 과정을 또 반복하면 된다. 프로젝트의 주제는 딱히 중요하지 않다. 핵심은 그냥 읽고 넘어가지 말고 직접 게임 프로그래밍을 해보는 것이다.
게임 기술은 활발히 살아 움직이는 분야이므로 책 한 권으로 모든 것을 담기에는 턱없이 부족하다. 따라서 이 책 원서의 웹사이트 http://gameenginebook.com에 별도의 정보나 오탈자 등의 정오표, 업데이트, 샘플 코드, 프로젝트 아이디어를 간간히 올려놓을 예정이다.
---「저자서문」 중에서
게임 엔진은 기반 기술이나 역할이 상이한 코드가 모여 이뤄집니다. 예를 들면 운영체제나 하드웨어를 제어하는 코드와 플레이어의 경험을 구현하는 코드는 근본적으로 생각의 개념이 다릅니다. 또한 툴까지 포함한다면 그 범위가 더욱 넓습니다. 따라서 어떤 한 부분에서 오래 일을 함으로써 많은 경험을 쌓았더라도 그것이 곧 전체적인 게임 엔진에 대한 이해를 뜻하지는 않습니다. 그렇게 되려면 다양한 분야에서 일을 하거나 따로 부지런히 공부하는 수밖에 없습니다.
지금껏 저를 포함한 대다수 게임 프로그래머들이 공부를 할 때는 코드를 직접 보거나 특정한 주제에 대해 인터넷을 뒤지고 책을 읽는 수밖에 없었습니다. C++ 프로그래밍, 운영체제, 렌더링 등 여러 가지 분야의 책들이 있었지만, 기이하게도 게임 엔진이라는 틀 안에서 한데 모아 놓은 책은 없었습니다. 그런 의미에서 이 책은 최초이자 고유한 게임 엔진 서적이라고 하겠습니다.
사실 게임 프로그래밍에 관해서도 이런 책이 나올 때가 됐습니다. 아니, 오히려 늦었다고 할 수도 있습니다. 이 책에 있는 내용 중 새로운 것은 없습니다. 다른 책을 통해 더 심도 있게 배울 수 있는 부분도 있고, 인터넷을 통해 최신 정보를 얻을 수 있는 부분도 있습니다. 그렇지만 전체적으로 정보를 정제하고 선별해 풀어내는 일은 그리 쉽지 않습니다. 지금껏 비슷한 책이 없었다는 사실로 미루어 이 일이 얼마나 힘든지를 간접적으로 증명하고 있습니다. 저자의 이력을 보면 게임 개발로 잔뼈가 굵은 베테랑인 것을 알 수 있는데, 책의 많은 부분에서 실제로 해본 사람만이 알 수 있는 세부적이고 실질적인 지식을 확인할 수 있습니다. 또한 직접 교단에서 가르치며 수집한 자료가 바탕이 되어 그런지 굉장히 다양하고 충실한 참고 자료를 함께 수록했습니다. 사실 개발 경력이 오래 되더라도 특정 분야 한두 개를 제외하고는 깊은 지식을 얻기는 쉽지 않은데, 이토록 다양한 분야를 아우를 수 있는 점은 존경스럽기까지 합니다.
처음에 멋모르고 이토록 방대한 책을 번역한다고 했을 때는 시간이 이렇게 오래 걸릴 줄 몰랐습니다. 나름 생업에 종사하는지라 밤 시간을 할애해 번역을 했는데, 그 과정에서 여러 복잡다단한 감정을 느꼈습니다. 이 일을 안 했으면 여름 밤에 자전거를 타러 나가거나 BBC 자연 다큐 블루레이를 감상하고 게임도 할 수 있었을 텐데 하는 후회도 들었고, 이렇게 힘들게 번역해도 욕만 먹는 건 아닐까 하는 두려움도 있었습니다. 왜 문장은 고치고 또 고쳐도 다음에 보면 어색한지…… 그래도 끝나고 나니 많은 것을 배운 것 같습니다. 특히 실질적인 지식 외에도 스스로의 부족한 점을 깨달을 수 있었던 기회였습니다. 제가 힘들다고 투덜대는 건 저자인 제이슨 그레고리의 노력에 비하면 아무것도 아닙니다. 이 사람도 가정이 있고 일하면서 책을 썼거든요. 원래는 힘들었다는 하소연을 더 길게 쓸까 했었는데 부끄러워 이만 줄입니다.
번역을 하면서 늘 생각해 왔던 점은 새로 입사한 신입들에게 읽히면 좋겠다는 것이었습니다. 실제로도 원서를 두 권 사다가 팀에 배치해 놓기도 했습니다(당연히 회사 돈으로). 또 좀 일찍 읽었으면 더 큰 도움이 됐을 텐데 하는 아쉬움도 있습니다. 이런 두꺼운 책을 읽으면서 한두 가지 새로 배우지 않았다고 말하면 거짓말이겠죠. 솔직히 말하면 제 자신이 개발자로서 이 책에서 너무나 많은 것을 배웠기에 이 책을 단지 학생용 교재로 소개하자니 부끄러운 마음이 들기도 합니다.
컴퓨터 관련 번역을 할 때 제일 걸리는 건 용어일 겁니다. 딱히 체계적으로 정립된 우리말 용어가 없습니다. 수학 용어를 번역할 때는 국가지정 수리과학연구정보센터(http://mathnet.kaist.ac.kr/mathnet/math_list.php)를 많이 참조했고 물리 용어는 많이 참조하지는 않았지만 한국물리학회가 발간한 ‘물리학 용어집’이 있는데, 이 분야는 그런 것이 없습니다. 현업의 엔지니어들은 우리말 용어를 쓰거나 번역을 시도하는 데 별로 흥미가 없는 것 같고, 학계에서도 딱히 시도를 하고 있는 것 같지는 않습니다. “버퍼 오버런이 나서 디버거로 덤프를 떴는데 콜 스택이 보이지 않아” 같은 대화는 억지로 지어낸 말이 아니라 일상적으로 들을 수 있는 말입니다. 하지만 제가 방금 나온 외래어들을 소신껏 우리말로 고쳐 쓴다면 이 책은 팔리지 않겠죠. 한 가지 위안을 삼자면 영어를 모국어로 사용하는 사람이라도 기반 지식이 없는 사람이 저 문장을 봤을 때 느끼는 심리적 거리감은 한국 사람과 별반 차이가 없을 것 같다는 점입니다. 따라서 일상적으로 정착된 외래어는 통상적으로 쓰이는 대로 그대로 썼고, 문맥상 우리말로 바꿔도 지장이 없는 부분은 최대한 자연스럽게 고쳐 썼음을 밝힙니다. 또한 물리 용어의 경우 앞서 말한 ‘물리학 용어집’의 용어들이 90년대에 중고등학교를 나온 저희 세대에게는 매우 어색하기 때문에 어쩔 수 없이 예전에 통용되던 한자식 용어를 그대로 썼음을 양해 바랍니다. 즉, coefficient of static friction는 멈춤 쓸림 곁수가 아니라 정지마찰계수라고 옮겼습니다.
---「옮긴이의 말」 중에서