카테고리 Archives: 학습

[DX9] 2.정점의 렌더링 2 – 정점 버퍼의 설정

커스텀 정점 포맷이 정의 되면 다음은 정점을 초기화 합니다. Vertices 샘플 프로젝트에서는 필요한 Direct3D 오브젝트를 작성한 후에 애플리케이션 정의 함수인 InitVB를 호출해 이것을 실행합니다. 다음 샘플 코드는 3개의 커스텀 정점의 값을 초기화 합니다.

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

상기 샘플 코드에서는 3개의 정점을 3각형의 포인트로 채우고 각 정점이 방사하는 컬러를 지정합니다. 제1포인트는  (150, 50)이고 컬러는 빨강(0xffff0000)입니다. 제2포인트는(250, 250)이고 컬러는 초록(0xff00ff00)입니다. 제3포인트는 (50, 250)이고 컬러는 청록(0xff00ffff)입니다. 이들 포인트는 각각 심도치는 0.5, RHW(Reciprocal of the W coordinate from the Homogeneous point;동차 좌표 w 성분의 역수)는 1.0입니다.

다음은 아래의 샘플코드에 나타낸 것처럼 IDirect3DDevice9::CreateVertexBuffer 를 호출해 정점 버퍼를 작성합니다.

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

IDirect3DDevice9::CreateVertexBuffer 의 최초 두개의 파라메터는 Direct3D 에 새로운 정점 버퍼의 필요 사이즈와 용도를 지시합니다. 다음 2개의 파라메터는 새로운 버퍼의 벡터 포맷과 메모리 위치를 지정합니다. 여기서는 벡터 포맷은  D3DFVF_CUSTOMVERTEX 으로 샘플 코드가 이전에 지정한 플렉서블 정점 포맷 (FVF) 입니다. D3DPOOL_DEFAULT 플래그는 Direct3D 에 이 정점 버퍼에 최적의 메모리를 할당해 정점 버퍼를 작성하도록 지시합니다. 마지막 파라메터는 작성하는 버퍼의 어드레스입니다.

정점 버퍼의 작성 후 다음 샘플 코드에 나온 것처럼 커스텀 정점 데이터로 그것을 채웁니다.

VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
    return E_FAIL;

memcpy( pVertices, vertices, sizeof(vertices) );

g_pVB->Unlock();

우선 IDirect3DVertexBuffer9::Lock 을 호출해 정점 버퍼를 록합니다. 첫번째 파라메터는 록할 정점 데이터의 오프셋(바이트 단위)입니다. 두번째 파라메터는 록할 정점 데이터의 사이즈(바이트 단위)입니다. 세번째 파라메터는 BYTE 포인터의 어드레스로 정점 데이터로 포인터를 격납합니다. 4번째 파라메터는 정점 버퍼에 데이터의 록 방법을 지시합니다.

그 다음 memcpy 를 사용해 정점은 정점 버퍼에 복사됩니다. 정점 버퍼에 정점이 읽어들여지면  IDirect3DVertexBuffer9::Unlock 을 호출해 정점 버퍼의 록을 해제합니다. 정점 버퍼는 디바이스 메모리 내에 존재할 가능성이 있으므로 이 록, 그리고 록 해제의 메카니즘이 필요합니다.

이것으로 정점 버퍼에 정점이 격납됩니다. 다음은「 3 – 표시의 렌더링」에서 표시를 렌더링 하는 것을 다룹니다.

[DX9] 2.정점의 렌더링 1 – 커스텀 정점 타입의 정의

Direct3D로 기술된 애플리케이션에서는 정점을 사용해,지오메트리 쉐이프를 그립니다. 각 3차원(3D) 신에는 이들 지오메트리 쉐이프가 1개 이상 포함되어 있습니다. Vertices 샘플 프로젝트에서는 가장 단순한 쉐이프인 삼각형을 작성해 그것을 렌더링해 표시합니다.

이 튜토리얼에서는 다음 스텝에 따라 정점을 사용해 삼각형을 작성하는 방법을 보여줍니다.

=================
[DX9] 2.정점의 렌더링 1 – 커스텀 정점 타입의 정의

Vertices 샘플 프로젝트는 3개의 정점(vertex; vertices(복수형))을 사용해 2D 삼각형을 렌더링 합니다. 이것은 정점 버퍼(vertex buffer)의 개념, 다시말해 정점을 격납해 렌더링 하기위해 사용되는 Direct3D 오브젝트를 도입하고 있습니다. 정점의 정의하는 방법은 다양하며, 커스텀 정점 구조체와 대응하는 커스텀 플렉서블 정점 포맷(FVF)을 지정하는 등 다양한 방법이 있습니다. Vertices 샘플 프로젝트의 정점 포맷을 다음 샘플 코드에 나타냈습니다.

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)

D3DFVF 는 어떤 커스텀 정점 타입이 사용됐나를 나타냅니다. 상기 샘플 코드에는 D3DFVF_XYZRHW 플래그와 D3DFVF_DIFFUSE 플래그를 사용하고 있습니다. 이 플래그들은, 커스텀 정점 타입이 트랜스폼된 포인트와 그에 따른 컬러 성분을 가졌다는 것을 정점 버퍼에 통지 합니다.

여기서 커스텀 벡터 포맷과 FVF가 지정됩니다. 다음은 「2 – 정점 버퍼의 설정」으로 정점 버퍼를 정점으로 채우는 것 입니다.

주의
Vertices 샘플 프로젝트의 정점은 트랜스폼 되어있습니다. 다시말해, 이미 2D 윈도우 좌표화 되어있습니다. 이것은 포인트 (0,0)이 좌상측 모서리에 위치하며 X축 방향으로 증가하는 것은 오른쪽으로 향하는 것, Y축 방향으로 증가하는 것은 아래로 향한다는 것을 의미합니다. 또, 이것들의 정점은 강조 표시(lit) 되어있습니다. 다시말해 Direct3D 라이팅은 사용하지 않습니다만, 각각 컬러가 지정되어있습니다.