안녕하세요? 벌날개입니다.

다음은 제가 MSDN의 Direct 3D 의 튜토리얼문서를 번역한 것입니다.
-------------------------------------------------------------

번역 : 벌날개

Microsoft DirectX 8.1 (C++)

Tutorial 2: Rendering Vertices(버텍스 랜더링)

Direct3D로 짜여진 애플리케이션은 도형들을 그릴 때 버텍스를 사용한다.
각 3차원 장면들은 한개이상의 이런 도형들로 이루어져 있다.
버텍스 샘플은 가장 간단한 도형인 삼각형을 만들고 그것을 화면에 랜더한다.

이 튜토리얼은 다음과 같은 순서로 버텍스로 삼각형을 만드는 방법을 알려준다.

Step 1: Defining a Custom Vertex Type (사용자 버텍스 타입 정의)
Step 2: Setting Up the Vertex Buffer (버텍스 버퍼 세팅)
Step 3: Rendering the Display (화면 랜더링)

예제 파일 위치 :
    (SDK root)\Samples\Multimedia\Direct3D\Tutorials\Tut02_Vertices.

이 샘플 코드는 CreateDevice 샘플하고 겹치는 부분이 존재한다.
Rendering Vertices 튜토리얼은 버텍스를 중점적으로 설명하지, 그외의 것들(Direct3D 초기화, 윈도우메세지, 종료등 )
을 다루지 않는다. 이러한 것들을 보려면 튜토리얼 1을 참고하자.


Step 1: Defining a Custom Vertex Type (사용자 버텍스 타입 정의)

Vertices 샘플은 세개의 버텍스를 이용해서 2-D 삼각형을 랜더한다.
이 샘플은 버텍스 버퍼의 개념을 보여준다.
버텍스들은 FVF(Flexible Vector Format)와 사용자 버텍스 구조체를 이용해서 만들어질 수 있다.
이 샘플의 버텍스들을 정의한 형식은 다음 코드와 같다.

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // The transformed position for the vertex.
    DWORD color;        // The vertex color.
};

이 구조체는 사용자 버텍스 타입을 나타내고 있다.
다음 단계는 버텍스 버퍼에 있는 버텍스 정보를 나타내는 FVF를 정의하는 일이다.
다음 코드는 위에서 만든 사용자 버텍스 타입과 일치하는 FVF를 정의한다.

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

FVF 플래그는 사용된 사용자 버텍스 형식이 무엇인지를 나타낸다.
위의 샘플 코드는 D3DFVF_XYZRHW 와 D3DFVF_DIFFUSE 라는 플래그를 쓰는데,
이것은 버텍스 버퍼가 칼라값을 가지고 있고 트랜스폼된 2차원 형식이라는 걸 나타낸다.

이제 사용자 벡터 형식과 FVF가 정의되었고, 다음 단계는 버텍스 버퍼를 버텍스로 채우는 일이다.

NOTE : 이 샘플의 버텍스들은 트랜스폼되었다. 이게 무슨 말이냐면,
버텍스들이 이미 2차원 윈도우 좌표가 되었다는걸 의미한다.
이것은 (0,0)이 왼쪽 상단 끝의 좌표가 된다는 걸 의미한다.
이 버텍스들은 스스로 빛을 낸다. 이것은 버텍스들이 Direct3D 의 라이팅을 쓰지않지만 스스로 컬러를 낸다는걸
의미한다.


Step 2: Setting Up the Vertex Buffer (버텍스 버퍼 세팅)

이제 사용자 버텍스 형식이 정의되었고, 버텍스를 초기화할 단계다.
이 샘플은 InitVB 함수를 호출한다.
다음 코드는 세 사용자 버텍스들을 초기화하는 코드들이다.

CUSTOMVERTEX g_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, },
};

이 코드는 각 버텍스들이 스스로 색을 내고, 세 버텍스로 이루어진 삼각형을 정의한다.
첫 버텍스는 (150,50)에 위치하고 색은 red (0xffff0000) 이다.
두번째 버텍스는 (250,250)이고 green (0xff00ff00) 이다.
세번째 버텍스는 (50,250)이고 blue-green (0xff00ffff) 이다.
각 점들은 깊이값 0.5를 가지고 있고, RHW 값은 1.0 이다.

다음 단계는 IDirect3DDevice8::CreateVertexBuffer 함수를 이용해서 다음과 같이 버텍스 버퍼를 생성하는 일이다.

if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                              0 /* Usage */, D3DFVF_CUSTOMVERTEX,
                                              D3DPOOL_DEFAULT, &g_pVB ) ) )
    return E_FAIL;

CreateVertexBuffer의 처음의 두 파라메터는 Direct3D 버텍스 버퍼의 크기를 나타낸다.
다음의 두 파라메터는 벡터 형식과 메모리 로케이션을 나타낸다.
여기에 쓰인 벡터 포맷 D3DFVF_CUSTOMVERTEX 는 전 단계에서 정의한 FVF이다.
D3DPOOL_DEFAULT 플래그는 이 버퍼를 쓰기에 가장 적당한 메모리에 위치하도록 하게 해준다.
마지막 파라메터는 만들어질 버텍스 버퍼의 주소이다.

버텍스 버퍼를 생성한 후, 다음과 같이 사용자 버텍스들로 버퍼가 채워진다.

VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) )
    return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
g_pVB->Unlock();

IDirect3DVertexBuffer8::Lock 라는 함수에 의해 버텍스 버퍼를 lock된다.
첫번째 파라메터는 lock될 버텍스 데이터의 offset이다.
두번째 파라메터는 lock될 버텍스 데이터의 크기이다.
세번째 파라메터는 버텍스 데이터의 포인터들로 채워질 BYTE 포인터의 주소이다.
네버째 파라메터는 버텍스 버퍼가 어떻게 데이터를 lock할 것인지를 보여준다.

버텍스들은 memcpy를 이용해서 버텍스버퍼들로 채워진다.
버텍스 버퍼가 버텍스들로 채워지면 IDirect3DVertexBuffer8::Unlock 이라는 함수를 이용해서 버텍스 버퍼를 unlock 한다.
이 lock/unlock 의 매커니즘은 버텍스 버퍼가 디바이스 메모리로 쓰일 수 있기 때문에 필요한다.

이제 버텍스 버퍼가 버텍스들로 채워졌고, 이것을 랜더할 차례이다.