ÀÌÀå¿¡¼­´Â Ä«¸Þ¶ó¸¦ ÃʱâÈ­ ÇÏ°í 3D °ø°£¿¡ ÆĶõ»öÀÇ Æò¸é »ç°¢ÇüÀ» ¶ç¿î´Ù.

=================================================================================
1. Ä«¸Þ¶ó 
Ä«¸Þ¶ó¸¦ ÃʱâÈ­ ÇÒ¶§ ÇÊ¿äÇÑ ±âº»ÀûÀÎ º¯¼öÀÇ Çü¿¡ ´ëÇؼ­ ¾Ë¾Æ º¸ÀÚ.
Ä«¸Þ¶ó¿¡ ÇÊ¿äÇÑ D3DXMATRIX´Â 4 X 4Çà·ÄÀ» ³ªÅ¸³»´Â º¯¼ö·Î D3DMATRIX¸¦ »ó¼Ó ¹Þ¾Ò´Ù.

typedef struct D3DXMATRIX : public D3DMATRIX 
{
  ........
  ........
  ........
}

typedef struct _D3DMATRIX {
    union {
        struct {
            float        _11, _12, _13, _14;
            float        _21, _22, _23, _24;
            float        _31, _32, _33, _34;
            float        _41, _42, _43, _44;

        };
        float m[4][4];
    };
} D3DMATRIX;

D3DXVECTOR3´Â 3Â÷¿ø¿¡¼­ °ø°£ÁÂÇ¥¸¦ Ç¥½ÃÇÏ´Â º¯¼ö·Î D3DVECTOR¸¦ »ó¼Ó ¹Þ¾Ò´Ù.

typedef struct D3DXVECTOR3 : public D3DVECTOR 
{
  ........
  ........
  ........
}

typedef struct _D3DVECTOR {
    float x;
    float y;
    float z;
} D3DVECTOR;

void SetupCamera ()¿¡¼­ Ä«¸Þ¶ó ºä¿Í ÇÁ·ÎÁ§¼ÇÀ» ¼³Á¤ÇÑ´Ù.

1) Ä«¸Þ¶ó ºä ¼³Á¤ 
D3DXMATRIX *D3DXMatrixLookAtLH(
                   D3DXMATRIX *pOut,
                   CONST D3DXVECTOR3 *pEye,
                   CONST D3DXVECTOR3 *pAt,
                   CONST D3DXVECTOR3 *pUp)

ù¹ø° ÀÎÀÚ´Â ÇÔ¼öÀÇ °á°ú°ªÀ» ¹Þ´Â´Ù.
µÎ¹ø° ÀÎÀÚ´Â Ä«¸Þ¶óÀÇ ¿øÁ¡À» ³ªÅ¸³½´Ù.
¼¼¹ø° ÀÎÀÚ´Â Ä«¸Þ¶óÀÇ Å¸°Ù À§Ä¡¸¦ ³ªÅ¸³½´Ù.
³×¹ø° ÀÎÀÚ´Â Ä«¸Þ¶óÀÇ ¿ùµå °ø°£ÀÇ À§ÂÊ ¹æÇâÀ» ³ªÅ¸³»´Âµ¥ ÀϹÝÀûÀ¸·Î (0, 1, 0)ÀÌ´Ù.

Ä«¸Þ¶ó ¸ÞÆ®¸¯½º¸¦ È°¼ºÈ­ ½ÃÅ°±â À§Çؼ­ SetTransform()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

HRESULT SetTransform(
  D3DTRANSFORMSTATETYPE State,
  CONST D3DMATRIX* pMatrix
);

ù¹ø° ÀÎÀÚ¿¡´Â D3DTS_VIEW¸¦ ³Ö¾î Ä«¸Þ¶óºä¸¦ ¼³Á¤ÇÑ´Ù.
µÎ¹ø° ÀÎÀÚ¿¡´Â D3DXMatrixLookAtLH()ÇÔ¼öÀÇ °á°ú°ªÀ» ³Ö´Â´Ù.

2)ÇÁ·ÎÁ§¼Ç ¼³Á¤
°ø°£ÀÌ Ä«¸Þ¶ó ºä¸¦ ÅëÇؼ­ ¾î¶»°Ô º¸À̴°¡¸¦ ¼³Á¤ÇÏ´Â ÇÔ¼öÀÌ´Ù.
D3DXMATRIX *D3DXMatrixPerspectiveFovLH(
              D3DXMATRIX *pOut,
              FLOAT fovy,
              FLOAT Aspect,
              FLOAT zn,
              FLOAT zf);

ù¹ø° ÀÎÀÚ´Â ÇÔ¼öÀÇ °á°ú°ªÀ» ¸®ÅϹ޴´Ù.
µÎ¹ø° ÀÎÀÚ´Â Ä«¸Þ¶ó ºäÀÇ º¸ÀÌ´Â ¿µ¿ª(fov)À» ¶óµð¾ÈÀ¸·Î ³ªÅ¸³»´Âµ¥ ÀϹÝÀûÀ¸·Î D3DX_PI/4¸¦ »ç¿ëÇÑ´Ù.
¼¼¹ø° ÀÎÀÚ´Â °¡·Î ¼¼·Î È­¸é ºñÀ²ÀÌ´Ù.
³×¹ø° ÀÎÀÚ´Â Ä«¸Þ¶ó ºäÀÇ NEAR ÀÎÀÚ¸¦ ³ªÅ¸³»´Âµ¥, ´õ °¡±îÀÌ ÀÖ´Â ¹°Ã¼´Â º¸ÀÌÁö ¾Ê´Â´Ù.
´Ù¼¸Â° ÀÎÀÚ´Â Ä«¸Þ¶ó ºäÀÇ FAR ÀÎÀÚ¸¦ ³ªÅ¸³»´Âµ¥, ´õ ¸Ö¸® ÀÖ´Â ÀÎÀÚ´Â º¸ÀÌÁö ¾Ê´Â´Ù.

ÇÁ·ÎÁ§¼Ç ¸ÞÆ®¸¯½º¸¦ È°¼ºÈ­ ½ÃÅ°±â À§ÇØ SetTransform()ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù.
ù¹ø° ÀÎÀÚ¿¡ D3DTS_PROJECTION, µÎ¹ø° ÀÎÀÚ¿¡  D3DXMatrixPerspectiveFovLH() ÇÔ¼öÀÇ °á°ú°ªÀ» ³Ö´Â´Ù.

================================================================================= 2. Ä®¶ó »ç°¢Çü ±×¸®±â 1)¹öÅؽº ¹öÆÛÀÇ Å¸ÀÔ°ú ±¸Á¶Ã¼ ¼±¾ð *** Áö±Ý±îÁö´Â D3DFVF_XYZRHW¿É¼ÇÀ» »ç¿ëÇ߱⠶§¹®¿¡ 2DÈ­¸é¿¡ ±×¸®´Â°Í°ú °°Àº°Í¿´´Ù. ÀÌ ¿É¼ÇÀº ÀÎÅÍÆäÀ̽º³ª 2D °ÔÀÓÀ» ¸¸µé¶§, »ç¿ë µÇ´Â ¿É¼ÇÀÌ´Ù. ¹öÅؽºÀÇ Æ÷ÀÎÅÍ¿Í Ä®¶ó¸¦ ¼±¾ðÇÑ´Ù. struct CUSTOMVERTEX { FLOAT x, y, z; DWORD color; }; #define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE) 2) InitD3D()ÇÔ¼ö¿¡ ÃʱâÈ­ Ãß°¡ *** g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff ); g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); 3D °ø°£¿¡ ±×¸®±â À§Çؼ­ ¸î°¡ ·»´õ¸µ »óŸ¦ ¼³Á¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº Ã¥À̳ª MS ¹®¼­¸¦ º¸±â ¹Ù¶õ´Ù. D3DRS_ZENABLE ¿É¼ÇÀº Z-¹öÆÛ¸¦ È°¼ºÈ­ ½ÃŲ´Ù. D3DRS_AMBIENT ¿É¼ÇÀº Ambient Light Ä®¶ó¸¦ ¼³Á¤ÇÑ´Ù. µðÆúÆ®·Î 0ÀÌ´Ù. D3DRS_LIGHTING ¿É¼ÇÀº ¶óÀÌÆÃÀ» È°¼ºÈ­ ½ÃŲ´Ù. µðÆúÆ®·Î TRUEÀÌ´Ù. FALSE ½ÃÅ°Áö ¾ÊÀ¸¸é »ç°¢ÇüÀÌ ½ÃÄ¿¸Ý°Ô ³ª¿Â´Ù. 3) ¹öÅؽº Æ÷¸Ë ó¸® *** void RenderInit() a. ¹öÅؽº ¹öÆÛ »ý¼º b. ¹öÅؽº ¹öÆÛ ¶ô c. µ¥ÀÌÅ͸¦ ¹öÅؽº ¹öÆÛ·Î º¹»ç d. ¹öÅؽº ¹öÆÛ ¶ô ÇØÁ¦ a. ¹öÅؽº ¹öÆÛ »ý¼º ¹öÅؽº ¹öÆÛ¸¦ »ý¼ºÇϱâÀü¿¡ ¹öÅؽº ¹öÆÛ¿¡ µé¾î°¥ ¹öÅؽº Á¤º¸¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸²°ú Äڵ带 º¸¸é ½¬¿ï °Ì´Ï´Ù. ´ÙÀÌ·ºÆ® X´Â ¿Þ¼Õ ÁÂÇ¥°è¸¦ »ç¿ëÇÑ´Ù. Äøµ ¸ðµå´Â µðÆúÆ®·Î D3DCULL_CCW(¹Ý½Ã°è ¹æÇâ Äøµ)À̱⠶§¹®¿¡ »ï°¢ÇüÀÇ µÎ¸£±â ¼ø¼­¸¦ ½Ã°è ¹æÇâÀ¸·Î ±×¸°´Ù.

CUSTOMVERTEX vertex[4]; float fSizeX = 5.0f; float fSizeY = 5.0f; // Create the geometry vertex[0].x = -fSizeX/2; vertex[0].y = fSizeY/2; vertex[0].z = 0.0f; vertex[0].color = 0xff; vertex[1].x = fSizeX/2; vertex[1].y = fSizeY/2; vertex[1].z = 0.0f; vertex[1].color = 0xff; vertex[2].x = -fSizeX/2; vertex[2].y = -fSizeY/2; vertex[2].z = 0.0f; vertex[2].color = 0xff; vertex[3].x = fSizeX/2; vertex[3].y = -fSizeY/2; vertex[3].z = 0.0f; vertex[3].color = 0xff; ¹öÅؽº ¹öÆÛ¸¦ »ý¼ºÇϱâ À§Çؼ­´Â CreateVertexBuffer()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer ); g_d3d_Device->CreateVertexBuffer(4*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer) ù¹ø° ÀÎÀÚ´Â ¹öÅؽº ¹öÆÛÀÇ ±æÀÌ·Î Áö±ÝÀº 4°³ÀÇ ¹öÅؽº°¡ ÇÊ¿äÇÕ´Ï´Ù. µÎ¹ø° ÀÎÀÚ´Â ¹öÆÛ¸¦ ¾î¶»°Ô »ç¿ëÇÒ°ÍÀÎÁö ÁöÁ¤ÇÑ´Ù. ¼¼¹ø° ÀÎÀÚ´Â »ç¿ëÇÒ ¹öÅؽº Æ÷¸ËÀ» ÁöÁ¤ÇÑ´Ù. ³×¹ø° ÀÎÀÚ´Â ¹öÆÛ°¡ Â÷ÁöÇÒ ¸Þ¸ð¸® Ç®À» ÁöÁ¤ÇÑ´Ù. ¿©±â¼­´Â µðÆúÆ® ¸Þ¸ð¸® Ç®À» »ç¿ë ÇϹǷΠD3DPOOL_DEFAULT¸¦ »ç¿ëÇÑ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¹öÆÛ Æ÷ÀÎÅ͸¦ ÁöÁ¤ÇÑ´Ù. b. ¹öÅؽº ¹öÆÛ ¶ô HRESULT IDirect3DIndexBuffer8::Lock( UINT OffsetToLock, UINT SizeToLock, BYTE** ppbData, DWORD Flags ); g_VertexBuffer->Lock(0, sizeof(vertex), (BYTE**)&lpVertices, 0) ¹öÆÛÀÇ µ¥ÀÌÅ͸¦ ¼öÁ¤Çϱâ À§Çؼ­´Â ¹öÆÛ¿¡ ¶ôÀ» °É°í µ¥ÀÌŸ ¹öÆÛÀÇ Æ÷ÀÎÅ͸¦ ¾ò¾î ¿Â´Ù.. ù¹ø° ÀÎÀÚ´Â ¶ôÀ» °É À妽º µ¥ÀÌÅÍÀÇ ¿É¼ÂÀ» ÁöÁ¤Çϴµ¥. ÀϹÝÀûÀ¸·Î 0À» ÁöÁ¤ÇÑ´Ù. µÎ¹ø° ÀÎÀÚ´Â ¶ôÀ» °É ¹öÅؽº Æ÷¸ËÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù. ¼¼¹ø° ÀÎÀÚ´Â ¶ôµÈ µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅϹ޴´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¿¬»ê¿¡ ÇÊ¿äÇÑ Ç÷¡±×¸¦ ÁöÁ¤ÇÑ´Ù. c. µ¥ÀÌÅ͸¦ ¹öÅؽº ¹öÆÛ·Î º¹»ç memcpy(lpVertices, vertex, sizeof(vertex)); ¹öÅؽº µ¥ÀÌÅ͸¦ ¶ôµÈ µ¥ÀÌÅÍ ¹öÆÛ·Î º¹»çÇÑ´Ù. d. ¹öÅؽº ¹öÆÛ ¶ô ÇØÁ¦ HRESULT IDirect3DIndexBuffer8::Unlock(); Lock()ÇÔ¼ö¸¦ »ç¿ëÇÑ ÈÄ¿¡´Â ¶ôÀ» Unlock()ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. 4)Áö¿À¸ÞÆ®¸® Ãâ·Â *** a. SetStreamSource() b. SetVertexShader() c. DrawPrimitive() a. SetStreamSource() Áö¿À¸ÞÆ®¸®¸¦ Ãâ·ÂÇϱâ À§ÇØ 3D½Ã½ºÅÛ¿¡°Ô ¾îµð¼­ ¹öÅؽº µ¥ÀÌÅ͸¦ °¡Á®¿Ã°ÍÀÎÁö ¾Ë·Á ÁÖ±âÀ§ÇØ SetStreamSource() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. HRESULT IDirect3DDevice8::SetStreamSource( UINT StreamNumber, IDirect3DVertexBuffer8* pStreamData, UINT Stride); g_d3d_Device->SetStreamSource(0, g_VertexBuffer, sizeof(CUSTOMVERTEX)); ù¹ø° ÀÎÀÚ´Â »ç¿ëÇÏ´Â ½ºÆ®¸²ÀÌ ¾î´À°ÍÀÎÁö ÁöÁ¤ÇÑ´Ù. µÎ¹ø° ÀÎÀÚ´Â ½ºÆ®¸² µ¥ÀÌÅÍÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ¸¶Áö¸· ÀÎÀÚ´Â ¹öÅؽº Æ÷¸ËÀÇ Å©±âÀÌ´Ù. b. SetVertexShader() ½ºÆ®¸²À» ¼³Á¤ÇÏ°í ³­ÈÄ¿¡´Â ¹öÅؽº ŸÀÔÀÇ Æ÷¸ËÀ» ¾Ë·ÁÁÖ±â À§ÇØ SetVertexShader()¸¦ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. Å©±â¸¦ ¼³Á¤ÇÏ°í ŸÀÔÀ» ¾Ë·ÁÁÖ´Â °Ç°¡.....??? HRESULT IDirect3DDevice8::SetVertexShader(DWORD Handle); g_d3d_Device->SetVertexShader(D3DFVF_CUSTOMVERTEX); c. DrawPrimitive() ¼Â¾÷ÇÑ Áö¿À¸ÞÆ®¸®¸¦ ·»µå¸µÇϱâ À§ÇØ DrawPrimitive()ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. HRESULT IDirect3DDevice8::DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount); g_d3d_Device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); ù¹ø° ÀÎÀÚ´Â ÇÁ¶óÀ̸ÓƼºê ŸÀÔÀ» ÁöÁ¤Çϴ°ÍÀ¸·Î ŸÀÔÀº ¾Æ·¡¿Í °°½À´Ï´Ù. typedef enum _D3DPRIMITIVETYPE { D3DPT_POINTLIST = 1, D3DPT_LINELIST = 2, D3DPT_LINESTRIP = 3, D3DPT_TRIANGLELIST = 4, D3DPT_TRIANGLESTRIP = 5, D3DPT_TRIANGLEFAN = 6, D3DPT_FORCE_DWORD = 0x7fffffff } D3DPRIMITIVETYPE; µÎ¹ø° ÀÎÀÚ´Â ¹öÆÛ°¡ ½ÃÀÛÇÒ ¹öÆÛÀÇ À妽º´Ù. ¸¶Áö¸· ÀÌÀÚ´Â ·»µå¸µ ÇÒ ÇÁ¶óÀ̸ÓƼºê ¼öÀÌ´Ù. ÀÌ Á¦ ³¡³­°Ç°¡... ÈÞ...