»ç°¢ÇüÀ̳ª ¸Þ½¬¸¦ ±×¸®´Â °æ¿ì Áߺ¹µÈ ¹öÅؽº¸¦ È¿À²ÀûÀ¸·Î »ç¿ëÇÏ´Â ¹æ¹ýÀº À妽º, ½ºÆ®¸³, ÆÒÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ¿©±â¼´Â À妽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ ¼³¸í ÇÏ°Ú´Ù. MyMesh¿¡¼ À妽º ¹öÆÛ »ç¿ë¹ý, ´ÙÀÌ·ºÆ® X¿¡¼ À妽º ¹öÆÛÀÇ »ç¿ë¹ý, Ãß°¡µÈ Äڵ带 ¾Ë¾Æº¸ÀÚ.
MyMesh¿¡¼ À妽º ¹öÆÛ »ç¿ë¹ý
//<------- MyMesh¿¡¼ À妽º »ç¿ë ¹ý ------->
//¹öÅؽº ¹öÆÛ
MyVector3* pVertex = new MyVector3[4];
pVertex[0] = MyVector3(-1.0f, -1.0f, 0.0f);
pVertex[1] = MyVector3(-1.0f, 1.0f, 0.0f);
pVertex[2] = MyVector3(1.0f, -1.0f, 0.0f);
pVertex[3] = MyVector3(1.0f, 1.0f, 0.0f);
//¹öÅؽº ¹öÆÛ¸¦ ¸Þ½¬ ÀνºÅϽº¿¡ ÁöÁ¤
m_pMesh->SetVertexData( pVertex);
//¹öÅؽº °³¼ö, »ï°¢Çü °³¼ö ÁöÁ¤
m_pMesh->SetNumber( 4, 2);
//À妽º ¹öÆÛ ÇÒ´ç
USHORT* pIndex = new USHORT[6];
pIndex[0] = 0;
pIndex[1] = 1;
pIndex[2] = 2;
pIndex[3] = 1;
pIndex[4] = 3;
pIndex[5] = 2;
//À妽º ¹öÆÛ¸¦ ¸Þ½¬ ÀνºÅϽº¿¡ ÁöÁ¤
m_pMesh->SetVertexIndex(6, pIndex);
|
SetVertexData()¸¦ ÅëÇØ ¹öÅؽº ¹öÆÛ ÁöÁ¤ SetNumber()·Î ¹öÅؽº °³¼ö, »ï°¢Çü °³¼ö ÁöÁ¤ SetVertexIndex()·Î À妽º °³¼ö, À妽º ¹öÆÛ ÁöÁ¤
´ÙÀÌ·ºÆ® X¿¡¼ À妽º ¹öÆÛ¸¦ »ç¿ë Çغ»ÀûÀÌ ÀÖ´Ù¸é ½±°Ô ÀÌÇØ °¥°ÍÀÌ´Ù.
´ÙÀÌ·ºÆ® X¿¡¼ À妽º ¹öÆÛÀÇ »ç¿ë¹ý
CreateIndexBuffer() ÇÔ¼ö
//À妽º ¹öÆÛ¸¦ ¸¸µç´Ù.
HRESULT CreateIndexBuffer(
UINT Length,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DIndexBuffer9** ppIndexBuffer,
HANDLE* pSharedHandle
);
/*
[in] Length : ¹öÆÛ¿¡ ÇÒ´çÇÒ ¹ÙÀÌÆ® ¼ö
[in] Usage : ¹öÆÛÀÇ ÀÌ¿ë ¹æ¹ýÀ» °áÁ¤ÇÏ´Â °ÍÀ¸·Î ºÎ°¡ÀûÀΠƯ¼ºÀ» ÁöÁ¤ÇÑ´Ù.
- D3DUSAGE_DYNAMIC - ¹öÆÛ¸¦ µ¿ÀûÀ¸·Î ¸¸µç´Ù.
- D3DUSAGE_POINTS - Á¡À» ±×¸°´Ù. (¹öÅؽº ¹öÆÛ¿¡¼¸¸ »ç¿ë µÈ´Ù)
- D3DUSAGE_SOFTWAREPROCESSING - ¹öÅؽº ÇÁ·Î¼¼½ÌÀ» ¼ÒÇÁÆ®¿þ¾î·Î ó¸®ÇÑ´Ù.
- D3DUSAGE_WRITEONLY - ¹öÆÛ¿¡ ¾²±â¸¸À» ¼öÇàÇÒ °ÍÀÓÀ» ÁöÁ¤ÇÑ´Ù,
¾²±â ÀÛ¾÷¿¡ ÃÖÀûÈµÈ ¸Þ¸ð¸® À§Ä¡¿¡ ¹öÆÛ¸¦ ¿Å±æ ¼ö ÀÖ´Ù.
[in] Format : À妽º 1°³ÀÇ µ¥ÀÌÅÍ »çÀÌÁ ÁöÁ¤ÇÑ´Ù.
16ºñÆ® À妽º´Â D3DFMT_INDEX16, 32ºñÆ® À妽º´Â D3DFMT_INDEX32°¡ »ç¿ëµÈ´Ù.
D3DFMT_INDEX32 Áö¿øÀº ±×·¡ÇÈ Ä«µå¿¡ µû¶ó Áö¿ø ¾ÈµÉ¼öµµ ÀÖ´Ù.
[in] Pool : ¹öÆÛ°¡ À§Ä¡ÇÒ ¸Þ¸ð¸® Ç®
- D3DPOOL_DEFAULT
ÀåÄ¡°¡ ¼Õ½ÇÇßÀ» °æ¿ì´Â, D3DPOOL_DEFAULT ¸¦ »ç¿ëÇØ »ý¼º ÇÑ ¸®¼Ò½º´Â,
IDirect3DDevice9::Reset ¸¦ È£ÃâÇϱâ Àü¿¡ ¸±¸®Áî ÇØ¾ß ÇÑ´Ù
-D3DPOOL_MANAGED
¸®¼Ò½º´Â, ÇÊ¿ä¿¡ µû¶ó¼, ÀåÄ¡·ÎºÎÅÍ ¾×¼¼½º ÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®¿¡ ÀÚµ¿ÀûÀ¸·Î º¹»ç µÈ´Ù.
°ü¸®µÇ´Â ¸®¼Ò½º´Â, ½Ã½ºÅÛ ¸Þ¸ð¸®¿¡ ¹é¾÷ µÈ´Ù.
ÀåÄ¡°¡ ¼Õ½ÇÇßÀ» ¶§¿¡ »ý¼º ´Ù½Ã ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
-D3DPOOL_SYSTEMMEM
º¸Åë, 3D ÀåÄ¡¿¡ ÀÇÇØ ¾×¼¼½º ÇÒ ¼ö ¾ø´Â ¸Þ¸ð¸®. ½Ã½ºÅÛ RAM ¸¦ »ç¿ëÇÏÁö¸¸,
ÆäÀÌ¡ °¡´ÉÇÑ RAM °¡ ÁÙ¾îµé °ÍÀº ¾ø´Ù. ÀÌ·¯ÇÑ ¸®¼Ò½º´Â,
ÀåÄ¡°¡ ¼Õ½ÇÇصµ »ý¼º ´Ù½Ã ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
ÀÌ Ç®ÀÇ ¸®¼Ò½º´Â Àá±Û ¼ö°¡ ÀÖ¾î D3DPOOL_DEFAULT ¸¦ »ç¿ëÇØ »ý¼º µÈ
¸Þ¸ð¸® ¸®¼Ò½º¿¡ ´ëÇÑ IDirect3DDevice9::UpdateSurface
¶Ç´Â IDirect3DDevice9::UpdateTexture ó¸®ÀÇ Àü¼Û¿øÀ¸·Î¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
-D3DPOOL_SCRATCH
»ý·«.
-D3DPOOL_FORCE_DWORD = 0x7fffffff
»ý·«.
[out] ppIndexBuffer : IDirect3DIndexBuffer9ÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁØ´Ù.
[in] pSharedHandle : ÀÌ¿ë µÇÁö ¾Ê´Â´Ù.
*/
|
DrawIndexedPrimitive() ÇÔ¼ö
//À妽º ¹öÆÛ·Î ±×¸°´Ù.
HRESULT DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
/*
[in] Type
·»´õ¸µ ÇÏ´Â ±âº»µµÇüÀÇ Á¾·ù¸¦ ±â¼úÇÑ´Ù. D3DPT_POINTLIST´Â À妽º ¹öÆÛ¿¡¼ Áö¿øµÇÁö ¾Ê´Â´Ù.
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;
[in] BaseVertexIndex
??? Â÷ÈÄ¿¡ ÀÚ¼¼È÷ ºÐ¼®, ¿ì¼±Àº ±×³É 0 ÁöÁ¤
[in] MinIndex
??? Â÷ÈÄ¿¡ ÀÚ¼¼È÷ ºÐ¼®, ¿ì¼±Àº ±×³É 0 ÁöÁ¤
[in] NumVertices
Á¤Á¡ÀÇ ¼ö
[in] StartIndex
À妽º ¹öÆÛ¿¡¼ Á¤Á¡ÀÇ ½ÃÀÛ À§Ä¡ ÁöÁ¤
[in] PrimitiveCount
·»´õ¸µ ÇÏ´Â ±âº»µµÇüÀÇ ¼ö (º¸ÅëÀº »ï°¢ÇüÀÇ ¼öÀÌ´Ù.)
*/
|
´ÙÀÌ·ºÆ® X¿¡¼ »ç¿ë ¿¹
//À妽º ¹öÆÛ »ý¼º
pDevice->CreateIndexBuffer( m_numIndices * size, usage, format, pool, &m_pIB, NULL );
//À妽º ¹öÆÛ¿¡ À妽º ¸®½ºÆ® ä¿ì±â (¿©±â¼´Â À妽º Å©±â°¡ D3DFMT_INDEX16À¸·Î USHORTÀÌ´Ù.
USHORT* pIndex = new USHORT[6];
pIndex[0] = 0;
pIndex[1] = 1;
pIndex[2] = 2;
pIndex[3] = 1;
pIndex[4] = 3;
pIndex[5] = 2;
m_pIB->Lock( 0, 0, (void**)&pData, flags ) ;
memcpy( pData, pIndex, 6 * sizeof( USHORT ) );
m_pIB->Unlock();
//·»´õ¸µ ( IDirect3DDevice9* pDevice )
pDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, m_numVertices, 0, numPrimitives );
//¼Ò¸ê
memcpy->Release();
|
Ãß°¡µÈ ÄÚµå
MyMesh Ŭ·¡½º¿¡ À妽º¸¦ »ç¿ëÇϱâ À§ÇØ 3°³ÀÇ ¸Þ½îµå°¡ Ãß°¡ µÇ¾ú´Ù. ³»ºÎ¿¡ »ç¿ë µÇ´Â ¸â¹ö´Â À妽º ¹öÆÛ¿Í À妽º °³¼ö¸¦ Çì¾Æ¸®´Â ¸â¹ö°¡ Ãß°¡ µÇ¾ú´Ù. MyMesh.cpp¿¡´Â ¹°·Ð ÀÌµé ±¸ÇöºÎ°¡ Ãß°¡ µÇ¾ú´Ù.
//MyMesh.hÀÇ MyMesh Ŭ·¡½º¿¡ Ãß°¡ µÈ ÄÚµå
public:
USHORT* GetVertexIndex();
int GetVertexIndexCount();
void SetVertexIndex(int iCount, USHORT* pIndex);
private:
USHORT* m_pVertexIndex;
int m_iIndexCount;
|
MyRenderer::MakeVertexBuffer() ±¸ÇöºÎ¿¡¼´Â Index Buffer°¡ ¼ÂÆà µÇ¾î ÀÖ´Ù¸é, MyIndexBuffer ÀνºÅϽº¸¦ ¸¸µç´Ù.
bool MyRenderer::MakeVertexBuffer(IDirect3DDevice9 *pkDevice, MyMesh& mesh)
{
//~~~~~~ »ý·«~~~~~~~~
//À妽º ¹öÆÛ ¼ÂÆÃ
USHORT* pIndex = mesh.GetVertexIndex();
if(pIndex)
{
int pIndexCount = mesh.GetVertexIndexCount();
MyIndexBuffer* pIndexBuffer = new MyIndexBuffer;
pIndexBuffer->CreateBuffer( pkDevice, pIndexCount, D3DFMT_INDEX16 );
pIndexBuffer->SetData(pIndexCount, pIndex);
pVertexBuffer->SetIndexBuffer( pIndexBuffer );
}
mesh.SetDeviceVertex(pVertexBuffer);
return true;
}
|
´ÙÀ½¿¡´Â À妽º ¹öÆÛ¸¦ »ý¼ºÇÏ¿© Å¥ºê¸¦ ±×¸± °ÍÀÌ´Ù.
|