화면에 뭔가를 그려 보도록 하자. C 프로그래밍을 처음 배울때 "Hello World!"를 보여 주듯이 
삼각형 2개를 그려보자.

추가된 사항은 다음과 같다.

1.버텍스 버퍼의 포맷과 구조체 선언 --> 2.버텍스 버퍼의 초기화 --> 3.렌드링 --> 4.소멸

1. 버텍스 버퍼의 포맷과 구조체 선언
다이렉트 8.0부터 버텍스 버퍼라는 개념이 도입되었다. 버텍스 버퍼를 사용하기 위해서는 버텍스 버퍼의
구조체와 포맷을 선언해야 한다.

//버텍스 구조체와 타입 선언



struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; };
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE )
버텍스 포맷과 순서는 MS의 다이렉트 SDK 문서를 참고한다.

D3DFVF_XYZRHW: 2D 게임이나 인터페이스를 만들때 사용하는 포맷이다.(자세한 설명은 귀찮아서 생략...)
D3DFVF_DIFFUSE: 버텍스 칼라를 사용한다.

2.버텍스 버퍼의 초기화
버텍스 버퍼를 초기화 하기 전에 버텍스 버퍼 포인터(IDirect3DVertexBuffer8)를 선언해야 한다.
LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer = NULL; // our VertexBuffer
버텍스 버퍼를 만들 모든 준비가 되었으니 한번 만들어 보자.
bool RenderInit()
{
	CUSTOMVERTEX g_Vertices[] =
	{
		{  60.0f,  60.0f, 0.5f, 1.0f, 0xffff0000, },
		{ 200.0f,  60.0f, 0.5f, 1.0f, 0xff00ff00, },
		{  60.0f, 200.0f, 0.5f, 1.0f, 0xff0000ff, },

		{  80.0f, 220.0f, 0.5f, 1.0f, 0xff0000ff, },
		{ 220.0f,  80.0f, 0.5f, 1.0f, 0xff00ff00, },
		{ 220.0f, 220.0f, 0.5f, 1.0f, 0xffffff00, },
	};

	g_d3d_Device->CreateVertexBuffer (6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer);
	
	VOID* pVertices;
	g_VertexBuffer->Lock (0, sizeof(g_Vertices), (BYTE**)&pVertices, 0);
       memcpy (pVertices, g_Vertices, sizeof(g_Vertices));
       g_VertexBuffer->Unlock();
	
	return true;
}
- 위에 그림에서 보듯 2개의 삼각형이 있으므로 6개의 버텍스가 필요하다.
- CreateVertexBuffer에서 6개의 Vertex 정보가 있으므로 6*sizeof(CUSTOMVERTEX)크기를 넣는다.
  두번째 파라메터에서는 버텍스 제어가 필요하지 않으므로 일단은 0으로 셋팅한다.
  다음은 우리가 사용할 버텍스 형태(D3DFVF_CUSTOMVERTEX)를 알려주고 메모리 사용 파라메터를 
  넣는다. 
  무슨 말인지는 모르니 디폴트로 D3DPOOL_DEFAULT를 넣자.
  마지막으로 돌려 받을 LPDIRECT3DVERTEXBUFFER8이다 

- 버텍스 버퍼에 접근하기 위해서 락을 건다.
- 원하는 버텍스 값을 버텍스 버퍼에 넣는다.
- 버텍스 버퍼의 락을 해제한다.
3.렌드링
화면에 보여줄 모든 작업 준비가 되었다. RenderLoop()에 추가해야 할 작업이 있다.
렌드링 처리를 RenderLoop()에서 했는데, 지금 부터는 Render3D()에서 하게 될것이다.
디바이스를 상실했을때 처리를 하기 위해 렌드링 처리를 Render3D()뺐다.



HRESULT RenderLoop()
{
    // Render the scene as normal
	HRESULT hr;
    if( FAILED( hr = Render3D() ) )
        return hr;

	return S_OK;
}
//-----------------------------------------------------------------------------
HRESULT Render3D ()
{
	HRESULT hr;
    g_d3d_Device->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 1.0f, 0);
    g_d3d_Device->BeginScene ();

    g_d3d_Device->SetVertexShader (D3DFVF_CUSTOMVERTEX);
    g_d3d_Device->SetStreamSource (0, g_VertexBuffer, sizeof(CUSTOMVERTEX));
    g_d3d_Device->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 2);

    g_d3d_Device->EndScene ();
    hr = g_d3d_Device->Present (NULL, NULL, NULL, NULL);
	return hr;
}

Render3D() 함수를 보자.
- 그릴 버텍스 버퍼의 포맷을 먼저 셋팅한다.
- 버텍스 버퍼를 디바이스 스트림에 연결한다. 첫번째 파라미터는 어쩌구 저쩌구 나오는데 모르겠다.
  그냥 0을 넣기 바란다. 2번째 파라미터는 버텍스 버퍼의 포인터이다.  
  마지막 3번째 포인터는 데이터 포맷의 크기이다.
- 첫번째 인자에는 그릴 형태의 모양을 지정하고, 두번째는 시작 버텍스 점이다. 
  마지막 인자는 첫 번째 파라미터에서 지정한 그릴 형태의 수이다. 2개의 삼각형이므로 2를 넣는다.
  (오른쪽만 그리고 싶다면 DrawPrimitive (D3DPT_TRIANGLELIST, 3, 1)을 넣으면 된다)

 

4.소멸
프로그램을 끝내기 전에 DestroyDirect3D8()함수에서 버텍스 버퍼를 해제를 추가한다.


oid DestroyDirect3D8 ()
{
	_RELEASE_ (g_VertexBuffer);
	_RELEASE_ (g_d3d_Device);
	_RELEASE_ (g_d3d);
}