Index Buffer

»ç°¢ÇüÀ̳ª ¸Þ½¬¸¦ ±×¸®´Â °æ¿ì Áߺ¹µÈ ¹öÅؽº¸¦ È¿À²ÀûÀ¸·Î »ç¿ëÇÏ´Â ¹æ¹ýÀº À妽º, ½ºÆ®¸³, ÆÒÀ»
»ç¿ëÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.
¿©±â¼­´Â À妽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¼³¸í ÇÏ°Ú´Ù.
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;

}


´ÙÀ½¿¡´Â À妽º ¹öÆÛ¸¦ »ý¼ºÇÏ¿© Å¥ºê¸¦ ±×¸± °ÍÀÌ´Ù.