ÀÌÀå¿¡¼´Â Ä«¸Þ¶ó¸¦ ÃʱâÈ ÇÏ°í 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; µÎ¹ø° ÀÎÀÚ´Â ¹öÆÛ°¡ ½ÃÀÛÇÒ ¹öÆÛÀÇ À妽º´Ù. ¸¶Áö¸· ÀÌÀÚ´Â ·»µå¸µ ÇÒ ÇÁ¶óÀ̸ÓƼºê ¼öÀÌ´Ù. ÀÌ Á¦ ³¡³°Ç°¡... ÈÞ... |