https://www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/안녕하세요? 고슴도치입니다.
맨날 댓글만 달다가 간만에 글을 작성하네요.^^;

msdn.com을 둘러보던 도중에 괜찮은 초급용 Direct3D 게임 프로그래밍 아티클이 있길래 벌넷 유저분들을 위해 짧은 실력으로 번역해서 올려봅니다..; MSDN Japan에 2003년에 올라온 글인데요.. 굉장히 쉽고 간결하게 정리되어 있습니다. 3D 게임 프로그래밍을 처음 접하시는 분들이라면 꽤나 유용할 겁니다.

총 6부로 되어 있고, 매 회마다 그에 해당하는 소스코드도 포함되어 있습니다. 소스코드는 전반부는 비쥬얼C++ 6.0과 DirectX 9.0으로 작성되어 있으며 후반부는 비쥬얼C++ 7.0과 Managed DirectX를 사용하였습니다. 그렇기 때문에 후반부에서 소스코드를 컴파일해보려면 닷넷 프레임워크가 필요합니다. 윈도XP는 기본적으로 포함되어 있으니까 크게 신경쓰실 필요는 없을겁니다. 그럼 편안한 마음으로 글을 읽어주시기 바랍니다.. 이만 총총~

------------------------------------

제1장 3D 게임 프로그래밍의 기초

~ DirectX를 이용한 게임프로그래밍 입문 ~

1.1 시작하며
DirectX란, MS 윈도상에서 게임을 개발하기 위한 컴포넌트의 묶음 전체를 일컫는 말입니다. 개발자는 DirectX9를 사용하여 가정용 게임기에도 뒤지지 않는 품질의 게임을 효율성있게 개발할 수 있습니다. DirectX는 공개프로그램이므로 상용제품을 막론하고 윈도상에서 동작하는 대부분의 게임 제작에 사용되고 있습니다.

이 글은 C++과 DirectX의 기초적인 지식이 있는 분을 대상으로 하고 있습니다. 이 글의 제1장부터 제4장을 통하여, 게임 프로그램의 기초적인 지식이나 방법에 대하여 설명합니다. 제5장과 제6장을 통하여 간단한 3D 슈팅게임을 만들어 보겠습니다.

이번 장에서는 연재의 목적인 3D 슈팅게임을 작성하기 위해 필요한 DirectX9의 기본적인 사용방법과 3D 게임프로그램의 기초에 대해 설명하겠습니다.

1.2 3D 모델의 조작
3D 게임에서는 다양한 3D 모델을 조작할 필요가 있습니다. 그 중에서도 특히 중요한 것으로 3D 모델의 이동이나 회전이 있습니다. 이번 절에서는 3D 모델의 조작방법을 설명하는 것과 함께 게임프로그램에 도움이 되는 기술인 사원수(Quaternion)에 대해 설명하겠습니다. 3D 모델을 조작한 결과를 표시하기 위해서는 제1.3절에서 설명할 3D 모델의 표시처리가 필요합니다.

1.2.1 Direct3D에서의 좌표변환
Direct3D에서 "3D 모델을 조작한다"것은 3D 모델을 구성하는 각 정점에 대하여 행렬을 사용한 좌표를 변환하는 것입니다. 좌표변환에 사용하는 행렬은 좌표변환행렬이라고 부릅니다. 좌표변환행렬에는 주로 이동행렬이나 회전행렬, 투영행렬 등이 있습니다. Direct3D에서 좌표를 변환하기 위한 계산방법은 그림1과 같습니다.

DirectX1-1.gif
[ 그림 1. Direct3D에서 행렬에 이용하는 좌표변환 식 ]


그림1의 좌표변환 식에서는 행렬 (x y z w)와 좌표변환행렬의 곱이 행렬 (x' y' z' w')입니다. 행렬 (x y z w)의 요소 x, 요소 y, 요소 z는 각각 좌표를 변환할 대상의 x 좌표, y 좌표, z 좌표입니다. 행렬 (x y z w)의 요소 w에는 보통 1.0을 대입합니다. 행렬 (x' y' z' w')의 요소 x', 요소 y', 요소 z'는 각각 좌표가 변환된 결과의 x 좌표, y 좌표, z 좌표입니다.

1.2.2 이동처리
3D 모델은 이동행렬을 사용하여 좌표를 변환하는 것으로 이동을 합니다. Direct3D에서 사용하는 이동행렬은 그림2와 같습니다.

DirectX1-2.gif
[ 그림 2. Direct3D에서 사용하는 이동행렬 ]


Direct3DX에는 이동행렬을 작성하기 위한 편리한 도우미 함수가 포함되어 있습니다. 도우미 함수를 사용하면 불필요한 코딩작업을 줄일 수 있으므로 소스코드를 간결하게 만들 수 있습니다. 도우미 함수를 사용하여 이동을 처리하는 소스코드의 예는 다음과 같습니다.
[code]
D3DXMATRIX mat;                                  // 행렬
D3DXMatrixTranslation(&mat, 0.0f, 0.0f, 10.0f);        // 이동행렬을 생성
s_lpD3DDevice->SetTransform(D3DTS_VIEW, &mat);  //뷰 변환을 설정
[/code]

1.2.3 회전처리
(1) 오일러 각을 이용한 회전처리
Direct3D에서 3D 모델의 자세를 제한하는 기본적인 방법은 X 축, Y 축, Z 축 중심으로 각도를 각각 지정하는 것입니다. 이 각도의 지정방법을 오일러 각이라고 부릅니다.

오일러 각을 이용한 회전처리는 회전행렬을 사용하여 구현됩니다. 회전행렬에는 X 축, Y 축, Z 축의 중심으로 회전을 처리하는 것이 있습니다. Direct3D에서 사용하는 회전행렬은 그림3과 같습니다.

DirectX1-3.gif
[ 그림 3. Direct3D에서 사용하는 회전행렬 ]


Direct3DX에는 회전행렬을 작성하는 편리한 도우미 함수가 여러개 포함되어 있습니다. 도우미 함수의 목록은 표1과 같습니다.




함수기능
D3DXMATRIX* D3DXMatrixRotationX(D3DXMATRIX* pOut, FLOAT Angle);X 축 중심으로 Angle 라디안만큼 회전하는 행렬을 만들어 줍니다.
D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* pOut, FLOAT Angle);Y 축 중심으로 Angle 라디안만큼 회전하는 행렬을 만들어 줍니다.
D3DXMATRIX* D3DXMatrixRotationZ(D3DXMATRIX* pOut, FLOAT Angle);Z 축 중심으로 Angle 라디안만큼 회전하는 행렬을 만들어 줍니다.
D3DXMATRIX* D3DXMatrixRotationYawPitchRoll(D3DXMATRIX* pOut, FLOAT Yaw, FLOAT Pitch, FLOAT Roll);Y 축, X 축, Z 축 중심의 회전각을 지정하여 회전행렬을 만듭니다.

[ 표1. 회전행렬을 작성하기 위한 Direct3DX 도우미 함수 ]

D3DXMatrixRotationYawPitchRoll() 함수는 Y 축, X 축, Z 축의 순서대로 회전시킵니다. 회전의 순서는 출력되는 행렬에 영향을 끼치기 때문에 주의해야 합니다. Y 축, X 축, Z 축 이외의 순서로 회전시켜야할 경우에는 각각의 순서에 맞게 회전행렬을 합성해야 합니다.

(2) 사원수를 이용한 회전처리
게임을 작성할때에, 임의의 각을 중심으로 회전을 처리해야하는 경우가 자주 발생합니다. 예를 들어 굴러가는 공을 표현하는 경우, 볼의 회전축은 볼이 구르는 방향이나 외부의 힘 등에 의해 다양하게 변합니다. 하지만 임의의 축을 중심으로 한 회전처리를 하는 경우, 오일러 각에 의해 자세를 제한하는 것만으로는 어렵습니다. 거기에, 임의의 축을 중심으로 하여 회전처리를 행할 수 있는 사원수가 필요합니다.

Direct3DX에는 사원수를 사용한 회전을 간단히 취급할 수 있는 도우미 함수가 많이 포함되어 있습니다.
D3DXQuaternionRotationAxis() 함수는 지정한 벡터를 축으로 하여 지정한 각도만큼 회전시키는 사원수를 만들어 줍니다. 여기서 축이 되는 벡터는 단위벡터여야 합니다. D3DXQuaternionRotationAxis() 함수를 사용하여 임의축 중심의 회전 사원수를 만드는 소스코드의 예는 다음과 같습니다.

[code]
D3DXQUATERNION qt; // 회전 사원수
D3DXVECTOR3 v;     // 축이 되는 벡터
qt.x = qt.y = qt.z = 0;qt.w = 1.0f;            // 단위 사원수를 초기화
v.x = 0.0;  v.y = 1.0;  v.z = 0.0;            // 회전축을 설정
D3DXQuaternionRotationAxis(&qt, &v, d); // 사원수를 회전
[/code]

다음으로, 작성한 사원수를 사용하여 벡터를 회전하는 처리를 해보겠습니다. 사원수를 사용하여 벡터를 회전하는 식을 그림4에 나타냈습니다.

DirectX1-4.gif
[ 그림 4. 사원수를 사용한 벡터의 회전 ]


그림 4의 식은 행렬로 표현이 가능합니다. 행렬로 표현된 식은 Direct3D의 렌더링 파이프라인에서 사용할 수 있기 때문에 효율적입니다. 거기에, Direct3DX에 포함되어 있는 D3DXMatrixRotationQuaternion() 함수를 사용합니다.
D3DXMatrixRotationQuaternion() 함수는 사원수의 계산을 행렬로 변환해줍니다. D3DXMatrixRotationQuaternion() 함수를 사용하는 소스코드의 예는 다음과 같습니다.
[code]
D3DXQuaternionRotationAxis(&qt, &v, d);  // 사원수를 회전
D3DXMatrixRotationQuaternion(&mat, &qt); // 사원수를 계산하는 행렬을 만듦
m_tmat *= mat;                           // 좌표변환을 합성
[/code]
위의 예에서는 D3DXMatrixRotationQuaternion() 함수를 사용하여 회전 사원수의 계산을 행렬로 변환하고, 다른 좌표변환과 합성하고 있는 것을 나타내고 있습니다.

(3) 사원수를 이용한 자세 제어
회전처리는 보통 절대좌표계를 기준으로 하여 회전합니다. 하지만 게임프로그램에서는 3D 모델을 중심으로 한 회전, 즉 3D 모델을 중심으로 좌표계를 기준하여 회전을 해야하는 경우가 자주 발생합니다. 예를 들어, 플라이트 시뮬레이터(Flight Simulator)에서는 비행기 기수를 위아래나 좌우로 선회하는 경우 등, 3D 모델을 중심으로 회전합니다. 3D 모델을 중심으로 하는 회전은 제 1.2.3 절 (2)에서 설명한 사원수를 이용한 회전처리를 이용하는 것으로 쉽게 구현이 가능합니다.

하지만 플라이트 시뮬레이터에서 비행기의 자세 제어같은 처리를 하는 경우는 회전축으로 사용하는 벡터를 신경쓸 필요없이, 좌표변환행렬을 그대로 이용하는 것이 가능합니다. 좌표변환행렬로부터 3D 모델의 자세 벡터를 얻어내는 방법을 그림5에 나타냈습니다.

DirectX1-5.gif
[ 그림 5. 3D 모델의 자세를 표시하는 벡터 ]


그림 5에 나타난 예에서는, 3D 모델 A에 대해 행렬M을 사용하여 좌표변환을 하고 있습니다. 그림 5에 나타난 것처럼 좌표변환행렬로부터 얻어낸 3개의 벡터를 각각 벡터 Vx, 벡터 Vy, 벡터 Vz라고 하겠습니다. 벡터 Vx, 벡터 Vy, 벡터 Vz는 3D 모델의 로컬 좌표계의 X 축, Y 축, Z 축의 중심을 나타내고 있습니다. 이 벡터 Vx, 벡터 Vy, 벡터 Vz를 축으로 회전을 처리함으로써, 3D 모델을 기준으로 회전을 구현하는 것이 가능합니다. 좌표변환행렬로부터 얻어낸 벡터를 축으로 회전처리를 하는 소스코드의 예는 다음과 같습니다.
[code]
D3DXQUATERNION qt;               // 사원수
D3DXVECTOR3 v(0.0f, 1.0f, 0.0f);     // 회전축을 나타낼 벡터
D3DXMATRIX mat;                  //행렬

// 단위 사원수로 초기화
qt.x = qt.y = qt.z = 0;
qt.w = 1.0f;

// 좌표변환행렬로부터 자세 벡터를 얻어냄
v.x = m_tmat._11;
v.y = m_tmat._12;
v.z = m_tmat._13;

D3DXQuaternionRotationAxis(&qt, &v, d);  // 사원수를 회전
D3DXMatrixRotationQuaternion(&mat, &qt); // 벡터와 사원수의 계산식을 행렬로 변환
m_tmat *= mat;                           // 좌표변환을 합성
[/code]

1.2.4 좌표변환의 합성
대량의 정점으로 구성된 3D모델의 좌표변환을 하는 경우, 좌표변환 처리의 계산량은 매우 방대해집니다. 그렇기 때문에 프로그램의 실행속도 향상을 위해서는 좌표변환의 횟수를 줄여야만 합니다.

좌표변환의 합성은 좌표변환의 횟수를 줄이기 위한 가장 기본적인 방법입니다. 좌표변환의 합성의 예는 그림 6과 같습니다.

DirectX1-6.gif
[ 그림 6. 좌표변환의 합성 ]


그림 6-a 또는 그림 6-b 어느쪽도 좌표평면의 결과는 동일하게 나타납니다. 그림 3의 예처럼, 먼저 변환을 합성해두는 것보다, 복수의 좌표변환의 계산을 한번에 하는 것이 가능하기 때문에, 프로그램의 실행속도는 비약적으로 증가합니다.

D3DXMATRIX 구조체는, 몇가지 연산자가 오버로딩되어 있습니다. 행렬을 계산하는 부분을 오버로딩된 연산자를 사용하면 소스코드를 간결하게 만들 수 있습니다. 오버로딩된 연산자를 사용하는 소스코드의 예는 아래와 같습니다.
[code]
D3DXMATRIX m1, m2;
(중략)
m1 *= m2;
[/code]
위는 *= 연산자에 의해 행렬 m1과 행렬 m2의 곱을 m1에 대입하고 있는 예입니다.

[code]
D3DXMATRIX m1, m2, m3, m4;
(중략)
m1 = m2 * m3 * m4;
[/code]
위는 * 연산자를 사용하여 m2, m3, m4의 곱을 m1에 대입하고 있는 예입니다.

하지만, 소스코드를 C언어로 작성하고 있는 경우에는, C++의 기능인 연산자 오버로딩은 사용할 수 없습니다.

1.3. 3D 모델의 표시
3D 모델의 표시의 처리에서는 투영변환과 래스터라이징이라는 2개의 처리를 순서에 맞게 해야합니다. 이번 절에서는 투영변환과 래스터라이징에 대해 설명하겠습니다.

1.3.1 투영변환
평면 스크린에 3D 그래픽을 표시하기 위해서는, 3D 공간의 정점이 스크린상의 어느 점에 대응하는지를 결정할 필요가 있습니다. 스크린 상에 점을 위치하는 작업이 투영변환입니다. 투영변환은 3D 좌표를 2D 좌표로 변환하는 것입니다.

Direct3D에서는 투영변환행렬이라고 부르는 행렬을 설정하게 되면, 자동적으로 투영변환이 이루어집니다. 투영변환행렬을 설정하는 루틴은 Direct3DX에 도우미 함수로 만들어져 있습니다. 투영변환행렬을 설정하는 소스코드의 예는 다음과 같습니다.

[code]
static LPDIRECT3DDEVICE9 s_lpD3DDevice = NULL; // Direct3DDevice9 객체의 포인터

// Direct3D 초기화 단계에 s_lpD3Ddevice에 유효한 값을 설정했다고 가정하겠습니다.
BOOL D3D9_SetProjection(float angle, float nearclip, float backclip)
{
    D3DXMATRIX mat; // 투영변환행렬을 저장할 구조체
    D3DXMatrixPerspectiveFovLH(&mat, angle, 1.0f, nearclip, backclip); // 투영변환행렬을 생성
    s_lpD3DDevice->SetTransform(D3DTS_PROJECTION, &mat); // 렌더링 파이프라인에 투영변환행렬을 설정

    return TRUE; // 성공, TRUE를 반환
}
[/code]

1.3.2 래스터라이징(Rasterizing)
래스터라이징이란 투영변환을 통해 얻은 결과를 화면에 표시가능한 형식인 래스터 데이터(raster data)로 변환하는 처리를 말합니다.

Direct3D에서 래스터라이징을 처리하는 방법은 여러가지가 있습니다. 여기서는 DrawSubset() 메써드(method)를 사용하겠습니다. DrawSubset() 메써드를 사용하는 것은 가장 간단한 래스터라이징 방법입니다. DrawSubset() 메써드를 사용하여 3D모델을 래스터라이징하는 소스코드의 예는 다음과 같습니다.
[code]
    // 재질(material)의 개수만큼 루프를 돈다. m_nMaterials는 X파일을 로드한 시점에 설정되어 있다.
    for (unsigned int u = 0;u < m_nMaterials;u++)
        m_lpMesh->DrawSubset(u); // 메시(mesh)를 그림
[/code]

1.4 실시간(real-time) 처리
게임 프로그램은 일반적인 애플리케이션과는 다른 방법으로 처리를 진행하기 때문에, 소스코드도 게임프로그램만의 방법으로기술해야 합니다. 이번 절에서는 일반적인 윈도 애플리케이션의 소스코드와 게임의 소스코드를 비교하여, 게임프로그램의 소스코드의 기술방법을 설명하겠습니다. 이번 절의 소스코드의 예는 windows.h 및 winmm.h를 포함(include)해야 합니다.

1.4.1 윈도 메시지의 처리
일반적인 윈도 애플리케이션에서 이용되고 있는 윈도메시지를 사용한 키 입력은 DirectX를 사용하는 애플리케이션에 있어서도 문제없이 사용할 수 있습니다. 하지만, 게임프로그램에서는 실시간 처리를 요하기 때문에, 게임루프라고 부르는 특수한 메시지루프를 사용하는 것이 일반적입니다. 게임루프의 소스코드의 예는 다음과 같습니다.
[code]
while(TRUE) // 게임루프를 시작
{
    // 메시지큐에 윈도메시지가 존재하는지 확인
    if (PeekMessage(&msg , NULL , 0 , 0 , PM_NOREMOVE))
    {
        // 윈도메시지를 얻음. 얻어낸 윈도메시지가 WM_QUIT일 경우 루프를 탈출.
        if (!GetMessage(&msg , NULL , 0 , 0))
            break;

        TranslateMessage(&msg); // 윈도메시지를 변환
        DispatchMessage(&msg);  // 윈도메시지를 송출
    }
    else
    {
        if (g_bAppActive) // 이 애플리케이션이 활성화되어 있는지 확인
        {
            }
    }
}
[/code]
PeekMessage() 함수는 메시지큐 내의 메시지의 유무를 조사하는 함수입니다. 메시지큐란 윈도에게 보내진 메시지가 처리될때까지 일시적으로 쌓여있는 영역입니다. 미리 메시지의 유무를 조사해두는 것으로, GetMessage() 함수가 메시지를 대기하여 프로그램의 실행이 중단되는 것을 방지할 수 있습니다.

일반적인 애플리케이션에서는 일련의 윈도메시지의 처리가 종료되면 다음 윈도메시지가 올 때까지 대기합니다. 그렇기에 일반적인 애플리케이션에서는 PeekMessage() 함수를 사용할 필요가 없습니다. 하지만 게임 프로그램에서는 윈도메시지를 대기하는 대신 게임의 처리를 진행하는 것으로 실시간 처리를 실현하는 것입니다. 그렇기에 게임프로그램에서는 일반적인 메시지처리 대신 게임루프를 구현합니다. 게임루프의 이미지를 그림7에 나타냈습니다.

DirectX1-7.gif
[ 그림 7. 게임루프의 이미지 ]


1.4.2 실시간 처리의 구현
제1.4.1항에서 설명한 것처럼, 게임 프로그램에서는 게임루프를 구현하는 것으로 윈도메시지를 대기하지 않고 처리를 진행합니다. 그런데 게임 프로그램에서 입력을 처리하는 경우는 윈도로부터 유저의 입력을 통지해 받는 것이 아니라, 프로그램 측에서 능동적으로 키보드나 마우스의 상태를 조사하는 스타일을 사용합니다. 프로그램 측이 보통 이벤트의 발생을 관찰하는 것을 폴링(polling)이라 부릅니다.

윈도 상에서 폴링에 의한 입력을 처리하는 방법으로 사용하는 API를 표2에 정리하였습니다.



Win32API 함수설명
BOOL GetCursorPos(LPPOINT lpPoint);현재 마우스 커서의 위치를 얻습니다.
SHORT GetAsyncKeyState(int vKey);설정한 키의 현재 눌림 상태를 얻습니다.
MMRESULT joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji);현재 조이스틱의 상태를 얻습니다.

[ 표2. 폴링에 의한 입력처리를 사용하는 주요한 API ]


키보드로부터 입력을 폴링하는 경우는 GetAsyncKeyState() 함수를 사용합니다. GetAsyncKeyState() 함수를 사용하면 2개 이상의 키가 동시에 눌려있는 경우도 정확히 판정할 수 있습니다. GetAsyncKeyState() 함수를 사용하여 키 입력을 하는 소스코드의 예는 다음과 같습니다.
[code]
DWORD k;
k = GetAsyncKeyState(VK_SPACE); // 스페이스 바의 눌림 상태를 얻어옴
if (k & 0x8000) // 최상위 비트가 설정되어 있으면 키가 눌려있는 것임
{

}
[/code]

마우스로부터의 입력을 관찰하는 방법으로는 커서의 위치인 GetCursorPos() 함수, 버튼의 상태인 GetAsyncKeyState() 함수를 통하여 이루어집니다. 마우스 커서의 현재위치의 좌표를 얻는 소스코드의 예는 다음과 같습니다.
[code]
POINT pt; // 좌표를 저장할 구조체
GetCursorPos(&pt); // 마우스 커서의 현재위치의 좌표를 얻어옴
[/code]
다음의 소스코드는 GetAsyncKeyState() 함수를 사용하여 마우스 버튼의 상태를 얻어오는 예입니다.
[code]
if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) // API 반환값의 최상위비트가 설정되어 있으면 버튼이 눌려있는 것임
{
    // 왼쪽 버튼이 눌려있는 경우에 대한 처리
}

if (GetAsyncKeyState(VK_RBUTTON) & 0x8000) // API 반환값의 최상위비트가 설정되어 있으면 버튼이 눌려있는 것임
{
    // 오른쪽 버튼이 눌려있는 경우에 대한 처리
}
[/code]

윈도 애플리케이션에서는 조이스틱의 입력도 표준 API로 처리할 수 있습니다. 다음은 조이스틱의 레버(방향키)의 상태를 얻어오는 소스코드의 예입니다.
[code]
#define BORDER_LOW   (32768 - 4096) // 스틱의 한계값(상, 좌)을 정의
#define BORDER_HIGH  (32768 + 4096) // 스틱의 한계값(하, 우)를 정의


JOYINFOEX ji;           // 조이스틱의 상태를 저장할 구조체
ji.dwSize = sizeof(ji); // dwSize 멤버를 초기화
::joyGetPosEx(0, &ji);  //joyGetPosEx API를 호출하여 조이스틱의 상태를 얻어옴
if (ji.dwXpos < BORDER_LOW) // 스틱의 X좌표가 한계값 이하인지 검사
{
    // 왼쪽이 눌린 경우에 대한 처리
}

if (ji.dwXpos > BORDER_HIGH) // 스틱의 X좌표가 한계값 이상인지 검사
{
    // 오른쪽이 눌린 경우에 대한 처리
}
[/code]

1.5 정리
이번 장에서는 3D 그래픽스의 기초인 행렬을 사용한 좌표변환과, 좀더 고난도의 회전행렬을 하기 위한 사원수에 대하여 설명하였습니다. 또한 게임프로그램 특유의 구조와 특수한 Windows API에 대해서도 설명하였습니다. 이것으로 DirectX를 이용하여 3D 모델을 화면에 표시고 유저로부터 입력을 받는 프로그램의 작성이 가능하게 되었습니다.

다음 회는 시점을 다루는 방법과 캐릭터 관리 방법에 대하여 설명하겠습니다.

----------------------------------------

DirectX를 이용한 게임프로그래밍 입문
이 연재는 C++ 언어와 DirectX의 기초적인 지식이 있는 분을 대상으로 하고 있습니다.

제 1 장. 3D 게임 프로그래밍의 기초 (2003년 5월 1일)
제 2 장. DirectX Graphics의 기초 (2003년 8월 11일)
제 3 장. DirectX Graphics의 특수효과 (2003년 8월 11일)
제 4 장. 네트워크게임의 입문 (2003년 8월 11일)
제 5 장. 게임 개발 입문 (2003년 8월 21일)
제 6 장. 실전 게임 개발 (2003년 8월 29일)

----------------------------------------

저자약력

다나카 시게노리 (田中 成典)
1986년 칸사이대학 공학부 토목공학과 졸업
1988년 칸사이대학원 공학연구과 토목공학전공박사과정 전기과정 수료
1996년 박사(공학) 수여, 칸사이대학
1997년 칸사이대학 종합정보학부 조교수 (현재)
주요한 저서:
-        쉬운 C의 시작방법, 옴사(社), 1993년
-        건설기술자를 위한 지식정보처리의 실천, 칸사이대학출판부, 1999년
-        DirectX8, 공학사, 2001년
-        스텝업 XML, 공학사, 2002년
-        Linux 애플리케이션 입문, 모리키타(森北) 출판, 2002년 등

나카야마 코타로 (中山 浩太郎)
2001년 3월 칸사이대학 종합정보학과 졸업
2003년 3월 칸사이대학 대학원 종합정보학연구과 박사과정 전기과정 수료
2003년 4월 칸사이대학 대학원 종합정보학연구과 박사과정 후기과정 입학 (현재)
주요한 저서:
-        Web 공방 시리즈 Perl의 달인, 모리키타(森北) 출판, 1999년
-        결정판 Visual Basic, 쿄리츠(共立) 출판, 2000년
-        DirectX8, 공학사, 2001년
-        Linux 애플리케이션 입문, 모리키타(森北) 출판, 2002년
-        스텝업 Visual C# .NET 입문, 공학사, 2002년 등

나카무라 켄지 (中村 健二)
2000년 4월 칸사이대학 종합정보학부 종합정보학과 입학 (현재)
주요한 저서: DirectX8 & VC++ 3D의 기초와 게임의 제작방법, 공학사, 2002년

키타가와 에츠지 (北川 悦司)
2000년 3월 칸사이대학 종합정보학부 종합정보학과 졸업
2002년 3월 칸사이대학 대학원 종합정보학연구과 박사과정 전기과정 수료
2002년 4월 칸사이대학 대학원 종합정보학연구과 박사과정 후기과정 입학 (현재)
주요한 저서:
-        Web 공방 시리즈 Java의 달인, 모리키타(森北) 출판, 1999년
-        디지털 카메라 활용을 통한 디지털사진측량입문, 모리키타(森北) 출판, 2000년
-        스텝업 XML 활용법, 공학사, 2002년

우에야마 사토시 (上山 智士)
2002년 4월 칸사이대학 종합정보학부 종합정보학과 입학 (현재)

스기마치 토시유키 (杉町 敏之)
2003년 3월 칸사이대학 종합정보학부 종합정보학과 졸업
2003년 4월 칸사이대학 대학원 종합정보학연구과 입학 (현재)
주요한 저서: 스텝업 Visual C# .NET 입문, 공학사, 2002년

노나카 카즈키 (野中 一希)
2003년 3월 칸사이대학 종합정보학부 종합정보학과 졸업
2003년 4월 칸사이대학 대학원 종합정보학연구과 입학 (현재)
주요한 저서: 스텝업 Visual C# .NET 입문, 공학사, 2002년