È­¸é¿¡ ¹º°¡¸¦ ±×·Á º¸µµ·Ï ÇÏÀÚ. 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);
}