Stop! 윈도우 임베디드 CE 시스템 개발! ⑦

윈도우 임베디드 CE용 응용프로그램 마켓이 경쟁처럼 생겨나며 윈도우 모바일에 대한 관심이 고조되는 등 전에는 없던 새로운 시장이 개척되고 있다. 윈도우 임베디드 CE 7.0 혹은 윈도우 임베디드 컴팩트라는 새로운 이름으로 새 버전이 올해 말이나 내년 초에 출시될 것이 예상됨에 따라 프로세서의 발전과 아울러 발전된 임베디드 시스템용 운영체제로서 새로운 역할을 할 것으로 기대된다.
글: 라영호 / ratharn@naver.com

연재 차례
1. 윈도우 임베디드 시스템 테스팅
2. 부트로더를 통한 개발 준비  
3. 빌드이야기
4. 윈도우 임베디드 CE 6.0 커널 이야기 
5. 디바이스 드라이버 개발
6. 윈도우 임베디드 시스템 디버깅
7. 디스플레이 디바이스 드라이버, 윈도우 임베디드 시스템, 3D의 세계로…
8. 플래시 메모리를 저장 장치로
9. GPS 디바이스 드라이버의 개발
10. 선 없는 세상으로
11. 멀티미디어 세상속으로-I
12. 멀티미디어 세상속으로-II
/필/자/소/개/
필자는 윈도우 모바일 관련 스마트폰 개발과 윈도우CE 관련 장치를 개발하고 있다. 개인적으로 운영하고 있는 윈도우CE에 관한 블로그(www.embeddedce.com)를 통해 윈도우CE 개발에 대한 다양한 생각과 방법론을 함께 생각해 보고자 노력 중이다. 아울러 윈도우CE의 포팅 뿐만 아니라 개발에서부터 최종 제품이 나오기까지 거쳐야 할 다양한 테스트 및 신뢰성 문제에도 관심을 가지고 있다.
윈도우 임베디드 시스템, 윈도우 임베디드 CE, BSP
앱스토어(AppStore)
윈도우 모바일 6.5 운영체제의 출시 시점에 맞추어 윈도우 모바일에 대한 관심이 잠시 고조가 되었었다. 애플의 앱(App) 스토어 같은 윈도우 임베디드 CE용 응용 프로그램 마켓이 경쟁처럼 생겨나고 있고, 개인 개발자뿐만 아니라 개발 업체에서도 좀 더 다양한 분야에서 이익을 낼 수 있는 방법이 생겼다. 물론 이와 같은 내용은 이상적인 이야기고 기획, 디자인, 개발, 상품화까지의 단계는 그리 녹록치는 않다. 하지만, 전에 없던 새로운 시장과 기회가 생겼다는 것에는 환영할만한 일이다. 이렇게 윈도우 임베디드 시스템에서 가장 큰 비중을 차지하는 윈도우 모바일 운영체제의 환경 변화가 있듯이 윈도우 임베디드 CE 운영체제에서 곧 새로운 변화가 있을 것이다. 그 새로운 변화는 새로운 윈도우 임베디드 CE 운영체제의 출현과 개발 방법의 변화다. 윈도우 임베디드 CE 7.0 혹은 윈도우 임베디드 컴팩트라는 새로운 이름으로 새로운 버전이 올해 말이나 내년 초에 출시될 것이 예상된다. 물론 실체를 봐야 알겠지만 프로세서의 발전과 아울러 발전된 임베디드 시스템용 운영체제로 새로운 역할을 할 것으로 기대된다.
(그림 1. 애플의 앱스토어)
(그림 2. SKT의 응용 프로그램 마켓)
BSP의 변화
BSP의 변화는 칩셋 업체의 개발 지원의 변화다. 많은 업체들이 LCD와 오디오 등 몇 개 디바이스 드라이버가 올라간 체 동작되는 것처럼 보이는 BSP를 제공해주던 형태에서 벗어나 실제 적용할 솔루션에 최대한 근접한 성능의 BSP를 제공하고 있다는 것이다. 초기 개발 단계에서 BSP를 받아 어렵게 단계를 밟아가며 개발하는 것이 아니라 칩셋 업체와의 긴밀한 관계 속에서 빠른 시간 내에 솔루션을 개발할 수 있도록 지원해 준다. 하드웨어 설계에서부터 BSP 내의 디바이스 드라이버 수정에 이르기까지 칩셋 업체의 지원을 받아서 개발할 수 있고 BSP 내에 있는 설정 툴을 이용하여 손쉽게 보드에 맞추어 BSP의 설정을 변경하는 기능까지 제공하고 있다. 임베디드 시스템에 사용되는 WiFi나 오디오 드라이버와 같은 장치 업체도 마찬가지다. 특별한 문제가 되지 않는다면 바로 탑재해 출시해도 될 만한 디바이스 드라이버를 제공하고 있다.
장점 대 단점
이러한 BSP의 변화는 윈도우 임베디드 CE 운영체제를 탑재하는 업체에서는 BSP 개발에 따른 부담을 줄일 수 있고 안정적인 시스템을 빠르게 만들 수 있다는 장점이 있다. 물론 윈도우 임베디드 CE 운영체제는 XP, 비스타와 같은 PC용 운영체제와 같이 누군 손쉽게 설치할 수 있는 운영체제는 아니다. 따라서 정도의 차이는 있겠지만 개발하는 시스템에 맞추어 수정하는 작업이 필요하다는 것이다.
디스플레이 드라이버
임베디드 시스템에서 LCD와 같은 디스플레이 장치는 이제 기본적인 장치로서 이용되고 있다. 이제는 단순히 정보를 전달하는 것에서 벗어나 3D 그래픽 기능을 이용해 사용자를 현혹시키는 화려한 사용자 환경을 제공한다.
물론 이런 기능을 구현하기 위해서는 그래픽 가속과 같은 복합한 연산과 기능이 필요하다. 단색이나 몇 가지의 색상을 사용해 임베디드 시스템을 구성했던 것이 불과 몇 년 전의 임베디드 시스템이다. 하지만 현재 임베디드 시스템은 3D 및 여러 가지 그래픽 기능을 사용하여 PC와 동등하거나 향상된 그래픽 기능을 사용하게 되었다. 대표적인 것이 3D 지도를 이용한 내비게이션 시스템이나 3D 사용자 인터페이스를 사용하는 임베디드 시스템이다. 윈도우 임베디드 CE 운영체제에서는 선과 라인과 같은 기본적인 그래픽을 처리하기 위한 GDI(Graphics Device Interface) 함수에서부터 그래픽 가속을 위한 다이렉트 드로우, 3D를 처리하기 위한 다이렉트 3D 모바일 및 OpenGL까지 다양한 그래픽 기능을 제공하고 있다. 물론 프로세서마다 그래픽 처리를 위해 제공되는 기능의 차이가 있고 이 기능을 잘 사용하게끔 디스플레이 디바이스 드라이버 및 라이브러리에서 기능을 제공해야만 제대로 사용할 수 있다.
윈도우 임베디드 CE, 디스플레이, 그래픽
윈도우 임베디드 CE운영체제에서 그래픽을 위한 기능은 PC 윈도우에서 사용했던 동일한 방식의 GDI 방식을 기본적으로 제공하고 있다. 여기에 그래픽 가속을 위해 사용했던 다이렉트 X의 축소판인 다이렉트 드로우 및 다이렉트 3D와 같은 기능들이 있다. 윈도우 임베디드 CE에 적용된 그래픽 처리 방법 및 기술들은 그림 3과 같다. GAPI의 경우 윈도우 임베디드 CE 5버전 이전에 사용되는 기술로 빠른 게임 개발을 지원하기 위해 사용되던 기술이다. 현재는 제공되지 않고 있다. 이 자리를 차지하고 있는 것이 다이렉트 드로우 및 다이렉트 3D 모바일, OpenGL 기술이다. 자세한 내용은 밑의 설명을 참조하기 바란다.
(그림 3. 그래픽 구조)
다이렉트 드로우-2D 그래픽 API, 하드웨어 가속기능을 사용함, 페이지 플립핑, 애니메이션, 컬러 변환 등의 빠른 그래픽 기능 제공. BitBlt와 같은 2D 가속 지원, 페이지 플립핑과 같은 그래픽 처리를 통해 게임이나 빠른 속도의 그래픽을 처리하기 위한 기능
(그림 4. 다이렉트 드로우의 구조)
다이렉트 3D 모바일 - 3D 프로그래밍을 위한 API. 자세한 내용은 뒤에서 설명
(그림 5. 다이렉트 드로우와 다이렉트 3D를 사용한 그래픽 처리)
다이렉트 쇼 - 카메라와 캡처와 미디어 재생 관련 솔루션, 고품질의 비디오 및 오디오 재생과 녹음 기능 다양한 형식의 미디어 및 파일 형식 지원 재생, 캡쳐, 변환 기능 지원
OpenGL, 다이렉트 3D 모바일
(그림 6.  다이렉트 쇼)
OpenGL은 2D 및 3D를 정의한 컴퓨터 그래픽 관련 산업계의 표준이기 때문에 중요한 의미를 가진다. 따라서 다이렉트 3D 모바일과의 비교를 통해 기능적으로 차이점이 있는지 확인해 보고자 한다. OpenGL의 경우 라이브러리 형태로 제공이 되지만 다이렉트 3D 모바일은 COM 형태의 인터페이스를 가진다. 또한 표 1에서 보여주는 것 같이 다양한 기능상의 차이는 있지만 Direct3D나 다이렉트 3D 모바일은 3D 그래픽을 위한 하나의 표준으로서 중요한 자리를 차지하고 있다.
(표 1. OpenGL, Direct3D, 다이렉트 3D 모바일)
윈도우 임베디드 CE에서 지원하는 다이렉트 3D 모바일
PC와 달리 윈도우 CE에서 지원하는 다이렉트 3D 모바일의 기능은 OS를 개발 시 선택해야 하는 항목 중에 하나이다. PC에서 운영체제를 설치할 때 자동적으로 설치되는 것과는 큰 차이점이다.
윈도우 CE는 PC와 달리 하드웨어적인 제약이 많은 시스템이기 때문이다.
운영체제가 설치되는 플래시 영역의 크기(보통 NAND나 NOR 플래시), 운영체제가 실행되는 RAM의 크기에 따라 전체 OS 크기를 조절해야 한다.
따라서 다이렉트 3D 모바일 기능이 필요 없다고 생각이 되면 운영체제를 구성할 때 포함 안 시키면 되는 것이다. 그림 7은 윈도우 임베디드 CE 플렛폼 빌더에서 제공되는 다이렉트 3D 모바일 컴포넌트를 보여준다.
(그림 7. 플랫폼 빌더에서 다이렉트 3D 모바일 컴포넌트)
윈도우 CE에서 사용하는 다이렉트 3D 모바일 기능은 윈도우 CE에 포함된 소프트웨어 자체기능을 이용하여 구현하는 방법과 하드웨어 가속기를 사용 했을 때 별도의 다이렉트 3D 모바일 드라이버를 등록하여 사용하는 두 가지 방법을 쓰고 있다. 보통 출시되는 많은 제품들은 하드웨어 가속기를 사용하여 다이렉트 3D 모바일을 사용하는 방법을 많이 사용하고 있다.
윈도우 CE에서는 다이렉트 3D 모바일이 동작하기 위한 환경뿐만 아니라, 다이렉트 3D 모바일을 지원하는 디스플레이 드라이버 샘플, 테스트 응용프로그램 샘플 등을 제공하여 개발뿐만 아니라 동작 테스트를 할 수 있도록 제공하고 있다. 또한 개발된 운영체제 및 다이렉트 3D 모바일 드라이버가 제대로 동작하는지 확인할 수 있는 윈도우 임베디드 CE 테스트 킷(WCETK)도 제공하고 있다.
(그림 8. 그래픽 가속기 내부 구조 설명)
윈도우 임베디드 CE에서 그래픽 고려사항
윈도우 임베디드 CE의 그래픽 성능을 가늠하는 것은 가장 기본적인 것은 프로세서의 그래픽 처리 능력이다. 빠른 그래픽 처리를 위해 고려해야 할 사항에 대해 먼저 살펴보도록 하겠다.
(1) 사용하려는 마이크로프로세서는 3D 가속 기능이 있는가? - 최근에 출시된 ARM11 코어 기반의 프로세서에는 MBX 또는 Mali라는 2D, 3D 그래픽 가속 코어가 장착되어 출시되기도 한다. ARM11 코어와 더불어 3D 관련 작업을 보다 효율적으로 할 수 있도록 구성되었다.
대표적인 마이크로프로세서에는 프리스케일(Freescale)의 i.MX31 시리즈, Centrality의 Titan 프로세서, NXP의 advanced Nexperia™ Mobile Multimedia Processor PNX4008, 삼성의 프로세서 등이 있다. 최근에는 한국의 벤처기업의 하나인 넥서스칩스에서 NX1007이라는 그래픽 가속 칩을 출시하여 좋은 반응을 얻고 있다고 한다.
그림 8은 프리스케일의 제품인 i.MX31 프로세서 내부에 있는 3D 가속기능을 설명한 그림이다. 그림과 같이 보통은 소프트웨어적으로 처리해야 할 3D관련 Shading 및 Z-buffer 관련 작업들을 하드웨어적인 도움을 받아 처리하도록 구성되어 있다.
(2) 3D 지원 라이브러리 - 프로세서 내부에 3D 가속코어가 있다고 하더라도 실제 3D를 사용하기 위해서는 이 가속코어를 최적화해서 사용하게 해주는 라이브러리의 지원이 필요하다. 단말기를 만드는 회사에서 3D 지원라이브러리를 만드는 것은 불가능하며 보통 프로세서와 밀접한 Third Party의 라이브러리를 사용하게 된다.
(3) 프로세서의 성능 - 임베디드 프로세서의 성능은 급속하게 발전하고 있다. 필자가 처음 임베디드 시스템을 시작 했을 때에는 8비트나 16비트 데이터 버스의 프로세서 시스템 클록은 16MHz가 대부분이었다. 하지만 지금 나오는 프로세서는 500MHz를 넘어 1GHz 대로 진입하고 있다. 3D를 제대로 이용하고 표현하기 위해서는 300MHz이상의 프로세서 시스템 클락을 추천하지만 실제 윈도우 CE가 동작하고 모든 디바이스 드라이버들이 동작하는 환경에서는 500MHz의 프로세서 속도로 동작해도 별로 빠르게 느껴지지 않는다는 것이다.  부동 소수점 처리 장치와 같은 부분이 있다면 전체 동작 속도 향상에 도움이 될 것이다.
(4) 메모리의 크기 - 윈도우 CE 운영체제는 RAM 상에서 동작하기 때문에 RAM의 동작 속도가 중요하다. SDRAM, DDRRAM 등의 고속 메모리를 사용하고 ARM 구조의 최적화된 32비트 데이터 버스를 이용한다면 전체 시스템 속도에 조금이라도 개선이 될 것이다. 또한 3D의 경우 일반적인 프로그램보다 많은 시스템 메모리를 요구한다. 따라서 적절한 메모리를 확보해 두는 것도 잊지 말아야 할 점이다.
5) LCD 크기 - 현재 대부분 내비게이션 시스템이나 PMP의 LCD 해상도는 320×240인 QVGA 크기를 넘어서 VGA, WVGA(800×480)이상까지 나오고 있다. 해상도가 높아짐에 따라 처리해야 할 픽셀수가 많아지고 전체 성능에 영향을 주게 된다. 이러한 연유로 중요하게 고려해야 하는 요소 중의 하나이다.
다이렉트 드로우 프로그래밍
(그림 9. 페이지 플립핑)
다이렉트 드로우의 기본적인 기능은 프로세서에 있는 그래픽 가속 기능을 이용하여 빠르게 그래픽을 처리하는데 있다. 선을 그리거나 사각형 등의 기본적인 기능을 그리는 기능뿐만 아니라 여러 디스플레이 레이어를 관리하여 이 레이어 간의 색상 합성 등을 통해 다양한 효과를 주기 위해서다. 그 중에서도 가장 중요한 내용이 게임과 같은 빠른 화면 전환을 위해 사용하는 페이지 플립핑 처리를 할 수 있게 하는 것이다. 그림 9는 페이지 플립핑에 관한 개념적인 설명을 보여주고 있다.
그럼 실제 다이렉트 드로우 기능을 이용해 페이지 플립핑을 어떻게 구현하는지 확인해 보도록 하자.
그림 10은 다이렉트 드로우 기능을 이용하여 그래픽을 구현한 소스의 동작화면이다.
(그림 10. 다이렉트 드로우 동작 화면 )
윈도우 CE에서 다이렉트 3D 모바일
윈도우 임베디드 CE 운영체제에서 다이렉트 3D 모바일을 사용하기 위해서 가장 먼저 해야 하는 과정은 다이렉트 3D 모바일 관한 Sysgen 변수를 설정하여 OS가 만들어 질 때 필요한 요소들이 포함되도록 하는 작업이다. 플랫폼 빌더는 생성하는 OS에 다이렉트 3D 모바일에 관련된 DLL 및 라이브러리를 포함시켜 응용프로그램에서 사용할 수 있도록 해준다. 자세한 Sysgen 변수의 내용은 아래 표 2를 참고하기 바란다.
(표 2. Direct3D Sysgen 변수)
이와 아울러 다이렉트 3D 모바일을 이용하여 응용 프로그램을 개발하기 위해서는 표 3과 같이 SDK에 포함된 파일들이 필요하다. 윈도우 모바일 SDK의 경우 SDK내부에 포함되어 있으며 윈도우 CE에서는 플랫폼 빌더에서 SDK 생성 후 SDK를 이용하여 사용할 수 있다.
// 다이렉트 드로우에 대한 초기화        
#include
#pragma  comment(lib,"ddraw.lib")
// 다이렉트 드로우에 대한 변수 선언
IDirectDraw *g_DD    = NULL; 
IDirectDrawSurface *g_DDS   = NULL;
IDirectDrawSurface *g_DDSB = NULL;
BOOL DDrawInit(HWND hWnd)
DirectDrawCreate(NULL, &g_DD, NULL); // 생성

// 실행 모드 설정, 전 화면 설정
g_DD->SetCooperativeLevel(hWnd, DDSCL_FULL SCREEN);
// 다이렉트 드로우 화면 전환 구현 코드
void DDrawFlip()
{
        HRESULT hr;
        while (TRUE)
        {               
          hr = g_DDS->Flip(NULL, 0); // 서페이스를 전환한다.
          if(hr == DD_OK) break;
          if (hr == DDERR_SURFACELOST) {
                if( g_DDS->Restore() != DD_OK) break;
          }
         if (hr != DDERR_WASSTILLDRAWING) break;
        }
}
// BitBlt기능을 이용하여 다이렉트 드로우 서페이스 칠하기
void DDrawBackBase(DWORD dwRGB)
{       
        DDBLTFX ddbltfx;
        memset(&ddbltfx, 0, sizeof(ddbltfx));
        ddbltfx.dwSize = sizeof(ddbltfx);
        ddbltfx.dwFillColor = dwRGB;
        g_DDSB->Blt(NULL, NULL, NULL,
    DDBLT_COLORFILL | DDBLT_WAITNOTBUSY, &ddbltfx);

(표 3. 다이렉트 3D 모바일 파일들)

다이렉트 3D 모바일을 이용한 Application 개발
이번호는 다이렉트 3D 모바일에 대한 자세한 내용 보다는 "어떻게 윈도우 임베디드 CE 운영체제 환경에서 다이렉트 3D 모바일을 사용할 수 있게 하는가?"에 초점이 맞추어져 있다.  하지만 다이렉트 3D 모바일의 전체적인 이해를 돕고자 다이렉트 3D 모바일의 응용프로그램 개발에서부터 에뮬레이터를 이용한 테스트 방법, 실제 동작되는 디바이스를 이용하여 다이렉트 3D 모바일포팅 방법에 대해 두루 다루려고 한다. 하지만 일부 내용에는 저작권 및 NDA 관련 사항에 걸려 있는 부분이 있어 좀 더 자세히 다루지 못하는 부분이 있을 수도 있으니 이 부분에 대해서는 양해를 구한다. 또한 좀 더 깊게 들어가지 못하는 부분 중의 하나는 프로세서에서 제공하는 가속기능을 사용하거나 가속 칩을 사용하여 3D 관련 드라이버를 만드는 것이다. 이 부분에 대해서는 다음호에 더 자세히 다루도록 하겠다.
다이렉트 3D 모바일 맛보기
대부분 개발자들에게 할당되는 업무는 다이렉트 3D 모바일을 지원하는 하드웨어를 개발하는 업무보다는 다이렉트 3D 모바일을 이용해 응용 프로그램을 개발하고 테스트 하는 업무일 것이다. 다이렉트 3D 모바일을 이용하기 맛보기 가장 손쉬운 방법은 비주얼 스튜디오 2005와 윈도우 모바일 SDK를 이용하여 디바이스 에뮬레이터를 이용하여 PC에서 개발하는 방법이다. Direct3 Mobile을 사용하여 응용프로그램을 개발하는 방법을 간단하게 정리한다면 다음과 같다. '물체가 표시될 스크린을 설정하고', '스크린에 표시될 물체를 지정하고', '스크린의 물체에 빛과 뷰 포인트를 설정하고', '보고 싶은 방향을 지정'하는 것이다. 지금부터는 응용프로그램을 이용해 다이렉트 3D 모바일을 사용하는 방법을 알아보도록 하자. 다이렉트 3D 모바일은 Visual Studio와 .NET Compact 프레임워크를 이용해서도 개발할 수 있다.

#include

LPDIRECT3DMOBILE          g_pD3DM = NULL; 
LPDIRECT3DMOBILEDEVICE  g_pd3dmDevice = NULL
HMODULE                    g_hRefDLL  = NULL; 

(리스트 1. 다이렉트 3D 모바일을 사용하기 위한 구조체들) 

 g_pD3DM = Direct3DMobileCreate( D3DM_SDK_VERSION );

    D3DMPRESENT_PARAMETERS d3dmpp;
    memset( &d3dmpp, 0, sizeof(d3dmpp) );
    d3dmpp.Windowed = TRUE;
    d3dmpp.SwapEffect = D3DMSWAPEFFECT_DISCARD;
    d3dmpp.BackBufferFormat = D3DMFMT_UNKNOWN;

 g_hRefDLL = (HMODULE)LoadLibrary(TEXT("d3dmref.dll"));
void* pfnD3DMInit = GetProcAddress(g_hRefDLL, TEXT("D3DM_Initialize"));  

        // Register the software device
       g_pD3DM->RegisterSoftwareDevice(pfnD3DMInit);
       g_pD3DM->CreateDevice( uAdapter,
                                    D3DMDEVTYPE_DEFAULT,
                                    hWnd, 0,
                                    &d3dmpp, &g_pd3dmDevice );

(리스트 2. 다이렉트 3D 모바일에 대한 초기화)
위의 리스트에서 d3dmref.dll은 윈도우 모바일에서 사용되는 다이렉트 3D 모바일 참조 드라이버이다. 윈도우 임베디드 CE 운영체제에서 제공되는 다이렉트 3D 모바일 디바이스 드라이버는 소프트웨어적인 방법을 이용한 드라이버이다. 하드웨어 가속기를 사용 했을 때는 위의 드라이버가 아닌 별도의 드라이버를 통해 처리되게 된다. 참조 드라이버에서 D3DM_Initialize()에 대한 Entry 포인트를 얻어 초기화 하고 CreateDevice() 함수를 이용해 다이렉트 3D 모바일에 대한 초기화를 하게 된다.

CUSTOMVERTEX vertices[] =
    {
        { 150.0f,  50.0f, 0.5f, 1.0f, 0xffff0000 }, // x, y, z, rhw, color
        { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00 },
        {  50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff }
    };
g_pd3dmDevice->CreateVertexBuffer( 3*sizeof(CUSTOM VERTEX),
 0, D3DMFVF_CUSTOMVERTEX,
 pool, &g_pVB );

(리스트 3. Vertice 생성)
CreateVertexBuffer()를 이용하여 삼각형 형태의 Vertices를 생성하게 된다. g_pVB는 생성된 Verices를 저장하고 있는 버퍼이다.

if( SUCCEEDED( g_pd3dmDevice->BeginScene() ) )
    {
g_pd3dmDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
g_pd3dmDevice->DrawPrimitive( D3DMPT_TRIANGLELIST, 0, 1 );

        // End the scene
        g_pd3dmDevice->EndScene();
     }

(리스트 4. 랜더링 처리)
리스트 4에서는 BeginScene()과 EndScene()사이에서 리스트 3에서 생성한 Vertices인 g_pVB를 그리는 작업이 이루어지게 된다. 이로써 다이렉트 3D 모바일에서 스크린을 설정하고 오브젝트를 생성하고 랜더링을 해주는 기본 작업이 이루어지는 것이다. 그림 4는 위 소스를 통해 생성된 응용 프로그램의 실행 화면이다.

(그림 11. 다이렉트 3D 모바일 프로그램 동작 화면)
리스트 5에서는 앞에서 생성한 오브젝트에 대한 새로운 View를 설정하고, Transformation 처리를 통해 원래 생성된 이미지와는 다른 이미지 뷰를 나타내는 방법이다.

(그림 12. View 및 Transformation 적용 화면) 

 g_pd3dmDevice->SetTransform(D3DMTS_VIEW, (D3DMMATRIX*)&matView,   
        D3DMFMT_D3DMVALUE_FLOAT );
MATRIX matProj;
MatrixPerspectiveFovLH( &matProj, PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dmDevice->SetTransform(D3DMTS _PRO JECTION,
(D3DMMATRIX*)&matProj,D3DMFMT _D3DMVAL UE_FLOAT );

(리스트 5. View, Transformation)

오픈GL ES를 이용한 3D 프로그램 개발
오픈GL ES를 기반으로 3D 프로그래밍 환경을 이용하기 위해서는 오픈GL ES를 하드웨어나 소프트웨어적으로 지원해야 한다. 오픈GL ES 환경을 지원하는 개발보드 임베디드 장치가 아직까지는 드물기 때문에 PC에서 오픈GL 환경에서 개발한 후에 포팅하거나 다른 방법을 찾아야 한다. 임베디드 윈도우 CE 환경에서 테스트 할 수는 없을까 고민하던 중 타이푼 랩(www.typhoonlabs.com)에서 공개한 오픈GL ES 라이브러리를 발견하게 됐다. 이 라이브러리는 오픈GL ES 엔진을 소프트웨어를 구현한 후 윈도우 임베디드 CE 환경에서 테스트할 수 있도록 한다. 또한 PC의 에뮬레이터 상에서도 테스트 할 수 있는 환경을 제공, 속도 문제만 감안 한다면 충분히 개발 후의 테스트 환경으로 활용할 수 있을 것이다.
오픈GL ES를 사용해 윈도우 임베디드 CE 환경에서 테스트하는 것에 대해 살펴보자.
오픈GL ES의 객체 및 관련 변수들을 선언한다. 오픈GL ES에서 사용되는 객체들은 'EGL___'의 형식으로 이뤄지며 디스플레이 객체는 EGLDisplay 등으로 지정돼 있다.
EGLint 구조체를 이용해 생성하는 윈도우의 속성을 선언하고, 쉐이딩 모델 및 방법을 설정한다.

EGLDisplay glesDisplay;
EGLSurface glesSurface;
EGLContext glesContext;

BitmappedFont *font = NULL;
Mesh *mesh = NULL;
ParticleSystem *particles = NULL;
Texture *floorTexture = NULL;

(리스트 6. OpenGL ES 개체 선언 소스)

 이제는 랜더링이다. 뷰 포인트를 설정하고 각종 객체를 출력함으로써 랜더링을 시작하게 된다.

bool InitOGLES()

   EGLConfig configs[10];
   EGLint matchingConfigs;       

   const EGLint configAttribs[] =
  {
      EGL_SURFACE_TYPE,   EGL_WINDOW_BIT,
      EGL_NONE,           EGL_NONE
   };
 
   hDC = GetWindowDC(hWnd);
   glesDisplay = eglGetDisplay(hDC);       
 
   if(!eglInitialize(glesDisplay, NULL, NULL))
     return false;

/* 중략 */
   
glesSurface = eglCreateWindowSurface(glesDisplay, configs[0], hWnd, configAttribs);       
if(!glesSurface) return false;
   glesContext=eglCreateContext(glesDisplay,configs[0],0,configAttribs);
if(!glesContext) return false;

eglMakeCurrent(glesDisplay, glesSurface, glesSurface, glesContext);
    
glClearColorx(FixedFromFloat(0.5f), FixedFromFloat(0.5f), FixedFromFloat(0.5f), 0);
glShadeModel(GL_SMOOTH); 
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
 
/* 중략 */
}

(리스트 7. OpenGL ES 초기화 소스) 

void Render()

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     

   // 뷰 포인트 설정
   SetPerspective();
   glLoadIdentity(); 
   glTranslatex(0,FixedFromInt(-20),FixedFromInt(-100));
   glRotatex(FixedFromInt(10),ONE,0,0);
   static GLfixed angle = ZERO;
   glRotatex(angle, 0, ONE,0);    
 GLfixed speed = DivideFixed(FixedFromInt(timer->GetTimeBetweenTwoFrames()), FixedFromInt(100));
   angle += speed;
   
   // 매쉬를 그린다.
   glEnable(GL_TEXTURE_2D);
   floorTexture->BindTexture();
   mesh->Draw();
   glDisable(GL_TEXTURE_2D);

  // 파티클 출력
particles->DrawParticles(timer->GetTimeBet weenTwoFrames());

 // 프레임·초 및 출력 속도 표시
   SetOrtho2D();
   glLoadIdentity(); 
   glColor4x(ONE,ONE,ONE,0);
   BitmappedFont::EnableStates();
   font->Print(0,0,"FPS: %d",timer->GetFPS());
   BitmappedFont::DisableStates();

  eglSwapBuffers(glesDisplay, glesSurface); 
}

(리스트 8. OpenGL ES 랜더링 처리 소스)
결론
지금까지 윈도우 임베디드 CE 6.0의 그래픽 처리에 대해 살펴봤다. 너무 방대한 내용을 짧게 정리하다 보니 심도 있게 다루지 못한 것 같아 아쉬움을 남긴다. 부족한 부분에 대해서는 아직 남은 연재 기간 동안 내용을 보충할 것을 약속드리며 10월호의 내용을 마친다.

회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지