°èÃþÀûÀÎ µ¥ÀÌÅ͸¦ »ç¿ëÇÒ ¶§´Â D3DXLoadMeshHierarchyFromX()¸¦ »ç¿ëÇؾß
µÇÁö¸¸ °£´ÜÇÑ ¸Þ½¬¸¦ ·»µå¸µ ÇÒ ¶§´Â LoadMesh.h ÆÄÀÏÀ» º¸¸é bool LoadMesh(LPDIRECT3DDEVICE9 pDevice); 3°³ÀÇ ÆÄÀÏÀÌ Æ¯º°ÇÑ ¼³¸íÀÌ ¾ø´õ¶óµµ ÇÔ¼öÀ̸§¿¡¼ ±â´ÉÀ» À¯Ãß
Çس¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸Þ½¬ ·Îµù bool LoadMesh(LPDIRECT3DDEVICE9 pDevice) { HRESULT hr = 0; ID3DXBuffer* adjBuffer = 0; ID3DXBuffer* mtrlBuffer = 0; DWORD numMtrls = 0; if(FAILED(D3DXLoadMeshFromX("bigship1.x", D3DXMESH_MANAGED, pDevice, &adjBuffer, &mtrlBuffer, 0, &numMtrls, &g_mesh))) return false; if( mtrlBuffer != 0 && numMtrls != 0 ) { D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer(); for(int i = 0; i < numMtrls; i++) { //MatD3D ¼Ó¼ºÀº ambient °ªÀ» °¡ÁöÁö ¾ÊÀ¸¹Ç·Î Áö±Ý À̸¦ ÀúÀåÇÑ´Ù. mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse; g_mtrls.push_back( mtrls[i].MatD3D ); if( mtrls[i].pTextureFilename != 0 ) { IDirect3DTexture9* tex = 0; D3DXCreateTextureFromFile(pDevice, mtrls[i].pTextureFilename, &tex); g_textures.push_back( tex ); } else g_textures.push_back( 0 ); } } _RELEASE_ ID3DXBuffer : LPVOID
GetBufferPointer() - µ¥ÀÌÅÍÀÇ ½ÃÀÛÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ID3DXBuffer »ç¿ë¹æ¹ýÀº ij½ºÆà ¿¬»êÀÚ·Î º¯È¯½ÃÅ°¸é µÈ´Ù. D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer(); HRESULT WINAPI D3DXLoadMeshFromX(LPCTSTR pFilename, DWORD Options, LPDIRECT3DDEVICE9 pD3DDevice, LPD3DXBUFFER *ppAdjacency, LPD3DXBUFFER *ppMaterials, LPD3DXBUFFER *ppEffectInstances, DWORD *pNumMaterials, LPD3DXMESH *ppMesh ); ppMaterialsÀÇ ¹öÆÛ´Â ¾Æ·¡¿Í ±¸Á¶Ã¼·Î ÀÌ·ïÁ® ÀÖ´Ù. typedef struct D3DXMATERIAL{ D3DMATERIAL9 MatD3D; LPSTR pTextureFilename; } D3DXMATERIAL; ppMaterials ¹öÆÛÀÇ °ªÀ» D3DMATERIAL9 °´Ã¼¿Í IDirect3DTexture9*
°´Ã¼ÀÇ ¹è¿¿¡ ÀúÀåÇÏ¸é µÈ´Ù. MatD3D Çʵå´Â Ambient °ªÀº ¼ÂÆÃÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡, º¸Åë Diffuse
°ªÀ» ³Ö´Â´Ù. OptimizeInplace()¸¦ À§ÇÏ¿© ppAdjacencyÀÇ °ªÀ» Àӽ÷ΠÀúÀåÇÑ´Ù. ·»µå¸µ bool RnderMesh(LPDIRECT3DDEVICE9 pDevice, float timeDelta) { if( pDevice ) { static float y = 0.0f; D3DXMATRIX yRot; D3DXMatrixRotationY(&yRot, y); y += timeDelta; if( y >= 6.28f ) y = 0.0f; D3DXMATRIX World = yRot; pDevice->SetTransform(D3DTS_WORLD, &World); //pDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); //pDevice->BeginScene(); for(int i = 0; i < g_mtrls.size(); i++) { pDevice->SetMaterial( &g_mtrls[i] ); pDevice->SetTexture(0, g_textures[i]); g_mesh->DrawSubset(i); } //pDevice->EndScene(); //pDevice->Present(0, 0, 0, 0); } return true; } y°ªÀ» ½ºÅÃƽ º¯¼ö·Î ºñÇà±â¸¦ timeDelta ½Ã°£¿¡ µû¶ó ȸÀü½ÃÅ°°í ÀÖ´Ù. ȸé Ŭ¸®¾î¿Í °»½ÅÀº RenderMesh() ¹Û¿¡¼ ÇÏ°í Àֱ⠶§¹®¿¡ ÁÖ¼®Ã³¸®ÇÏ¿´´Ù. size()¸¸Å SetMaterial(), SetTexture(), DrawSubset() ÇÏ¿© ·»µå¸µÇÏ°í ÀÖ´Ù. ¸Þ½¬ ¼Ò¸ê void CleanupMesh() { _RELEASE_ g_mesh °´Ã¼¸¦ ÇØÁ¦ÇÑ´Ù. °´Ã¼µéÀ» vector¸¦ »ç¿ëÇÏÁö ¾Ê°í ¹è¿À» »ç¿ëÇÒ ¶§´Â ¾î¶»°Ô ÇÒÁö Âü°íÇϱâ À§ÇÑ »ý¼º°ú ¼Ò¸êÄÚµåÀÌ´Ù.
½Ã°£ ÇÔ¼ö »ç¿ëÇϱâ test.cpp RenderLoop()¸¦ º¸¸é ºñÇà±â¸¦ ȸÀü½ÃÅ°±â À§ÇØ ½Ã°£À»
±¸ÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. static float lastTime = (float)timeGetTime(); RenderLoop()¸¦ Åë°úÇÑ ÃÖÃÊÀÇ ½Ã°£À» ÀúÀåÇÑ´Ù. ....... //
Render the scene as normal ÇöÀç ½Ã°£°ú ¸¶Áö¸· ½Ã°£Â÷¿¡ 0.001¸¦ °öÇÏ¿© ½Ã°£Â÷¸¦ ±¸ÇÑ´Ù. ´ÙÀ½½Ã°£¿¡´Â ¹öÅؽº ¹ý¼±ÀÌ Á¸ÀçÇÏÁö ¾Ê´Â ¸Þ½¬¿¡ ¹ý¼±À» ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇؼ ¾Ë¾Æº¸ÀÚ.
[Æß] http://www.moon-labs.com DirectX 9¸¦ ÀÌ¿ëÇÑ 3D GAME ÇÁ·Î±×·¡¹Ö ÀÔ¹® - Á¤º¸ ¹®È»ç http://www.thehavok.co.uk |