티스토리 뷰
현재 모바일 환경에서 게임을 만들기 위해서는 위피(WIPI), SK-VM, GNEX(GVM), 브루(Brew) 등 모바일 컨텐츠 개발 도구를 이용해야 한다. 최근에는 위피를 중심으로 모바일 플랫폼이 통합되어 가고 있는데, 특히 위피 플랫폼을 탑재한 단말기들이 많이 시판될 예정이라 위피 플랫폼 관련 게임들이 대량 출시될 전망이다.
모바일 게임의 개발 추세는 단말기의 성능이 높아짐에 따라 좀 더 빠르고 좋은 그래픽을 기반으로 하는 것으로 진행되고 있다. 특히 넓은 공간감을 제공하는 3D 기반의 게임은 개발자 사이에서 관심이 집중되는 분야가 되고 있다. 3D 컨텐츠는 단말기에 3D 소프트웨어 엔진이 탑재된 지난해부터 바탕화면 아바타나 게임 등으로 활용되기 시작했으며, 올해는 3D 관련 컨텐츠가 더욱 많이 나올 것으로 예상된다.
모바일 게임을 만들어 본 개발자라면 당연히 3D 게임을 만들기 위해 어떠한 툴이 필요한 지 궁금해 할 것이다. 이를 위해 3회에 걸쳐 모바일 3D 게임 제작에서 실제로 사용되고 있는 SDK를 이용한 실전 프로그래밍을 연재하려고 한다.
다만 모바일 3D와 관련된 여러 가지 시장 동향이나 기술 내용들을 상세하게 소개하고 싶어도 현실적인 여건 때문에 만족스러울 만큼 충분히 설명하지 못하는 점은 인정할 수밖에 없다(빠르게 변화되고 있는 모바일 기술과 시장 상황뿐만 아니라 모바일 관련 각 업체들의 중요한 사업 영역이므로 모든 내용을 소개하기는 사실상 어렵다). 따라서 3D와 관련된 제품 정보가 비교적 자세하게 서술되지 못할 수도 있음을 미리 양해해 주기 바란다.
G3 SDK 소개
당연한 말이겠지만 게임을 만들기 위해서는 SDK가 있어야 한다. 모바일 프로그래밍을 해본 독자라면 다운로드 플랫폼에 따라서 SDK가 존재하고, 이를 이용해야만 컨텐츠를 제작할 수 있다는 것을 알고 있을 것이다.
우리가 흔히 알고 있는 플랫폼 중 다운로드 가능한 SDK로는 위피 SDK, SK-VM SDK, 브루 SDK, GNEX SDK 등이 있다. 2월 말 현재 몇몇 SDK에는 3D 모델을 로딩하고 화면에 표시할 수 있는 기능을 추가적으로 제공하는 모듈이 탑재된 것들도 있다. 하지만 이미 퍼져 있는 단말기 환경에서는 성능 문제로 인해 아직까지 만족스러운 속도를 제공하지는 못하고 있다. 그러나 3개 이동통신 사업자들을 중심으로 3D 게임 제작을 위한 확장 API들을 마련하고 있기 때문에 조만간 개발자들에게도 좋은 게임을 제작할 수 있는 환경이 제공되리라 기대한다.
본 연재에서는 이와 같은 현실을 고려해 다운로드 가능한 플랫폼을 위한 SDK가 아니라 성능 최적화가 가능한 임베디드 타입의 게임을 제작할 수 있는 SDK를 이용해 개발 환경을 살펴본다. 현재 고미드가 개발한 G3 SDK는 임베디드 형태의 3D 게임을 제작할 수 있는 SDK로, 실제 임베디드형 3D 게임을 개발하는 데 활용되고 있다.
G3 SDK는 모바일 3D의 표준인 OpenGL ES(OpenGL for Embedded Systems) 1.0을 지원한다. 3D 모델을 로딩하고 모델을 배치하고 카메라 워크를 지원하는 라이브러리를 제공하기 때문에 모바일 3D 게임을 개발하는 데 좋은 환경을 제공한다. 따라서 모바일 3D 표준에 기초한 게임 개발을 수행해 볼 수 있다는 측면에서 의의가 있다고 생각된다. 이번 호에서는 G3 SDK를 이용한 3D 프로그래밍을 시작하기에 앞서 모바일 3D의 응용 분야와 관련 기술에 대해서 간략하게 언급하고자 한다.
모바일 3D 응용 분야
단순한 음성 통화 위주의 이동통신 시장에서 게임이나 바탕화면과 같은 컨텐츠와 브라우저를 통해 접속하는 무선 컨텐츠는 이미 좋은 수익 모델을 제공해주고 있다. 또한 기존 컨텐츠 시장의 경쟁이 심해지고 컬러폰이나 카메라폰 등 융합형 고성능 휴대 단말기가 대중화됨에 따라 고성능 단말기에 적합한 차별된 고급 컨텐츠가 요구되고 있다.
고성능 휴대 단말기가 갖춰야 할 새로운 기능들은 메가픽셀 카메라, MPEG4 동영상, 그리고 3D 지원 등이라 할 수 있다. 이러한 시장 상황에 맞춰 현재 다양한 칩 제조사, 단말기 제조사, 이동통신사들이 모두 이러한 서비스를 준비하고 있다. 이 중에서 모바일 3D 기능을 이용한 서비스 응용 분야는 [그림 1]처럼 3D 바탕화면 서비스, 3D 게임, 3D UI 등이 현재 서비스 가능한 범주에 있다.
3D 바탕화면 서비스
휴대폰에서 가장 쉽게 확인할 수 있는 컨텐츠가 바로 바탕화면이다. 초기엔 2D 이미지를 중심으로 적용되다가 최근에는 다운로드 플랫폼에서 제작된 응용 프로그램으로도 적용할 수 있도록 변경되었다. 이러한 변화는 단순한 형태의 바탕화면이 아니라 좀 더 다이내믹한 이미지의 바탕화면을 요구하는 사용자들의 수요가 많아졌다는 것을 의미한다. 이러한 측면에서 기존의 2D 이미지가 아닌 3D 아바타가 춤추고 감정을 표현해 좀 더 현실감이 있고, 개성 있는 바탕화면을 꾸밀 수 있는 서비스를 생각할 수 있다.
3D 바탕화면 서비스는 현재 KTF의 최신 단말기인 LG-KV1400 모델을 통해 서비스되고 있다. KTF ‘매직엔(Magicⓝ)’에서 ‘3D 그림나라’ 서비스로 제공되는 이 서비스는 캐릭터, 애니메이션, 바탕 그림 등을 변경해 가면서 사용자가 원하는 3D 캐릭터, 배경, 애니메이션을 선택, 조합해 자신만의 화면을 구성할 수 있다.
이런 서비스는 아직까지 LG전자와 삼성전자 단말기를 통해 KTF와 SK텔레콤 서비스에서만 가능하지만 앞으로 다양한 단말기 제조사의 제품과 이동통신 서비스로도 제공될 것으로 예상된다. 뿐만 아니라 다양한 형태의 응용이 가능하기 때문에 앞으로 더 재미있는 바탕화면 서비스도 기대해 본다.
모바일 3D 게임
모바일 3D 게임은 크게 다운로드형 게임, 임베디드형 게임, PDA 또는 콘솔 게임기 형태로 나눌 수 있다. 다운로드형 게임은 다운로드 플랫폼을 이용해 개발된 게임으로, 여러 단말기에서 다운로드해 게임을 즐길 수 있으나 이를 위해서는 3D 엔진이 소프트웨어적으로 구현되어야 이용할 수 있다(하지만 사용자들이 갖고 있는 대부분의 단말기가 성능이 낮은 CPU를 기반으로 사용되고 있기 때문에 실제로는 최신 휴대폰을 가지고 있어야 3D 효과를 내는 게임들을 이용해 볼 수 있다).
임베디드형 게임으로는 휴대폰이 출시될 때 함께 탑재되어 제공되는 게임으로 다운로드형 게임에 비해 단말기에 최적화된 형태로 게임이 제공될 수 있다. PDA 또는 콘솔 게임기 형태의 게임은 실제 PDA 또는 노키아의 N-Gage 등에서 동작하는 게임이다.
현재 3D 게임이 많이 만들어지지 않고 있는 이유는 마땅히 컨텐츠를 제작할 만한 단말기가 없다는 이유가 가장 크며, 또 다른 이유는 개발 여건이 아직까지 좋지 않기 때문이다. 일단 3D 성능이 뛰어난 단말기가 시장에 많이 풀리면 3D 게임 역시 증가할 것으로 생각된다. 국내의 경우엔 일부 단말기에 3D 게임이 적용되었으나 아직까지 일반화되는 추세는 아니다. 조만간 좀 더 좋은 3D 게임을 즐길 수 있는 단말기가 출시될 것으로 기대하고 있다.
일본의 경우 Hi-Corp라는 회사의 3D 소프트웨어 엔진이 탑재된 폰이 많이 출시돼 있다. 다양한 게임 컨텐츠가 있지만 소프트웨어 엔진 기반이기 때문에 주로 엉성하고 어설픈 형태로 제작되어 있다. 유럽 수출 모델에서는 노키아와 같은 N-Gage 게임형 단말기에 몇 가지 3D 컨텐츠를 제공하고 있는데, 이 제품은 닌텐도의 휴대용 게임기 ‘게임보이’를 벤치마킹한 제품이다. 이동통신/스마트폰용 OS인 심비안(Symbian) OS를 탑재하였으며, 3D 게임으로는 모토 레이서, 툼 레이더 등이 있다.
유럽의 경우 모바일 게임을 제작하기 위한 플랫폼으로 J2ME를 가장 많이 사용한다. J2ME 환경에서 3D 게임을 제작하려면 JSR184 표준 규격이 추가로 제공되어야 한다. 유럽은 휴대폰의 특성이나 규격이 단말기 제조사 중심으로 제작되기 때문에 이동통신 사업자가 주도하는 우리나라처럼 다운로드 형태가 아니라 외부 저장장치를 통해 컨텐츠 공급이 가능하다. 따라서 J2ME 환경 이외에 몇 가지 독자적인 환경도 존재한다. N-Gage의 경우는 심비안 운영체제 위에 Fathammer의 X-Forge를 적용했으며, 이밖에 Synergenix Interactive의 Mophun, In-Fusio의 ExEn (Excution Engine) 등이 있다.
3D 그래픽 사용자 인터페이스
바탕화면 다음으로 많이 사용하는 것이 휴대폰에 적용 가능한 3D 응용으로 그래픽 사용자 인터페이스(GUI) 부분을 꼽을 수 있다. 보통 휴대폰의 메뉴는 대부분 단말기 제조사의 특성에 따라 다양한 형태로 제작되는데 여기에 3D 형태의 메뉴를 삽입하면 사용자에게 좋은 시각 효과를 제공할 수 있다.
하지만 모든 GUI를 3D로 변경하려면 리소스의 부담이 크고 디자인 비용도 많이 들기 때문에 당장 적용되기에는 무리가 따른다. 또한 2D 이미지를 이용해도 어느 정도 3D 효과를 나타낼 수 있기 때문에 이에 대해서는 기술적 측면과 UI의 디자인 측면에서 모두 시간과 노력이 필요할 것으로 보인다.
하드웨어 가속기
소프트웨어 엔진에 비해 더 높은 성능을 낼 수 있는 하드웨어 가속기는 그 형태가 매우 다양하다. 일단 알려진 하드웨어 가속기에 대해 알아보면 퀄컴의 Q3D, 네오매직의 MiMagic6, 매직아이의 VRender3D, ATI의 Imageon 2300, Sanshin Electronics의 GShark plus 등이 있다. 자세한 성능이나 스펙에 대한 사항은 각 제조사의 홈페이지를 통해 자세히 알아볼 수 있으므로 여기서는 간단한 특성만 살펴 본다.
퀄컴 Q3D
퀄컴의 MSM6100 계열부터 Q3D라는 하드웨어 엔진이 포함돼 제공되고 있으며, OpenGL ES 표준을 지원하는 형태라고 한다. 속도는 초당 약 10만 폴리곤으로 알려져 있으며, 실제로 이를 이용하기 위해서는 몇 가지 추가적인 코드들을 함께 적용시켜야 하기 때문에 단말기 제조사에서 이를 이용하려는 움직임이 그렇게 높지 않은 편이다.
네오매직 MiMagic6
네오매직 역시 3D 가속기를 장착한 모바일 칩인 MiMagic6을 개발 중에 있다. ARM926EJ 코어를 바탕으로 APA 기반의 멀티미디어 엔진을 통해서 OpenGL ES 규격을 만족하도록 구성한 칩이다.
매직아이 VRender3D
매직아이의 VRender3D는 ARM920T 코어를 바탕으로 3D 그래픽 엔진과 MPEG4 엔진을 내장하고 있는 칩으로 현재 다이렉트3D 형태의 3D API를 제공하고 있다.
ATI Imageon 2300
PC용 그래픽 가속 칩을 제작하는 회사인 ATI는 PDA나 휴대폰에 적합한 형태의 가속 칩인 Imageon 2300을 출시하였다. 이 칩은 CPU가 없는 순수 가속 칩으로 OpenGL ES 규격을 만족하는 칩이다.
GShark plus
일본 업체인 Sanshin Electronics의 GShark plus는 독자적인 규격의 3D 엔진으로 ATI 제품과 마찬가지로 CPU가 없는 순수 가속 칩이다.
모바일 3D 표준 동향
최근 모바일 3D 관련 업계들의 화두는 국제 공개 표준으로 부각되고 있는 OpenGL ES이다. 현재 국내외 이동통신사, 단말기/칩 제조사, 3D 엔진 개발사 등 거의 대부분 회사들이 OpenGL ES를 수용해 제품을 개발하고 있다. 지난 해 7월 모바일 시스템용 그래픽 인터페이스 개발 동맹인 ‘크로노스 그룹(Khronos Group)’이 OpenGL ES Ver 1.0을 비준한 이래 세계의 주요 칩셋/코어, 소프트웨어 개발 업체들이 줄이어 이 그룹의 멤버로 참여하고 있다.
한국에서는 SK텔레콤, 고미드를 비롯해 몇몇 업체가 회원사로 활동하고 있다(KTF 역시 2003년 OpenGL ES를 포함하고 있는 고미드의 3D 엔진을 표준 엔진으로 선정하였다). 이에 따라 휴대폰 제조사는 OpenGL ES를 수용하도록 제품을 개발하고 있으며, 앞으로 이러한 추세는 큰 변화가 없을 것으로 보인다.
모바일 3D의 공개 표준, OpenGL ES
OpenGL ES는 [그림 2]에서 보는 것처럼 크로노스 그룹에서 주관하는 OpenGL의 임베디드 시스템 버전으로, 휴대용 단말기나 기기의 임베디드 디스플레이보다 향상된 2D/3D 그래픽 성능을 제공하기 위해 무료로 배포되는 낮은 레벨의 경량 API이다.
OpenGL을 기반으로 하되 사용빈도가 낮거나 불필요한 부분을 제거한 OpenGL 1.3의 서브셋(subset)으로, SW 애플리케이션과 HW/SW 그래픽 엔진간 초경량의 API를 제공한다. 버전 1.0 스펙은 Common(핸드셋과 같은 최소화된 모바일 디바이스에 사용 가능), Common-Lite(PDA나 셋톱박스 같은 디바이스에 사용 가능) 렌더러와 네이티브 플랫폼 윈도우 시스템과 연결해주는 EGL 등을 포함하고 있다.
이러한 임베디드 시스템을 위한 표준 API는 모든 메이저급 모바일/임베디드 플랫폼에서 다양한 3D 그래픽과 게임 제공을 용이하게 해주며, 애플리케이션 개발에 대해 다음과 같은 다양한 편의성을 제공한다.
Common profile과 더 작은 메모리가 할당된 플랫폼을 위한 Command-Lite profile로 나뉘어져 있으며, 핵심판(core addition)과 확장판(extension)을 통해 더 많은 기능을 추가적으로 제공할 수 있도록 구성되어 있다. OpenGL 2.0의 서브셋이기 때문에 OpenGL의 장점은 유지한 상태에서 모바일 환경에 요구되는 기능만을 제공하도록 고안돼 있다.
OpenGL ES는 일종의 표준 인터페이스이므로 실제 코드는 3D 엔진 업체들이 제작해야 하는 부분이다. 이 부분은 소프트웨어 또는 하드웨어로 구현해야만 한다. 현재 소프트웨어로 구현된 것들은 시장에 나와 있는 제품도 많이 있으나, 아직 하드웨어로 구현된 제품은 그 수가 적은 편이다.
크로노스 그룹은 OpenGL ES 외에도 오디오, 비디오처럼 미디어와 관련된 OpenML을 함께 표준화하고 있다. 하지만 아직까지 국내에서는 이와 관련된 특별한 활동은 미미하다.
임베디드 그래픽 라이브러리
OpenGL-ES는 EGL(Embedded Graphic Library)이라는 공용 플랫폼 인터페이스 레이어를 포함하고 있는데, EGL은 플랫폼이나 운영체제와 상관없이 그래픽 작업을 사용할 수 있게 도와주는 것이다. 즉 플랫폼이나 운영체제가 다른 환경에서 작동하고 있는 렌더링 엔진에서도 원하는 그래픽 작업을 할 수 있도록 함수들을 지원해 주는 역할을 한다.
실제로 OpenGL ES를 기반으로 EGL을 이용해 모바일 환경에서 상위 레벨의 3D 그래픽 API 프로그램을 작성한다면 [그림 3]처럼 나타낼 수 있다. 이 그림은 자바 환경의 모바일 3D JSR184의 동작 방식을 설명하고 있다.
GSM 시장에서 주목받는 JSR184
최근 OpenGL-ES와 더불어 주목받고 있는 것이 JSR-184이다. GSM은 유럽을 중심으로 미국과 중국 등 전 세계 이동통신 시장의 70%를 차지하고 있다. 이처럼 GSM 시장을 예의 주시하는 칩, 단말기, 컨텐츠 등 관련 업체들은 자신들의 제품을 차별화하기 위해 속속 3D를 도입하고 있으며, 이를 위해 대부분의 GSM 폰이 채용하고 있는 자바 환경에 최적화된 3D 그래픽 API를 필요로 하게 되었다. 이러한 필요를 충족시키기 위해 제정된 것이 J2ME를 위한 표준 3D 그래픽 API인 JSR-184이다.
J2ME 환경에서 3차원 그래픽을 구현하기 위해 낮은 레벨(low-level)인 OpenGL을 이용할 경우 코드가 길어져 MIDlet(MIDP Application)의 덩치가 커지므로 속도가 느려질 수밖에 없다. 또한 자바 3D API를 이용할 경우엔 스펙의 양이 너무 방대하기 때문에 역시 MIDP(Mobile Information Device Profile)을 이용하기엔 적합하지 않다.
이러한 단점을 보완하기 위해 제안된 JSR 184는 J2ME를 위한 표준 3D 그래픽 API로서, 객체지향적 언어인 자바의 특성을 이어받아 오브젝트의 재사용과 공유를 원칙으로 한다. OpenGL ES와 JSR 184에서 사용되는 그래픽 개념이나 단계적 절차는 [그림 4]와 같이 동일하나 다만 표현하는 방식에서 차이를 보인다.
OpenGL ES와 JSR184의 비교는 OpenGL과 자바 3D를 비교하는 것과 유사한 관점에서 설명할 수 있다. 즉 OpenGL이 3D 그래픽의 기본적인 기능을 제공하는 데 비해 자바 3D는 상위 레벨까지 기능을 제공하는 것과 마찬가지로 OpenGL ES는 모바일 환경에 적합한 3D 그래픽의 기본적인 기능을 제공하는 것이라면 JSR184는 J2ME 환경에서 모바일 3D를 지원할 수 있도록 만든 상위 레벨의 패키지라고 할 수 있다.
국내 이동통신 사업자의 3D 표준
SK텔레콤은 자체적으로 3D 엔진을 탑재한 GIGA(Graphic Instruction Graphic Acceleration) 단말기 규격을 통해 3D 표준을 지정하였다. 여기에는 OpenGL ES API와 함께 자체적인 3D 관련 API들이 포함되어 있으며 계속 업그레이드되고 있다. KTF는 OpenGL ES 규격을 포함하고 있는 고미드의 3D 엔진을 표준으로 지정하였고, 애플리케이션을 위한 상위 레벨 API에 대한 표준을 마련하고 있다.
G3 SDK를 이용한 프로그래밍
G3 SDK는 게임 개발자가 특별한 하드웨어 장치 없이 임베디드형 게임 소프트웨어를 PC에서 개발할 수 있는 환경을 제공하기 위한 목적으로 제작된 소프트웨어 개발 도구이다. 따라서 모바일 3D에 관심 있는 사람이라면 누구나 쉽게 모바일 3D 프로그래밍이 가능하도록 해준다. G3 SDK의 구조와 간단한 예제를 알아보자.
G3 SDK의 구조
G3 SDK에 탑재된 3D 엔진은 OpenGL ES 1.0과 호환은 물론 모델 및 애니메이션 데이터 로딩과 본 애니메이션 등과 같은 진보된 형태의 기능을 제공함으로써 개발자에게 고급 게임을 개발할 수 있는 환경을 지원한다.
G3 SDK는 [그림 5]와 같은 API들로 구성되며, 각 API들은 게임 개발자들에게 유용한 기능을 지원한다. API의 종류와 각 API의 역할은 <표 3>과 같다. G3 SDK의 자세한 내용은 개발자 사이트(http://g3d.co.kr)에서 회원 가입한 후 SDK를 다운받아 설치해 보면 확인할 수 있다. 이 API들의 실제 구현은 단말기의 하드웨어와 소프트웨어 환경에 따라 달라질 수 있겠지만 게임 개발자들이 이렇게 구현까지 신경 쓸 필요는 없을 것이다.
G3 SDK는 기본적으로 PC 환경에서 VC++를 이용해 DLL 파일을 생성한다. 생성된 DLL 파일은 에뮬레이터에서 로딩되어 동작하게 된다. 에뮬레이터 상에서의 동작은 모바일 단말기에서도 동일하게 동작하도록 구성되어 있으므로 에뮬레이터를 통해 디버깅 과정을 거치면서 윈도우 개발 환경에서 게임 프로그램을 완성할 수 있게 된다. <그림 6>은 최종적으로 타겟 바이너리를 생성하기 위한 개발 과정을 나타내고 있으며 디버깅이 완료된 게임의 경우 타겟 단말기용 컴파일러를 이용해 컴파일하면 최종적인 타겟 바이너리가 생성된다.
G3 SDK를 이용해 개발된 게임 소프트웨어는 [그림 6]의 과정을 거쳐 최종적으로 G3 SDK 라이브러리가 탑재된 모바일 기기에서 동작할 수 있게 되는 것이다. G3 SDK 설치시 제공되는 ‘G3 게임 마법사’를 통해 게임 개발을 위한 템플릿 소스를 VC++ 환경에서 쉽고 빠르게 만들 수 있다.
3D 그래픽 예제
G3 SDK는 3D 게임을 지원하기 위한 하위 레벨 API와 상위 레벨 API를 제공한다. 하위 레벨 API는 OpenGL ES 1.0에 호환되는 형태로 제공되고, 상위 레벨 API는 3D 모델, 에니메이션 로더, 에니메이션 엔진, 각종 3D 이펙트 처리 유틸리티 API로 구성되어 있다.
먼저 3D 프로그래밍을 하려면 [화면 1]과 같이 G3_3Dg.lib과 gl.lib을 링크시켜야 하고 gl.h와 G3_3Dg.h를 인클루드(include)시켜야 한다. 그리고 다른 실행 파일과 마찬가지로 G3_3Dg.dll과 g3.dll이 있어야 한다. 여기서는 3D 그래픽스의 기초 이론을 알고 있다고 가정한 상태에서 예제를 중심으로 G3 SDK를 사용해서 어떻게 3D 그래픽스를 그릴 것인지에 대해서 예제를 중심으로 기술하도록 하겠다. 이 예제는 OpenGL ES 1.0의 하위 레벨 API를 사용해서 피라미드 형태의 객체를 통해 3차원 공간에서 RGB 컬러 값을 표시하는 예이다.
[리스트 1-1]은 G3 SDK를 사용해서 어떻게 3D 프로그래밍을 하는지 보여주고 있다. 먼저 3D 함수를 이용하려면 gl.h 헤더 파일을 인클루드시켜야 한다. 그리고 2D에서의 작업과 같이 G3_LcdSurfaceGet() 함수로 LCD 화면과 대응되는 가상 프레임 버퍼를 얻게 되며, 그 후 생성된 표면 버퍼를 G3_SurfaceSet() 함수를 이용해 LCD 화면에 설정한다.
3D 그래픽스의 사용을 위해서는 초기 설정을 해야 한다. ResizeGLScene() 함수와 InitGL() 함수를 통해서 3D 그래픽스 관련 초기화 작업을 한다([리스트 1-2]).
ResizeGLScene() 함수에서는 3D 작업을 위한 영역의 생성, 뷰포트 설정, 프로젝션 관련 설정 등을 하게 된다. glCreate() 함수를 사용해 3D 작업 영역을 생성하고, glViewport() 함수를 사용해서 실제 LCD와 사상되는 뷰포트를 설정한다. glPerspective() 함수를 통해 프로젝션 매트릭스에 대한 설정을 한다. [리스트 1-2]에서 작업된 내용을 살펴보면 너비를 width로 하고, 그 높이를 height로 하는 그리기 영역이 생성되며, 뷰포트의 크기는 그리기 영역의 크기와 동일하고, 표현될 3D 오브젝트들은 원근법 기반으로 그려지는 설정을 한 것이 된다.
InitGL() 함수에서는 GL을 통해서 그리고자 하는 좀 더 세밀한 설정을 하게 되는데, 그 내용을 살펴보자. glShadeModel() 함수를 통해서 셰이딩을 어떻게 할 것인지 설정한다. G3 SDK에서는 평평한 셰이딩(GL_FLAT)과 부드러운 셰이딩(GL_SMOOTH)이 제공된다. 다음으로 glClearColor() 함수를 통해서 생성된 화면의 초기 배경색을 설정한다. glClearColor()의 첫 번째 인자는 R값, 두 번째 인자는 G값, 세 번째 인자는 B값을 나타내며 마지막 인자는 알파(alpha) 값이다. 그 다음의 세 라인은 깊이 버퍼(depth buffer)와 관련된 것이다.
지금까지 ResizeGLScene() 함수와 InitGL() 함수를 통해 3D 그래픽스를 사용하기 위한 초기 설정을 완료했다. 따라서 3D 객체를 그릴 수 있는 환경이 되었다. 이제부터 실제로 3D객체가 어떻게 그려지는지 살펴보자([리스트 1-3]).
먼저 glMatrixMode() 함수를 통해서 모델뷰 행렬을 선택한 뒤 glLoadIdentity 함수로 매트릭스를 초기화시킨다. glClear() 함수를 사용해서 컬러 버퍼(GL_COLOR_BUFFER_BIT)와 깊이 버퍼(GL_DEPTH_BUFFER_BIT)를 비운 다음 glTranslatef() 함수로 물체를 그릴 위치로 이동하며, glRotatef() 함수를 통해 3D 객체가 Y축과 X축을 기준으로 회전할 수 있도록 하였다.
본 예제에서 그려지는 3D 객체는 3차원 피라미드의 형태를 가지는데, 삼각형을 이용해서 피라미드의 면을 설정하고 삼각형의 꼭지점마다 정점이 가지는 색을 설정했다. 그리고 정점들을 기술하는 방법은 3차원 데카르트 좌표계를 사용해서 표현했다. OpenGL ES에서 사용되는 3차원 데카르트 좌표계는 z축의 방향이 반대가 되는 것을 고려하면 별 무리 없이 사용할 수 있다.
삼각형을 그리는 부분이 모두 4개로 되어 있는데 일단 종이를 준비해서 각 정점을 종이에 순서대로 찍어보고 그 정점을 반시계 방향으로 순서대로 이어보자. 삼각형이 그려질 것이다. 이런 식으로 4개의 삼각형이 모여 [그림 7]에서 보는 바와 같은 객체가 생성된다. 3D 공간에 객체에 대한 기술이 끝나면 G3_3DTransBlt() 함수를 사용해 버퍼에 그린 객체를 LCD에 뿌려주면 LCD 화면에 3D 객체가 표현된다. 예제를 실행한 화면은 [그림 7]과 같다.
본 애니메이션 예제
[그림 8]는 이미 만들어진 3D 모델과 3D 애니메이션 정보를 읽어서 G3 API 함수를 사용해 동작하는 프로그램이다. 3D 모델의 생성과 3D 애니메이션을 생성하는 것은 G3 SDK의 ‘G3 Character Design Guide’ 문서를 참조하기 바란다. G3 SDK에서는 Skinned Bone Animation을 지원한다(Skinned Bone Animation은 계산이 용이한 뼈대의 움직임을 기준으로 상대적인 값으로 스킨 메시를 변형시키는 애니메이션 방법을 말한다).
먼저 3D 함수를 이용하려면 gl.h 헤더 파일을 인클루드시켜야 한다. 다음으로 G3_LcdSurfaceGet() 함수의 호출을 통해서 LCD 화면과 대응되는 가상 프레임 버퍼를 얻게 되며, 그 후 생성된 표면 버퍼를 G3_SurfaceSet() 함수를 이용해 LCD 화면에 설정한다.
LCD 화면 사용에 대한 초기화가 끝나면 InitGame() 함수를 통해서 필요한 정보를 초기화한다. InitGame()은 glCreate() 함수를 통해 사용되는 GL 윈도우를 생성하고, G3_3DgCreate() 함수를 통해 사용할 아바타를 생성하고, gAddObjectMeshFromeFile() 함수를 통해 아바타를 로딩하고, gAddObjectAnimFromFile() 함수를 통해 아바타 애니메이션을 로딩하고, G3_3DgSetAvatarPosition() 함수를 통해 아바타의 위치를 설정하고, G3_3DgGetSkinnedMeshBBox() 함수를 사용해 지정된 아바타 객체의 바운딩 정보를 설정하는 등 아바타 애니메이션에 대한 모듈의 초기화를 수행한다. 그 내용을 보면 [리스트 2-2]와 같다
gAddObjectMeshFromFile() 함수는 G3 SDK가 제공하는 파일 입출력을 통해 모델 데이터를 읽어온 후 읽어온 데이터를 G3_3DgAddSkinnedMeshToAvatar() 함수를 사용해서 아바타에 설정하는 부분이다.
gAddObjectAnimFromFile() 함수는 G3 SDK가 제공하는 파일 입출력을 통해 모델의 애니메이션 데이터를 읽어온 후 G3_3DgAddBoneAnimToAvatar() 함수를 사용해서 지정된 ID에 해당하는 아바타에 애니메이션을 추가하고 지정한다. G3_3DgPalyAvatarAnim() 함수를 통해서 애니메이션을 실행하며, G3_3DgRepeatAvatarAnim() 함수를 사용해서 지정된 애니메이션의 반복 횟수를 지정한다.
데이터에 대한 작업이 끝나면 3D 그래픽스 사용을 위해 ResizeGLScene() 함수와 InitGL() 함수를 사용해서 3D 그래픽스 관련 초기화 작업을 한다([리스트 2-4]).
ResizeGLScene() 함수에서는 3D 작업을 위한 영역의 생성, 뷰포트 설정, 프로젝션 관련 설정 등을 하게 된다. glCreate() 함수를 사용해 3D 작업 영역을 생성하고, glViewport() 함수를 사용해서 실제 LCD와 사상되는 뷰포트를 설정한다. glPerspective() 함수를 통해 프로젝션 매트릭스에 대한 설정을 한다. [리스트 2-4]에서 작업된 내용을 살펴보면 너비를 width로, 높이를 height로 하는 그리기 영역이 생성되며, 뷰포트의 크기는 그리기 영역의 크기와 동일하고, 표현될 3D 오브젝트들은 원근법에 근간해서 그려지는 설정을 한 것이 된다.
InitGL() 함수에서는 GL을 통해서 그리고자 하는 좀 더 세밀한 설정을 하게 되는데, 그 내용을 살펴보자. glShadeModel() 함수를 통해 셰이딩을 어떻게 할 것인지 설정한다. G3 SDK에서는 평평한 셰이딩(GL_FLAT)과 부드러운 셰이딩(GL_SMOOTH)이 제공된다. 다음으로 glClearColor() 함수를 통해서 생성된 화면의 초기 배경색을 설정한다. glClearColor()의 첫 번째 인자는 R값, 두 번째 인자는 G값, 세 번째 인자는 B값을 나타내며 마지막 인자는 알파 값이다. 그 다음 세 라인은 깊이 버퍼와 관련된 것이다.
SyncFrame()은 3D 그래픽스가 그려지는 총 프레임 갱신 비율을 제어하는 함수로, 100ms마다 한번씩 그리도록 설정되어 있다. 프레임 갱신 비율을 바꾸기 위해서는 <리스트 2-5>의 ?에 설정된 값 100을 변경해주면 된다. 결국 본 예제에서는 100으로 설정되어 있기 때문에 10fps로 프레임이 제어되는 것을 의미한다.
이상으로 아바타 애니메이션에 위한 초기화 단계가 끝났다. 이제 실제 매 프레임마다 아바타를 어떻게 움직이는가에 대해서 UpdateGame() 함수를 통해서 알아 볼 것이다.
UpdateGame() 함수는 G3_3DgUpdateAvatar() 함수를 통해 게임 내부 정보를 아바타 단위로 갱신한다. 애니메이션이 구동될 때에는 정점 단위의 변형(deformation)을 수행해 그려질 정점 정보의 원형을 구성한다. 이렇게 한 뒤 G3_3DgTransformAvatar() 함수를 통해 지정된 아바타를 외부 변환 정보에 의해 정해진 위치로 변환시킨다. 변환은 회전과 이동을 포함한다. 새로운 위치로 변환된 아바타는 G3_3DgDrawAvatar() 함수를 사용해서 그려지게 된다.
모바일 게임의 개발 추세는 단말기의 성능이 높아짐에 따라 좀 더 빠르고 좋은 그래픽을 기반으로 하는 것으로 진행되고 있다. 특히 넓은 공간감을 제공하는 3D 기반의 게임은 개발자 사이에서 관심이 집중되는 분야가 되고 있다. 3D 컨텐츠는 단말기에 3D 소프트웨어 엔진이 탑재된 지난해부터 바탕화면 아바타나 게임 등으로 활용되기 시작했으며, 올해는 3D 관련 컨텐츠가 더욱 많이 나올 것으로 예상된다.
모바일 게임을 만들어 본 개발자라면 당연히 3D 게임을 만들기 위해 어떠한 툴이 필요한 지 궁금해 할 것이다. 이를 위해 3회에 걸쳐 모바일 3D 게임 제작에서 실제로 사용되고 있는 SDK를 이용한 실전 프로그래밍을 연재하려고 한다.
다만 모바일 3D와 관련된 여러 가지 시장 동향이나 기술 내용들을 상세하게 소개하고 싶어도 현실적인 여건 때문에 만족스러울 만큼 충분히 설명하지 못하는 점은 인정할 수밖에 없다(빠르게 변화되고 있는 모바일 기술과 시장 상황뿐만 아니라 모바일 관련 각 업체들의 중요한 사업 영역이므로 모든 내용을 소개하기는 사실상 어렵다). 따라서 3D와 관련된 제품 정보가 비교적 자세하게 서술되지 못할 수도 있음을 미리 양해해 주기 바란다.
G3 SDK 소개
당연한 말이겠지만 게임을 만들기 위해서는 SDK가 있어야 한다. 모바일 프로그래밍을 해본 독자라면 다운로드 플랫폼에 따라서 SDK가 존재하고, 이를 이용해야만 컨텐츠를 제작할 수 있다는 것을 알고 있을 것이다.
우리가 흔히 알고 있는 플랫폼 중 다운로드 가능한 SDK로는 위피 SDK, SK-VM SDK, 브루 SDK, GNEX SDK 등이 있다. 2월 말 현재 몇몇 SDK에는 3D 모델을 로딩하고 화면에 표시할 수 있는 기능을 추가적으로 제공하는 모듈이 탑재된 것들도 있다. 하지만 이미 퍼져 있는 단말기 환경에서는 성능 문제로 인해 아직까지 만족스러운 속도를 제공하지는 못하고 있다. 그러나 3개 이동통신 사업자들을 중심으로 3D 게임 제작을 위한 확장 API들을 마련하고 있기 때문에 조만간 개발자들에게도 좋은 게임을 제작할 수 있는 환경이 제공되리라 기대한다.
본 연재에서는 이와 같은 현실을 고려해 다운로드 가능한 플랫폼을 위한 SDK가 아니라 성능 최적화가 가능한 임베디드 타입의 게임을 제작할 수 있는 SDK를 이용해 개발 환경을 살펴본다. 현재 고미드가 개발한 G3 SDK는 임베디드 형태의 3D 게임을 제작할 수 있는 SDK로, 실제 임베디드형 3D 게임을 개발하는 데 활용되고 있다.
G3 SDK는 모바일 3D의 표준인 OpenGL ES(OpenGL for Embedded Systems) 1.0을 지원한다. 3D 모델을 로딩하고 모델을 배치하고 카메라 워크를 지원하는 라이브러리를 제공하기 때문에 모바일 3D 게임을 개발하는 데 좋은 환경을 제공한다. 따라서 모바일 3D 표준에 기초한 게임 개발을 수행해 볼 수 있다는 측면에서 의의가 있다고 생각된다. 이번 호에서는 G3 SDK를 이용한 3D 프로그래밍을 시작하기에 앞서 모바일 3D의 응용 분야와 관련 기술에 대해서 간략하게 언급하고자 한다.
모바일 3D 응용 분야
단순한 음성 통화 위주의 이동통신 시장에서 게임이나 바탕화면과 같은 컨텐츠와 브라우저를 통해 접속하는 무선 컨텐츠는 이미 좋은 수익 모델을 제공해주고 있다. 또한 기존 컨텐츠 시장의 경쟁이 심해지고 컬러폰이나 카메라폰 등 융합형 고성능 휴대 단말기가 대중화됨에 따라 고성능 단말기에 적합한 차별된 고급 컨텐츠가 요구되고 있다.
고성능 휴대 단말기가 갖춰야 할 새로운 기능들은 메가픽셀 카메라, MPEG4 동영상, 그리고 3D 지원 등이라 할 수 있다. 이러한 시장 상황에 맞춰 현재 다양한 칩 제조사, 단말기 제조사, 이동통신사들이 모두 이러한 서비스를 준비하고 있다. 이 중에서 모바일 3D 기능을 이용한 서비스 응용 분야는 [그림 1]처럼 3D 바탕화면 서비스, 3D 게임, 3D UI 등이 현재 서비스 가능한 범주에 있다.
[그림 1] 모바일 3D 응용 분야 |
3D 바탕화면 서비스
휴대폰에서 가장 쉽게 확인할 수 있는 컨텐츠가 바로 바탕화면이다. 초기엔 2D 이미지를 중심으로 적용되다가 최근에는 다운로드 플랫폼에서 제작된 응용 프로그램으로도 적용할 수 있도록 변경되었다. 이러한 변화는 단순한 형태의 바탕화면이 아니라 좀 더 다이내믹한 이미지의 바탕화면을 요구하는 사용자들의 수요가 많아졌다는 것을 의미한다. 이러한 측면에서 기존의 2D 이미지가 아닌 3D 아바타가 춤추고 감정을 표현해 좀 더 현실감이 있고, 개성 있는 바탕화면을 꾸밀 수 있는 서비스를 생각할 수 있다.
3D 바탕화면 서비스는 현재 KTF의 최신 단말기인 LG-KV1400 모델을 통해 서비스되고 있다. KTF ‘매직엔(Magicⓝ)’에서 ‘3D 그림나라’ 서비스로 제공되는 이 서비스는 캐릭터, 애니메이션, 바탕 그림 등을 변경해 가면서 사용자가 원하는 3D 캐릭터, 배경, 애니메이션을 선택, 조합해 자신만의 화면을 구성할 수 있다.
이런 서비스는 아직까지 LG전자와 삼성전자 단말기를 통해 KTF와 SK텔레콤 서비스에서만 가능하지만 앞으로 다양한 단말기 제조사의 제품과 이동통신 서비스로도 제공될 것으로 예상된다. 뿐만 아니라 다양한 형태의 응용이 가능하기 때문에 앞으로 더 재미있는 바탕화면 서비스도 기대해 본다.
| ||||||||||||||||
| ||||||||||||||||
모바일 3D 게임
모바일 3D 게임은 크게 다운로드형 게임, 임베디드형 게임, PDA 또는 콘솔 게임기 형태로 나눌 수 있다. 다운로드형 게임은 다운로드 플랫폼을 이용해 개발된 게임으로, 여러 단말기에서 다운로드해 게임을 즐길 수 있으나 이를 위해서는 3D 엔진이 소프트웨어적으로 구현되어야 이용할 수 있다(하지만 사용자들이 갖고 있는 대부분의 단말기가 성능이 낮은 CPU를 기반으로 사용되고 있기 때문에 실제로는 최신 휴대폰을 가지고 있어야 3D 효과를 내는 게임들을 이용해 볼 수 있다).
임베디드형 게임으로는 휴대폰이 출시될 때 함께 탑재되어 제공되는 게임으로 다운로드형 게임에 비해 단말기에 최적화된 형태로 게임이 제공될 수 있다. PDA 또는 콘솔 게임기 형태의 게임은 실제 PDA 또는 노키아의 N-Gage 등에서 동작하는 게임이다.
현재 3D 게임이 많이 만들어지지 않고 있는 이유는 마땅히 컨텐츠를 제작할 만한 단말기가 없다는 이유가 가장 크며, 또 다른 이유는 개발 여건이 아직까지 좋지 않기 때문이다. 일단 3D 성능이 뛰어난 단말기가 시장에 많이 풀리면 3D 게임 역시 증가할 것으로 생각된다. 국내의 경우엔 일부 단말기에 3D 게임이 적용되었으나 아직까지 일반화되는 추세는 아니다. 조만간 좀 더 좋은 3D 게임을 즐길 수 있는 단말기가 출시될 것으로 기대하고 있다.
일본의 경우 Hi-Corp라는 회사의 3D 소프트웨어 엔진이 탑재된 폰이 많이 출시돼 있다. 다양한 게임 컨텐츠가 있지만 소프트웨어 엔진 기반이기 때문에 주로 엉성하고 어설픈 형태로 제작되어 있다. 유럽 수출 모델에서는 노키아와 같은 N-Gage 게임형 단말기에 몇 가지 3D 컨텐츠를 제공하고 있는데, 이 제품은 닌텐도의 휴대용 게임기 ‘게임보이’를 벤치마킹한 제품이다. 이동통신/스마트폰용 OS인 심비안(Symbian) OS를 탑재하였으며, 3D 게임으로는 모토 레이서, 툼 레이더 등이 있다.
유럽의 경우 모바일 게임을 제작하기 위한 플랫폼으로 J2ME를 가장 많이 사용한다. J2ME 환경에서 3D 게임을 제작하려면 JSR184 표준 규격이 추가로 제공되어야 한다. 유럽은 휴대폰의 특성이나 규격이 단말기 제조사 중심으로 제작되기 때문에 이동통신 사업자가 주도하는 우리나라처럼 다운로드 형태가 아니라 외부 저장장치를 통해 컨텐츠 공급이 가능하다. 따라서 J2ME 환경 이외에 몇 가지 독자적인 환경도 존재한다. N-Gage의 경우는 심비안 운영체제 위에 Fathammer의 X-Forge를 적용했으며, 이밖에 Synergenix Interactive의 Mophun, In-Fusio의 ExEn (Excution Engine) 등이 있다.
3D 그래픽 사용자 인터페이스
바탕화면 다음으로 많이 사용하는 것이 휴대폰에 적용 가능한 3D 응용으로 그래픽 사용자 인터페이스(GUI) 부분을 꼽을 수 있다. 보통 휴대폰의 메뉴는 대부분 단말기 제조사의 특성에 따라 다양한 형태로 제작되는데 여기에 3D 형태의 메뉴를 삽입하면 사용자에게 좋은 시각 효과를 제공할 수 있다.
하지만 모든 GUI를 3D로 변경하려면 리소스의 부담이 크고 디자인 비용도 많이 들기 때문에 당장 적용되기에는 무리가 따른다. 또한 2D 이미지를 이용해도 어느 정도 3D 효과를 나타낼 수 있기 때문에 이에 대해서는 기술적 측면과 UI의 디자인 측면에서 모두 시간과 노력이 필요할 것으로 보인다.
하드웨어 가속기
소프트웨어 엔진에 비해 더 높은 성능을 낼 수 있는 하드웨어 가속기는 그 형태가 매우 다양하다. 일단 알려진 하드웨어 가속기에 대해 알아보면 퀄컴의 Q3D, 네오매직의 MiMagic6, 매직아이의 VRender3D, ATI의 Imageon 2300, Sanshin Electronics의 GShark plus 등이 있다. 자세한 성능이나 스펙에 대한 사항은 각 제조사의 홈페이지를 통해 자세히 알아볼 수 있으므로 여기서는 간단한 특성만 살펴 본다.
퀄컴 Q3D
퀄컴의 MSM6100 계열부터 Q3D라는 하드웨어 엔진이 포함돼 제공되고 있으며, OpenGL ES 표준을 지원하는 형태라고 한다. 속도는 초당 약 10만 폴리곤으로 알려져 있으며, 실제로 이를 이용하기 위해서는 몇 가지 추가적인 코드들을 함께 적용시켜야 하기 때문에 단말기 제조사에서 이를 이용하려는 움직임이 그렇게 높지 않은 편이다.
네오매직 MiMagic6
네오매직 역시 3D 가속기를 장착한 모바일 칩인 MiMagic6을 개발 중에 있다. ARM926EJ 코어를 바탕으로 APA 기반의 멀티미디어 엔진을 통해서 OpenGL ES 규격을 만족하도록 구성한 칩이다.
매직아이 VRender3D
매직아이의 VRender3D는 ARM920T 코어를 바탕으로 3D 그래픽 엔진과 MPEG4 엔진을 내장하고 있는 칩으로 현재 다이렉트3D 형태의 3D API를 제공하고 있다.
ATI Imageon 2300
PC용 그래픽 가속 칩을 제작하는 회사인 ATI는 PDA나 휴대폰에 적합한 형태의 가속 칩인 Imageon 2300을 출시하였다. 이 칩은 CPU가 없는 순수 가속 칩으로 OpenGL ES 규격을 만족하는 칩이다.
GShark plus
일본 업체인 Sanshin Electronics의 GShark plus는 독자적인 규격의 3D 엔진으로 ATI 제품과 마찬가지로 CPU가 없는 순수 가속 칩이다.
모바일 3D 표준 동향
최근 모바일 3D 관련 업계들의 화두는 국제 공개 표준으로 부각되고 있는 OpenGL ES이다. 현재 국내외 이동통신사, 단말기/칩 제조사, 3D 엔진 개발사 등 거의 대부분 회사들이 OpenGL ES를 수용해 제품을 개발하고 있다. 지난 해 7월 모바일 시스템용 그래픽 인터페이스 개발 동맹인 ‘크로노스 그룹(Khronos Group)’이 OpenGL ES Ver 1.0을 비준한 이래 세계의 주요 칩셋/코어, 소프트웨어 개발 업체들이 줄이어 이 그룹의 멤버로 참여하고 있다.
한국에서는 SK텔레콤, 고미드를 비롯해 몇몇 업체가 회원사로 활동하고 있다(KTF 역시 2003년 OpenGL ES를 포함하고 있는 고미드의 3D 엔진을 표준 엔진으로 선정하였다). 이에 따라 휴대폰 제조사는 OpenGL ES를 수용하도록 제품을 개발하고 있으며, 앞으로 이러한 추세는 큰 변화가 없을 것으로 보인다.
모바일 3D의 공개 표준, OpenGL ES
OpenGL ES는 [그림 2]에서 보는 것처럼 크로노스 그룹에서 주관하는 OpenGL의 임베디드 시스템 버전으로, 휴대용 단말기나 기기의 임베디드 디스플레이보다 향상된 2D/3D 그래픽 성능을 제공하기 위해 무료로 배포되는 낮은 레벨의 경량 API이다.
OpenGL을 기반으로 하되 사용빈도가 낮거나 불필요한 부분을 제거한 OpenGL 1.3의 서브셋(subset)으로, SW 애플리케이션과 HW/SW 그래픽 엔진간 초경량의 API를 제공한다. 버전 1.0 스펙은 Common(핸드셋과 같은 최소화된 모바일 디바이스에 사용 가능), Common-Lite(PDA나 셋톱박스 같은 디바이스에 사용 가능) 렌더러와 네이티브 플랫폼 윈도우 시스템과 연결해주는 EGL 등을 포함하고 있다.
[그림 2] 크로노스 그룹의 사업 진행 방향 |
이러한 임베디드 시스템을 위한 표준 API는 모든 메이저급 모바일/임베디드 플랫폼에서 다양한 3D 그래픽과 게임 제공을 용이하게 해주며, 애플리케이션 개발에 대해 다음과 같은 다양한 편의성을 제공한다.
◆ 산업 표준 & 로열티 프리(Industry Standard and Royalty Free), 개발자들은 플랫폼이나 적은 양의 코드를 작성하기 위한 힘을 쏟기보다 컨텐츠 개발에 더 집중할 수 있게 되었다.
◆ 적은 메모리 요구량 & 저전력 소비(Small footprint & low power consumption)
◆ SW에서 HW 렌더링으로의 자연스러운 이동(Seamless transition from software to hardware rendering)
◆ 확장 가능 & 진화 발전(Extensible & Evolving)
◆ 사용 편리성(Easy to use)
◆ 풍부한 문서 자료(Well-documented)
◆ 적은 메모리 요구량 & 저전력 소비(Small footprint & low power consumption)
◆ SW에서 HW 렌더링으로의 자연스러운 이동(Seamless transition from software to hardware rendering)
◆ 확장 가능 & 진화 발전(Extensible & Evolving)
◆ 사용 편리성(Easy to use)
◆ 풍부한 문서 자료(Well-documented)
Common profile과 더 작은 메모리가 할당된 플랫폼을 위한 Command-Lite profile로 나뉘어져 있으며, 핵심판(core addition)과 확장판(extension)을 통해 더 많은 기능을 추가적으로 제공할 수 있도록 구성되어 있다. OpenGL 2.0의 서브셋이기 때문에 OpenGL의 장점은 유지한 상태에서 모바일 환경에 요구되는 기능만을 제공하도록 고안돼 있다.
| ||||||||||
| ||||||||||
OpenGL ES는 일종의 표준 인터페이스이므로 실제 코드는 3D 엔진 업체들이 제작해야 하는 부분이다. 이 부분은 소프트웨어 또는 하드웨어로 구현해야만 한다. 현재 소프트웨어로 구현된 것들은 시장에 나와 있는 제품도 많이 있으나, 아직 하드웨어로 구현된 제품은 그 수가 적은 편이다.
크로노스 그룹은 OpenGL ES 외에도 오디오, 비디오처럼 미디어와 관련된 OpenML을 함께 표준화하고 있다. 하지만 아직까지 국내에서는 이와 관련된 특별한 활동은 미미하다.
임베디드 그래픽 라이브러리
OpenGL-ES는 EGL(Embedded Graphic Library)이라는 공용 플랫폼 인터페이스 레이어를 포함하고 있는데, EGL은 플랫폼이나 운영체제와 상관없이 그래픽 작업을 사용할 수 있게 도와주는 것이다. 즉 플랫폼이나 운영체제가 다른 환경에서 작동하고 있는 렌더링 엔진에서도 원하는 그래픽 작업을 할 수 있도록 함수들을 지원해 주는 역할을 한다.
[그림 3] EGL 구성도 |
실제로 OpenGL ES를 기반으로 EGL을 이용해 모바일 환경에서 상위 레벨의 3D 그래픽 API 프로그램을 작성한다면 [그림 3]처럼 나타낼 수 있다. 이 그림은 자바 환경의 모바일 3D JSR184의 동작 방식을 설명하고 있다.
GSM 시장에서 주목받는 JSR184
최근 OpenGL-ES와 더불어 주목받고 있는 것이 JSR-184이다. GSM은 유럽을 중심으로 미국과 중국 등 전 세계 이동통신 시장의 70%를 차지하고 있다. 이처럼 GSM 시장을 예의 주시하는 칩, 단말기, 컨텐츠 등 관련 업체들은 자신들의 제품을 차별화하기 위해 속속 3D를 도입하고 있으며, 이를 위해 대부분의 GSM 폰이 채용하고 있는 자바 환경에 최적화된 3D 그래픽 API를 필요로 하게 되었다. 이러한 필요를 충족시키기 위해 제정된 것이 J2ME를 위한 표준 3D 그래픽 API인 JSR-184이다.
J2ME 환경에서 3차원 그래픽을 구현하기 위해 낮은 레벨(low-level)인 OpenGL을 이용할 경우 코드가 길어져 MIDlet(MIDP Application)의 덩치가 커지므로 속도가 느려질 수밖에 없다. 또한 자바 3D API를 이용할 경우엔 스펙의 양이 너무 방대하기 때문에 역시 MIDP(Mobile Information Device Profile)을 이용하기엔 적합하지 않다.
이러한 단점을 보완하기 위해 제안된 JSR 184는 J2ME를 위한 표준 3D 그래픽 API로서, 객체지향적 언어인 자바의 특성을 이어받아 오브젝트의 재사용과 공유를 원칙으로 한다. OpenGL ES와 JSR 184에서 사용되는 그래픽 개념이나 단계적 절차는 [그림 4]와 같이 동일하나 다만 표현하는 방식에서 차이를 보인다.
[그림 4]JSR 184 그래픽 처리 단계 |
OpenGL ES와 JSR184의 비교는 OpenGL과 자바 3D를 비교하는 것과 유사한 관점에서 설명할 수 있다. 즉 OpenGL이 3D 그래픽의 기본적인 기능을 제공하는 데 비해 자바 3D는 상위 레벨까지 기능을 제공하는 것과 마찬가지로 OpenGL ES는 모바일 환경에 적합한 3D 그래픽의 기본적인 기능을 제공하는 것이라면 JSR184는 J2ME 환경에서 모바일 3D를 지원할 수 있도록 만든 상위 레벨의 패키지라고 할 수 있다.
국내 이동통신 사업자의 3D 표준
SK텔레콤은 자체적으로 3D 엔진을 탑재한 GIGA(Graphic Instruction Graphic Acceleration) 단말기 규격을 통해 3D 표준을 지정하였다. 여기에는 OpenGL ES API와 함께 자체적인 3D 관련 API들이 포함되어 있으며 계속 업그레이드되고 있다. KTF는 OpenGL ES 규격을 포함하고 있는 고미드의 3D 엔진을 표준으로 지정하였고, 애플리케이션을 위한 상위 레벨 API에 대한 표준을 마련하고 있다.
G3 SDK를 이용한 프로그래밍
G3 SDK는 게임 개발자가 특별한 하드웨어 장치 없이 임베디드형 게임 소프트웨어를 PC에서 개발할 수 있는 환경을 제공하기 위한 목적으로 제작된 소프트웨어 개발 도구이다. 따라서 모바일 3D에 관심 있는 사람이라면 누구나 쉽게 모바일 3D 프로그래밍이 가능하도록 해준다. G3 SDK의 구조와 간단한 예제를 알아보자.
G3 SDK의 구조
G3 SDK에 탑재된 3D 엔진은 OpenGL ES 1.0과 호환은 물론 모델 및 애니메이션 데이터 로딩과 본 애니메이션 등과 같은 진보된 형태의 기능을 제공함으로써 개발자에게 고급 게임을 개발할 수 있는 환경을 지원한다.
[그림 5] G3 SDK 구조 |
G3 SDK는 [그림 5]와 같은 API들로 구성되며, 각 API들은 게임 개발자들에게 유용한 기능을 지원한다. API의 종류와 각 API의 역할은 <표 3>과 같다. G3 SDK의 자세한 내용은 개발자 사이트(http://g3d.co.kr)에서 회원 가입한 후 SDK를 다운받아 설치해 보면 확인할 수 있다. 이 API들의 실제 구현은 단말기의 하드웨어와 소프트웨어 환경에 따라 달라질 수 있겠지만 게임 개발자들이 이렇게 구현까지 신경 쓸 필요는 없을 것이다.
| ||||||||||||||||||||
| ||||||||||||||||||||
G3 SDK는 기본적으로 PC 환경에서 VC++를 이용해 DLL 파일을 생성한다. 생성된 DLL 파일은 에뮬레이터에서 로딩되어 동작하게 된다. 에뮬레이터 상에서의 동작은 모바일 단말기에서도 동일하게 동작하도록 구성되어 있으므로 에뮬레이터를 통해 디버깅 과정을 거치면서 윈도우 개발 환경에서 게임 프로그램을 완성할 수 있게 된다. <그림 6>은 최종적으로 타겟 바이너리를 생성하기 위한 개발 과정을 나타내고 있으며 디버깅이 완료된 게임의 경우 타겟 단말기용 컴파일러를 이용해 컴파일하면 최종적인 타겟 바이너리가 생성된다.
[그림 6] G3 SDK를 이용한 모바일 단말기용 게임 개발 과정 |
G3 SDK를 이용해 개발된 게임 소프트웨어는 [그림 6]의 과정을 거쳐 최종적으로 G3 SDK 라이브러리가 탑재된 모바일 기기에서 동작할 수 있게 되는 것이다. G3 SDK 설치시 제공되는 ‘G3 게임 마법사’를 통해 게임 개발을 위한 템플릿 소스를 VC++ 환경에서 쉽고 빠르게 만들 수 있다.
3D 그래픽 예제
G3 SDK는 3D 게임을 지원하기 위한 하위 레벨 API와 상위 레벨 API를 제공한다. 하위 레벨 API는 OpenGL ES 1.0에 호환되는 형태로 제공되고, 상위 레벨 API는 3D 모델, 에니메이션 로더, 에니메이션 엔진, 각종 3D 이펙트 처리 유틸리티 API로 구성되어 있다.
[화면 1] G3 프로젝트 설정 게임 개발 과정 |
먼저 3D 프로그래밍을 하려면 [화면 1]과 같이 G3_3Dg.lib과 gl.lib을 링크시켜야 하고 gl.h와 G3_3Dg.h를 인클루드(include)시켜야 한다. 그리고 다른 실행 파일과 마찬가지로 G3_3Dg.dll과 g3.dll이 있어야 한다. 여기서는 3D 그래픽스의 기초 이론을 알고 있다고 가정한 상태에서 예제를 중심으로 G3 SDK를 사용해서 어떻게 3D 그래픽스를 그릴 것인지에 대해서 예제를 중심으로 기술하도록 하겠다. 이 예제는 OpenGL ES 1.0의 하위 레벨 API를 사용해서 피라미드 형태의 객체를 통해 3차원 공간에서 RGB 컬러 값을 표시하는 예이다.
[리스트 1-1]은 G3 SDK를 사용해서 어떻게 3D 프로그래밍을 하는지 보여주고 있다. 먼저 3D 함수를 이용하려면 gl.h 헤더 파일을 인클루드시켜야 한다. 그리고 2D에서의 작업과 같이 G3_LcdSurfaceGet() 함수로 LCD 화면과 대응되는 가상 프레임 버퍼를 얻게 되며, 그 후 생성된 표면 버퍼를 G3_SurfaceSet() 함수를 이용해 LCD 화면에 설정한다.
3D 그래픽스의 사용을 위해서는 초기 설정을 해야 한다. ResizeGLScene() 함수와 InitGL() 함수를 통해서 3D 그래픽스 관련 초기화 작업을 한다([리스트 1-2]).
| ||||
| ||||
ResizeGLScene() 함수에서는 3D 작업을 위한 영역의 생성, 뷰포트 설정, 프로젝션 관련 설정 등을 하게 된다. glCreate() 함수를 사용해 3D 작업 영역을 생성하고, glViewport() 함수를 사용해서 실제 LCD와 사상되는 뷰포트를 설정한다. glPerspective() 함수를 통해 프로젝션 매트릭스에 대한 설정을 한다. [리스트 1-2]에서 작업된 내용을 살펴보면 너비를 width로 하고, 그 높이를 height로 하는 그리기 영역이 생성되며, 뷰포트의 크기는 그리기 영역의 크기와 동일하고, 표현될 3D 오브젝트들은 원근법 기반으로 그려지는 설정을 한 것이 된다.
InitGL() 함수에서는 GL을 통해서 그리고자 하는 좀 더 세밀한 설정을 하게 되는데, 그 내용을 살펴보자. glShadeModel() 함수를 통해서 셰이딩을 어떻게 할 것인지 설정한다. G3 SDK에서는 평평한 셰이딩(GL_FLAT)과 부드러운 셰이딩(GL_SMOOTH)이 제공된다. 다음으로 glClearColor() 함수를 통해서 생성된 화면의 초기 배경색을 설정한다. glClearColor()의 첫 번째 인자는 R값, 두 번째 인자는 G값, 세 번째 인자는 B값을 나타내며 마지막 인자는 알파(alpha) 값이다. 그 다음의 세 라인은 깊이 버퍼(depth buffer)와 관련된 것이다.
지금까지 ResizeGLScene() 함수와 InitGL() 함수를 통해 3D 그래픽스를 사용하기 위한 초기 설정을 완료했다. 따라서 3D 객체를 그릴 수 있는 환경이 되었다. 이제부터 실제로 3D객체가 어떻게 그려지는지 살펴보자([리스트 1-3]).
| ||||
| ||||
먼저 glMatrixMode() 함수를 통해서 모델뷰 행렬을 선택한 뒤 glLoadIdentity 함수로 매트릭스를 초기화시킨다. glClear() 함수를 사용해서 컬러 버퍼(GL_COLOR_BUFFER_BIT)와 깊이 버퍼(GL_DEPTH_BUFFER_BIT)를 비운 다음 glTranslatef() 함수로 물체를 그릴 위치로 이동하며, glRotatef() 함수를 통해 3D 객체가 Y축과 X축을 기준으로 회전할 수 있도록 하였다.
본 예제에서 그려지는 3D 객체는 3차원 피라미드의 형태를 가지는데, 삼각형을 이용해서 피라미드의 면을 설정하고 삼각형의 꼭지점마다 정점이 가지는 색을 설정했다. 그리고 정점들을 기술하는 방법은 3차원 데카르트 좌표계를 사용해서 표현했다. OpenGL ES에서 사용되는 3차원 데카르트 좌표계는 z축의 방향이 반대가 되는 것을 고려하면 별 무리 없이 사용할 수 있다.
삼각형을 그리는 부분이 모두 4개로 되어 있는데 일단 종이를 준비해서 각 정점을 종이에 순서대로 찍어보고 그 정점을 반시계 방향으로 순서대로 이어보자. 삼각형이 그려질 것이다. 이런 식으로 4개의 삼각형이 모여 [그림 7]에서 보는 바와 같은 객체가 생성된다. 3D 공간에 객체에 대한 기술이 끝나면 G3_3DTransBlt() 함수를 사용해 버퍼에 그린 객체를 LCD에 뿌려주면 LCD 화면에 3D 객체가 표현된다. 예제를 실행한 화면은 [그림 7]과 같다.
[그림 7] 3D 피라미드 그리기 실행 화면 |
본 애니메이션 예제
[그림 8]는 이미 만들어진 3D 모델과 3D 애니메이션 정보를 읽어서 G3 API 함수를 사용해 동작하는 프로그램이다. 3D 모델의 생성과 3D 애니메이션을 생성하는 것은 G3 SDK의 ‘G3 Character Design Guide’ 문서를 참조하기 바란다. G3 SDK에서는 Skinned Bone Animation을 지원한다(Skinned Bone Animation은 계산이 용이한 뼈대의 움직임을 기준으로 상대적인 값으로 스킨 메시를 변형시키는 애니메이션 방법을 말한다).
[그림 8] 아바타 애니메이션 실행 화면 |
먼저 3D 함수를 이용하려면 gl.h 헤더 파일을 인클루드시켜야 한다. 다음으로 G3_LcdSurfaceGet() 함수의 호출을 통해서 LCD 화면과 대응되는 가상 프레임 버퍼를 얻게 되며, 그 후 생성된 표면 버퍼를 G3_SurfaceSet() 함수를 이용해 LCD 화면에 설정한다.
LCD 화면 사용에 대한 초기화가 끝나면 InitGame() 함수를 통해서 필요한 정보를 초기화한다. InitGame()은 glCreate() 함수를 통해 사용되는 GL 윈도우를 생성하고, G3_3DgCreate() 함수를 통해 사용할 아바타를 생성하고, gAddObjectMeshFromeFile() 함수를 통해 아바타를 로딩하고, gAddObjectAnimFromFile() 함수를 통해 아바타 애니메이션을 로딩하고, G3_3DgSetAvatarPosition() 함수를 통해 아바타의 위치를 설정하고, G3_3DgGetSkinnedMeshBBox() 함수를 사용해 지정된 아바타 객체의 바운딩 정보를 설정하는 등 아바타 애니메이션에 대한 모듈의 초기화를 수행한다. 그 내용을 보면 [리스트 2-2]와 같다
| ||||
| ||||
| ||||
| ||||
gAddObjectMeshFromFile() 함수는 G3 SDK가 제공하는 파일 입출력을 통해 모델 데이터를 읽어온 후 읽어온 데이터를 G3_3DgAddSkinnedMeshToAvatar() 함수를 사용해서 아바타에 설정하는 부분이다.
gAddObjectAnimFromFile() 함수는 G3 SDK가 제공하는 파일 입출력을 통해 모델의 애니메이션 데이터를 읽어온 후 G3_3DgAddBoneAnimToAvatar() 함수를 사용해서 지정된 ID에 해당하는 아바타에 애니메이션을 추가하고 지정한다. G3_3DgPalyAvatarAnim() 함수를 통해서 애니메이션을 실행하며, G3_3DgRepeatAvatarAnim() 함수를 사용해서 지정된 애니메이션의 반복 횟수를 지정한다.
데이터에 대한 작업이 끝나면 3D 그래픽스 사용을 위해 ResizeGLScene() 함수와 InitGL() 함수를 사용해서 3D 그래픽스 관련 초기화 작업을 한다([리스트 2-4]).
ResizeGLScene() 함수에서는 3D 작업을 위한 영역의 생성, 뷰포트 설정, 프로젝션 관련 설정 등을 하게 된다. glCreate() 함수를 사용해 3D 작업 영역을 생성하고, glViewport() 함수를 사용해서 실제 LCD와 사상되는 뷰포트를 설정한다. glPerspective() 함수를 통해 프로젝션 매트릭스에 대한 설정을 한다. [리스트 2-4]에서 작업된 내용을 살펴보면 너비를 width로, 높이를 height로 하는 그리기 영역이 생성되며, 뷰포트의 크기는 그리기 영역의 크기와 동일하고, 표현될 3D 오브젝트들은 원근법에 근간해서 그려지는 설정을 한 것이 된다.
| ||||
| ||||
InitGL() 함수에서는 GL을 통해서 그리고자 하는 좀 더 세밀한 설정을 하게 되는데, 그 내용을 살펴보자. glShadeModel() 함수를 통해 셰이딩을 어떻게 할 것인지 설정한다. G3 SDK에서는 평평한 셰이딩(GL_FLAT)과 부드러운 셰이딩(GL_SMOOTH)이 제공된다. 다음으로 glClearColor() 함수를 통해서 생성된 화면의 초기 배경색을 설정한다. glClearColor()의 첫 번째 인자는 R값, 두 번째 인자는 G값, 세 번째 인자는 B값을 나타내며 마지막 인자는 알파 값이다. 그 다음 세 라인은 깊이 버퍼와 관련된 것이다.
| ||||
| ||||
SyncFrame()은 3D 그래픽스가 그려지는 총 프레임 갱신 비율을 제어하는 함수로, 100ms마다 한번씩 그리도록 설정되어 있다. 프레임 갱신 비율을 바꾸기 위해서는 <리스트 2-5>의 ?에 설정된 값 100을 변경해주면 된다. 결국 본 예제에서는 100으로 설정되어 있기 때문에 10fps로 프레임이 제어되는 것을 의미한다.
| ||||
| ||||
이상으로 아바타 애니메이션에 위한 초기화 단계가 끝났다. 이제 실제 매 프레임마다 아바타를 어떻게 움직이는가에 대해서 UpdateGame() 함수를 통해서 알아 볼 것이다.
UpdateGame() 함수는 G3_3DgUpdateAvatar() 함수를 통해 게임 내부 정보를 아바타 단위로 갱신한다. 애니메이션이 구동될 때에는 정점 단위의 변형(deformation)을 수행해 그려질 정점 정보의 원형을 구성한다. 이렇게 한 뒤 G3_3DgTransformAvatar() 함수를 통해 지정된 아바타를 외부 변환 정보에 의해 정해진 위치로 변환시킨다. 변환은 회전과 이동을 포함한다. 새로운 위치로 변환된 아바타는 G3_3DgDrawAvatar() 함수를 사용해서 그려지게 된다.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
|