다이렉트 X의 신세대「버전 9」집중분석

일반입력 :2003/02/12 00:00

김병철

지난 2002년 12월 어느날, 온라인 게임을 개발중인 게임 개발사의 김 팀장은 즐거운 마음으로 퇴근을 하였다. 주 업무인 프로그램도 안정화 단계고 곧 서비스 일정도 잡힐 것이다. 모든 것이 순조로와 보였다. 집에 돌아온 김 팀장은 회사에서 다 못한 자료수집을 위해 노트북의 전원을 켰다. 반가운 윈도우 XP 홈 에디션 로고가 뜨고 바탕화면에 띄워놓은 어여쁜 아가씨의 얼굴이 그의 얼굴을 반겼다. 김 팀장은 평소 자료수집을 위해 자주 가는 모 게임개발 커뮤니티 사이트에 접속을 하였다. 프로그램 게시판을 검색하던 중, 청천벽력 같은 소식을 접하고야 말았다.

‘다이렉트X 9.0 SDK 정식 릴리즈!!!’

눈에서 불똥이 튀어나오는 듯했다. 서비스 오픈 일정이 코 앞으로 다가온 지금 예상보다 SDK가 빨리 릴리즈가 된 것이다. 과연 새로운 SDK를 사용해야 할 것인가, 말아야 할 것인가? 김 팀장은 서둘러 마이크로소프트의 다이렉트X 홈페이지에 접속하여 SDK를 다운받았다. 그리고 샘플 브라우저를 실행시켰다. 새로운 기능들, help에 나온 변경 사항들, 참신한 새로운 기술과 편리한 기능들이 눈에 들어왔지만, 이것을 연구하여 적용시킬 시간을 생각하면…. 과연 프로젝트를 9.0으로 포팅해야 할 것인가, 그대로 8.0 버전으로 릴리즈시켜야 할 것인가. 김 팀장은 그날 빌게이츠를 저주하는 MSN 대화명을 입력하고 잠자리에 누워 일주일간 끊어왔던 담배를 다시 꺼내 물었다.

다이렉트X 9.0이 발표하던 날, 어느 게임 개발사의 프로그램 팀장이 겪었음직한 상황을 한 번 가상으로 꾸며 보았다. 비단 팀장 위치의 사람이 아니더라도 실무자들이라면 한 번쯤 고민에 빠졌을 것이다. 현재 진행중인 프로젝트를 그대로 이전 SDK를 사용해서 개발하느냐, 아니면 좀더 신기술과 좋은 기능을 써서 9.0 버전으로 다시 만드느냐 하는 문제 말이다. 물론 결론은 각 개발사마다의 형편 때문에 조금씩 바뀌겠지만, 프로그래머들이라면 새로 나오는 SDK로 만들어 보고자 하는 욕심은 불현듯 뇌리를 스쳐 후두부를 강타, 뜬눈으로 밤을 새우게 만들곤 할 것이다.

화면 1 이번에 제일 재미있게 본 예제인 이펙트 에디터.

1년에 한 번씩 개발자를 괴롭히는 다이렉트X

그렇다. 1년에 한 번씩 메이저 버전업을 하는 다이렉트X는 그 하드웨어적인 편리함이나 호환성에서 프로그래머들에게 환영받기도 하지만 너무 잦은 버전업, 그리고 버전업 때마다 바뀌는 인터페이스로 불만을 사기도 한다. 물론 이전 버전에서 문제시되던 사항들을 좋게 바꾼 것이긴 하지만 겨우 8.0 버전에 익숙해져서 게임을 만들어 볼만 하니 9.0이 나오는 상황은 뭐라고 해도 좋게 납득이 가질 않는다. 보통 게임 개발에 소요되는 기간이 1년에서 2년 정도 걸린다고 할 때, 처음 제작에 들어갔을 때 만들었던 SDK와 출시시에 나온 SDK는 다르다는 것이다. 즉 한 번은 꼭 버전이 바뀌어서 포팅을 해야만 한다는 것인데 이러한 상황은 급변하는 세상에서 게임 프로그래머로, 특히 윈도우 계열에서 다이렉트X로 프로그래밍을 하는 프로그래머는 반드시 겪어야 하고 반드시 넘어야 할 상황인 것 같다.

필자도 이런저런 경우를 많이 겪어봤지만, 그래도 이번 8.0에서 9.0으로의 변화는 이전에 2.0에서 3.0으로의 변화나 7.0에서 8.0의 변화보다 변화의 폭이 적다고 할 수 있겠다. 그래서 그런지 이번 경우에 단순한 포팅에는 그리 많은 시간이 걸리지 않았다. 하지만 심도있는 기능을 사용하려고 하니 시간과 자료의 부족으로 힘든 것은 이전과 마찬가지다.

도대체 뭐가 바뀌었나

다이렉트X 9.0의 등장에서 눈여겨봐야 할 객체들은 다이렉트3D(Direct3D)와 다이렉트쇼(DirectShow)일 것이다. 다이렉트3D의 경우 변화는 적지만 추가된 인터페이스나 기술이 눈에 띄며, 다이렉트쇼는 3D에 대한 지원과 문자 출력 등의 기능을 직접 지원해줄 수 있도록 대폭 개선되었다.

다이렉트X 9.0의 등장은 3D 분야에서 가장 큰 의미를 가지게 되는데, 다음 세대의 3D 가속카드의 등장을 의미한다고 할 수 있다. 지금껏 사용되던 지포스2, 지포스3, 지포스4 등의 엔비디아 계열 카드나 ATI의 라데온 8000 시리즈 등은 이미 최근의 그래픽 API에서 지원하는 다양한 기능을 전부 지원하고 있지 못한 실정이다. 엔비디아의 차세대 칩셋을 사용한 지포스 FX나 ATI의 라데온 9700 등의 하드웨어만이 최신의 다이렉트X 9.0을 지원하고 있으며, 또한 새로운 하드웨어들은 셰이더 2.0 뿐만 아니라, 새로 추가된 버텍스 셰이더 3.0과 픽셀 셰이더 3.0 등을 지원할 예정에 있다고 한다.

또 한 가지 중요한 의미는 HLSL(High Level Shader Language)의 등장으로 프로그래머들에게 상당히 접근이 어렵고 디버깅이 힘들었던 셰이더 언어가 좀더 쉽게 사용이 가능해졌다는 점이다(닷넷 + XP 환경에서만 가능하다니 아쉽긴 하다). 엔비디아의 Cg(C for graphics)에 영향을 받은 듯 보이는 이 HLSL은 C 언어 수준의 고 수준 언어로서 버텍스 셰이더(vertex shader)의 강력한 기능과 고 수준 언어의 가독성이나 호환성을 유지하고 있다.

다이렉트X 9.0을 인스톨한 후에 느끼는 처음 눈에 띄는 부분은 샘플 브라우저의 등장이다. NVEffect 브라우저와 비슷하게 샘플을 간단한 설명과 함께 손쉽게 도큐먼트를 열람하고 프로젝트를 열어서 편집할 수 있도록 만들어져 편리함을 더해 준다. 또 한 가지 반가운 소식은 VC 6.0만을 지원하던 AppWizard가 비주얼 스튜디오 닷넷 버전까지 지원하게 되었다는 소식이다.

API? 간이엔진?

<화면 2>의 그림은 다이렉트X에 포함된 데모중의 하나로 디센트 형식의 우주 비행기 시뮬레이션이다. FPS 계열의 게임이라고 할 수 있다. 이 데모는 완전히 다이렉트X를 기반으로 하여 모든 것이 작성되었으며, 코드의 양도 그리 많은 편이 아니다. 이 데모를 보면서 느끼는 것은 정말 도너츠의 발전이 대단하다는 점과 함께, 다이렉트X 자체가 상당히 강력한 기능을 가지게 되었다는 것이다. 사실 도너츠의 복수 정도면 여타 간단한 저가형 엔진의 테크니컬 데모가 될 수 있는 수준이다.

화면 2 이것이 바로 도너츠의 복수이다.

3D 엔진이라면 기본적으로 수학용 각종 구조체와 계산 함수를 가지고 있어야 한다. 그리고 객체를 위해 객체를 저장할 포맷과 이것을 읽어서 렌더링하는 부분, 객체를 3D 모델링 툴에서 작업하여 저장하기 위한 플러그인들이 필요하다. 또한 애니메이션을 위한 애니메이션 구조와 애니메이션 구현, 그리고 배경 렌더링 및 공간 분할, 물리학 등이 들어간다. 그리고 이러한 배경들을 만들 수 있는 툴을 제공하곤 한다. 이러한 요소들이 모두 충족되면 상당히 좋은 엔진으로 평가받으나 이중 한두 가지가 빠진 엔진들도 상당히 많다. 이번에 릴리즈된 다이렉트X 9.0의 다이렉트3D 익스텐션(D3DX)을 보면 D3DX 자체가 약간은 기능이 모자란 간이 엔진 정도의 성능을 가지게 되었다는 것을 확인할 수 있다.

8.0 버전부터 정식으로 지원하기 시작한 D3DX 함수들은 원래 D3DXMath라는 예제용 수학함수 유틸리티들이 발전된 형태이다. 처음에는 자주 사용하는 수학함수들을 지원하는 것으로 시작하여 차츰 지원의 폭을 넓혀 X-File, 스키닝 애니메이션, 프로그래시브 메시 등을 지원하게 되었다. 또한 이번 버전에서는 애니메이션을 추가로 지원하게 되었다. 이 부분은 지난 버전에 Skinned 메시 예제에 들어가 있던 대부분의 구조체와 함수들을 D3DX에 포함시킨 것이다. 이러한 부분을 포함시킴으로써 D3DX는 배경 부분을 제외한 수학 관련 부분과 캐릭터 관련 부분까지는 모든 것을 지원하는 하나의 간이엔진으로 발돋움하게 된 것이다. D3DX 정도의 기능이라면 게임을 개발하기 전 고급엔진을 구입하기 전단계인 프로토타입 제작 단계에서 충분히 그 성능을 발휘할 수 있을 것이라고 생각한다.

화면 3 오늘도 여전히 열심히 걷고 있는 Tiny(웬만하면 모델 좀 바꾸지).

다이렉트3DX의 발전에 이바지한 공이 지대한 예제이다.

초보자도 쉽게 접근하는 3D API

또한 새롭게 3D를 접하는 프로그래머들에게 어렵게만 느껴졌던 부분들을 쉽게 접근하게 함으로써, 초반에 개념을 잡는 작업을 좀더 할 수 있고 개발 프로세스도 상당히 줄일 수 있기 때문에 프로그래머들은 그만큼 편해졌다고 생각한다. 더욱이 고급 주제인 셰이더나 버텍스 버퍼 등에 익숙하지 않은 프로그래머들에게는 이러한 개념에 쉽게 접근할 수 있는 토대를 마련해주는 유틸리티 함수군으로서의 역할을 한다. D3DX 함수들의 예찬론을 잠깐 펼쳐 보았는데, 필자의 주된 말은 결국 D3DX는 쉽고 강력하며, 초보자들도 쉽게 3D 프로그래밍을 할 수 있도록 도와준다는 것이다.

또 한 가지 다이렉트X가 일선 개발자들에게 환영받을 만한 것은 이전 버전에 비해 각 객체간의 호환성이 좋아졌다는 것이다. 특히나 가장 마지막에 추가된 다이렉트쇼 객체와 다른 객체의 호환성이 눈에 띄게 좋아졌다. 다이렉트쇼는 VMR9이라는 새로운 기술로 인해서 텍스처에 동영상을 출력하거나 동영상 오버레이를 시킬 수 있는 기능이 추가됨으로써 게임 내 동영상 출력에 편리한 기능을 제공하게 되었다. 이제는 3D에서 동영상을 출력하기 위해 고가의 동영상 라이브러리를 따로 구입할 필요가 없어진 것이다.

그 외에 Appwizard로 최초 생성된 클래스들에 포함된 클래스들을 살펴보자면, 상당히 유용한 유틸리티들이 포함된 것을 알 수 있다. 다이렉트인풋(DirectInput)의 액션 맵퍼(action mapper)라든가, 다이렉트사운드(DirectSound)를 사용하기 위해 wav 등의 음성 파일을 읽어올 수 있는 루틴들이 제공되고 있다. 이처럼 많은 기본적인 기능을 제공하고 있기 때문에, 예전에 많이 등장하였던 다이렉트X 랩핑 엔진(wrapping engine)들이 더 이상 필요없는 실정이 되었다. 처음 다이렉트X를 접한 사용자들은 지난 버전보다 좀더 쉽게 다이렉트X를 이용해서 프로그래밍이 가능할 것이다.

정말 쉬워지긴 한건가?

예전에는 3D를 처음 공부하려면 먼저 OpenGL로 공부를 시작하여 체계를 잡아나가라고 조언을 하곤 했다. 물론 OpenGL은 대단히 좋은 API이고, 3D의 여러가지 개념을 잡기 좋은 구조를 가지고 있으며 C로 작성할 수 있어서 쉽게 접근할 수 있다는 장점이 있다.

다이렉트X의 이번 버전을 보면서 느끼는 것은 이번 버전은 초보자를 위한 배려가 상당히 많아졌다는 느낌이다. 물론 고급 기술도 다수 제공되었지만, 이전에 비해서 점점 쉬워지는 것만은 사실인 것 같다. 대표적인 예로 이번에 추가된 툴은 총 세 가지가 있다. 닷넷까지 지원하게 된 AppWizard, Dmusic tool wizard, Audio effect DMO wizard 등이 있다. 예전에 비해 프로젝트 위저드가 추가돼 프로젝트 생성이 상당히 손쉬워졌다. 또한 옵션이 상당히 다양해져 용도에 맞는 여러 가지 프로그램의 기초를 만들기 쉬워졌다. 한 마디로 클릭만 해서도 기본적인 삼각형이나 주전자를 띄우는 프로그램 정도는 작성이 가능해진 것이다(물론 8.0 버전 때도 지원했었다).

또한 8.0 버전부터 사용되던 이펙트 객체의 사용 범위가 더욱 확대되었다. 셰이더와 함께 사용이 가능하게 되면서, 이번 버전에서 새로이 지원하게 된 HLSL로 작성된 셰이더도 지원한다. 이러한 이펙트 소스를 디버깅하거나 미리 테스트할 마땅한 방법이 지난 버전에서는 없었지만, 이번에 추가된 이펙트 에디터는 이러한 불편을 해소하였다. 이펙트 에디터의 몇 가지 제약사항을 제외하고는 간단한 스크립트 언어처럼 렌더링 부분을 제어할 수 있게 되는데, 이러한 작업을 실시간으로 테스트해 보면서 가능하다는 점은 프로그래머들을 상당히 편하게 하는 일이다. 또 GDI를 지원하기 때문에 단순한 그래픽이나 폰트를 출력할 때 불편했던 점을 많이 보완했다(3D 함수 호출이 끝난 후에만 사용이 가능해서 조금 불편하긴 하다).

물론 쉽고 편해지기만한 것은 아니지만, 이전 버전보다 버전업된 만큼 편리해지고 기능이 추가된 것은 사실이다. 물론 버전이 바뀌면서 변경된 점은 상당히 사용자를 짜증나게 하긴 하지만 말이다. 다이렉트X 9.0의 특징이라면 초보자를 위한 배려가 이전 버전보다 상당히 늘어났다는 것일 것이다. 예제도 상당히 풍부해지고, 데모도 충실해졌으니 말이다.

일선의 개발자들의 대응 방향은?

처음 3D 프로그래밍을 하는 사람들에게 이전 버전에 비해 장벽이 낮아져서 좋아진 면은 있지만 사실 꾸준히 게임을 개발해 오던 개발자들에게 새로운 버전의 발표는 참 딜레마에 빠지게 하는 사건이다. 앞서 김 팀장의 예처럼 과연 새로운 버전으로의 포팅을 해야 할 것인가, 아니면 현재 작업하던 버전으로 계속 작업을 할 것인가? 포팅뿐만 아니라 새로이 추가된 기술을 사용하여 좀더 멋진 게임을 만들 것인가 하는 문제이다. 물론 개발자이니만큼 좀더 새로운 좋은 기술을 사용하여, 멋진 게임을 만들고 싶어한다.

하지만 실제 회사에서 일을 하게 된다면 시간과의 싸움이 되는 게임 개발의 특성상 이러한 신 기능 구현으로 시간을 잡아먹게 되면 예정된 스케쥴에서 늦어지고 말 것이고, 이렇게 되면 회사에 치명적인 영향을 미칠 수도 있다. 새로운 기능을 추가하고 싶지만 기간적인 문제에 걸리게 되기 때문에 이러지도 저러지도 못하는 상황이 벌어지곤 한다.

현재 필자가 참여하고 있는 프로젝트도 곧 클로즈 테스트가 다가오고 있다. 이러한 시점에서 발표된 다이렉트X 9.0이 반드시 달갑지만은 않은데, 결국 필자의 판단은 단순한 포팅 수준을 넘지 못하고 있다. 실제 필자가 참여하고 있는 프로젝트에서 8.0 버전으로 작성된 코드를 9.0 버전으로 포팅해 보았는데 자주 사용하는 인터페이스에서 약간의 변경만 있을 뿐, 큰 변경사항은 없기 때문에 포팅은 일주일이 채 걸리지 않았다. 하지만 새로운 기능을 사용하기 위한 시간을 투입할 수 없었기 때문에 신 기능을 많이 사용하지는 못하고 있다. 하지만 이전 버전보다 사용하기 쉬워진 셰이더 언어 때문에 셰이더를 사용한 부분은 이전에 비해 빠른 작업 진척도를 보이고 있다.

출시 시기에 따라 엇갈린 희비(?)

필자가 현재 열심히 출퇴근하고 있는 회사는 세 가지 프로젝트를 진행 중에 있다. 각각의 프로젝트 출시시기가 다른 만큼 각 팀에서 다이렉트X 9.0을 바라보고 다루는 시각이 각기 다르다. 그렇기 때문에 개발 진척도에 따른 개발팀에서 다이렉트X 9.0에 대한 대응 방향을 가까이서 알아볼 수 있었다.

먼저 곧 출시를 앞둔 패키지 게임 개발팀은 다이렉트X 9.0의 새로운 기능 특히 동영상에 관련된 부분에 대해 관심을 보이고 있지만, 실제로 호환성 문제 등으로 인해 이전 버전인 8.0으로 작업을 계속하고 있다. 필자가 속한 팀은 조금 여유가 있어서 9.0으로 포팅만을 해둔 상태이지만 9.0을 정식 지원하는 하드웨어나 드라이버가 발표되기 전까지는 다이렉트X 9.0의 새로운 기능을 사용하는 것을 보류한 상태이다. HLSL 등의 편리해진 인터페이스만은 조금씩 사용하고 있다. 마지막으로 엔진 작업과 세부기획에 들어간 옆 온라인 팀은 상당히 다이렉트X 9.0의 기능에 충실한 엔진으로 현재 엔진을 개량할 계획을 가지고 있으며 작업을 진행중이다.

현재 출시가 얼마 안 남았거나 이미 서비스 중인 게임들은 다이렉트X 9.0으로의 전향에 상당히 회의적일 것이다. 다이렉트X 9.0이 8.0에 비해 호환성이 떨어지고 모든 기능을 제대로 지원하는 드라이버나 하드웨어가 없기 때문에 섣부른 전향은 위험이 너무 크기 때문이다. 다이렉트X 9.0의 기능을 제대로 사용한 게임이 나올 시기는 올 하반기 이후가 되지 않을까 조심스럽게 예상해 본다.

전환의 기로에 서서

앞에서도 이야기했듯이 이번 버전에서 가장 큰 변경사항은 다이렉트3D에서 디스플레이스먼트 맵, 버텍스 셰이더, 픽셀 셰이더, 이펙트, HLSL 등의 변경일 것이다. 아직 이러한 새로운 기능들을 전부 충족시키는 하드웨어는 극히 드문 상태이고(더군다나 너무 고가이다) 정식 지원하는 드라이버도 제대로 공개되지 않은 상황이라 다이렉트X 9.0의 퍼포먼스를 측정하기에는 이른 감이 있다.

또한 다이렉트X 9.0은 점점 간이엔진과도 같은 수준에 끌어올림으로써 일반 개발사에서 게임의 장르에 따라서는 고가의 게임 엔진을 구입할 필요없이 다이렉트X의 API만으로 사용하여 엔진을 구성해 게임을 만들 수 있을 정도로 다양한 기능을 추가하고 있다. 물론 이렇게 하기 위해서는 다이렉트X에서 제공하는 다양한 익스텐션 함수나 구조체를 연구해야 하겠지만, 기본적으로 제공되는 포맷과 함수를 사용한다면 게임 개발의 기초 단계인 프로토타입 정도는 충분히 개발 가능하리라고 본다.

다이렉트X 9.0의 단점이라면 이른 시기에 발표됨으로써 지원하는 하드웨어가 미비하고 드라이버도 아직 충실히 지원되고 있지 않다는 점, 그리고 초기단계라서 안정화되지 않았고 호환성이 부족하다는 점이 있다. 물론 고차원적인 신기술을 사용하기 위해서는 상당한 고사양을 필요로 하고 있다(어떤 문서에서는 128MB 이상의 비디오 램이 필요하다고 한다). MS의 발표에 의하면 앞으로 2년 정도는 다이렉트X 9.0의 다양한 툴과 지원에만 치중한다고 하니 한동안은 다이렉트X 9.0으로만 작업을 해도 무방할 듯 하다. 현재 게임을 개발중인 개발사들은 다이렉트X 9.0으로의 전환을 심각하게 고려해야 할 시점이라고 생각한다. 다이렉트X 9.0에 대한 분야별 자세한 내용은 이어지는 특집에서 자세히 다룰 것이다. @