XML Exporter: ¼ÎÀÌ´õ ½ºÅ² ¾Ö´Ï¸ÞÀ̼Ç

Çϵå¿þ¾î ½ºÅ² ¾Ö´Ï¸ÞÀ̼ǿ¡ ÀÌ¾î ¼ÎÀÌ´õ ½ºÅ² ¾Ö´Ï¸ÞÀ̼ÇÀ» ±¸ÇöÇØ º¸ÀÚ.

ÀÌÆåÆ®¿Í HLSLÀº ÀÚ¼¼È÷ ¼³¸íÇÏÁö ¾Ê°Ú´Ù. Çϵå¿þ¾î ½ºÅ°´×°ú ºñ±³ÇÏ¿© ¹Ù²ïÁ¡¸¸ À̾߱â ÇÏ°Ú´Ù.

¼ÎÀÌ´õ ±â¹Ý ½ºÅ°´×Àº À妽º ½ºÅ°´× ¹æ½Ä¿¡ ±â¹ÝÀ» µÎ°í ÀÖ´Ù.

ÆÈ·¹Æ® ¸ÅÆ®¸¯½ºµéÀ» ÂüÁ¶Çϱâ À§ÇØ »ç¿ëµÇ´Â IDirect3DDevice9::SetTransform ÇÔ¼ö ´ë½Å¿¡ ¼ÎÀÌ´õ ½ºÅ°´×¿¡¼­´Â ID3DXBaseEffect::SetMatrixArray ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÆÈ·¹Æ® ¸ÅÆ®¸¯½º¸¦ Àü´ÞÇÑ´Ù.

¼ÎÀÌ´õ¸¦ ó¸®Çϴ Ŭ·¡½º´Â EShaderBoneMesh, EShaderBone µÎ °³ÀÇ Å¬·¡½ºÀÌ´Ù.

CreateVertexBuffer()¿¡¼­ Á¤Á¡ ¹öÅ͸¦ ¸¸µé¶§, ÂüÁ¶ Çà·Ä À妽º( boneIndex)´Â °¹¼ö¸¸Å­ Á¤Á¡¹öÆÛ¿¡ ÀúÀåÇÏÁö¸¸ °¡ÁßÄ¡´Â °¹¼öº¸´Ù Çϳª Àû°Ô ÀúÀåÇÑ´Ù. °¡ÁßÄ¡ÀÇ ÇÕÀº 1À̱⠶§¹®¿¡ ¸¶Áö¸· °¡ÁßÄ¡´Â 1¿¡¼­ ÀÌÀü °¡ÁßÄ¡¸¦ »©¸é µÈ´Ù.

int EShaderBoneMesh::CreateVertexBuffer( XmlNode* pXmlNode )

{

    ........

    m_pMeshVerts = new ShaderBlendVertex[ m_nVertex ];

    memset( m_pMeshVerts, 0, sizeof(ShaderBlendVertex) * m_nVertex );

    for( int i = 0; i < n; ++i )

    {

        m_pMeshVerts[i].p.x = xmlVx[i].p.x;

        m_pMeshVerts[i].p.y = xmlVx[i].p.y;

        m_pMeshVerts[i].p.z = xmlVx[i].p.z;

 

        int count = (int)xmlVx[i].boneIndex.size();

 

        for( int j = 0; j < count; ++j )

        {

            //°¡ÁßÄ¡°¡ 3º¸´Ù ÀÛÀ»¶§¸¸ ´ëÀÔÇÑ´Ù. ¿¹¸¦µé¸é 4°³ÀÇ °¡ÁßÄ¡´Â 1 = a + b + c + dÀ϶§,

            //¸¶Áö¸· 4¹ø° °¡ÁßÄ¡ d´Â d = 1 - ( a + b + c )ó·³ »©¸é µÈ´Ù.

            if( j >= 4 )

                break;

            m_pMeshVerts[i].boneIndex[j] =  xmlVx[i].boneIndex[j];   

            if( j < 3 )

                m_pMeshVerts[i].weight[j] = xmlVx[i].boneWeight[j];

        }

    }

    ..................

·»´õ¸µ½Ã ÀÌÆåÆ® °ü·Ã(HLSL) ¼³Á¤À» ÇÑ´Ù.
·»´õ¸µ ´Ü°è¿¡¼­ Á¤Á¡ ¼±¾ð, Å×Å©´Ð ¼³Á¤, ÀÌÆåÆ® »ó¼ö ¼³Á¤, ·»´õ¸µ, FX¼³Á¤°ª NULL·Î ÁöÁ¤ ¼ø¼­·Î ÁøÇàÇÑ´Ù.

int EShaderBoneMesh::OnRender()

{

    if( m_pMeshVerts == NULL )

        return 0;

 

    m_pDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    m_pDevice->SetSoftwareVertexProcessing(TRUE);

 

    D3DXMATRIX    matView, matProj;

    LPD3DXEFFECT pShaderEffect = Shader::Instance()->GetEffect();

    HRESULT hr = pShaderEffect->SetTechnique("Tech");

    hr = m_pDevice->GetTransform(D3DTS_VIEW, &matView);

    hr = m_pDevice->GetTransform(D3DTS_PROJECTION, &matProj);

 

    hr = pShaderEffect->SetMatrix("m_mtViw", &matView);   

    hr = pShaderEffect->SetMatrix("m_mtPrj", &matProj);

 

    //¸ðµ¨ Ãà¼Ò

    D3DXMATRIXA16 scaleMat;  D3DXMatrixIdentity( &scaleMat );  D3DXMatrixScaling( &scaleMat, 0.4f, 0.4f, 0.4f );

 

    hr = pShaderEffect->SetMatrix("m_mtWld", &scaleMat);        // ¿ùµå Çà·Ä ¼³Á¤

    hr = pShaderEffect->SetMatrixArray("m_mtBlnd", m_matBlend, MAX_BLEND);    // Blending Çà·Ä ¼³Á¤

 

    UINT cPass;

    hr = pShaderEffect->Begin( &cPass, 0 );

    hr = pShaderEffect->BeginPass( 1 );

 

    hr = m_pDevice->SetVertexDeclaration( Shader::Instance()->GetMeshDecl() );

 

    m_pDevice->DrawIndexedPrimitiveUP( D3DPT_TRIANGLELIST,

        0, m_nVertex, m_nTriangle, m_pIndex, D3DFMT_INDEX16, m_pMeshVerts, sizeof(ShaderBlendVertex) );

 

    pShaderEffect->EndPass();

    pShaderEffect->End();

 

    m_pDevice->SetVertexDeclaration(NULL);

    m_pDevice->SetVertexShader(NULL);

    m_pDevice->SetPixelShader(NULL);

    m_pDevice->SetSoftwareVertexProcessing(FALSE);

    m_pDevice->SetTexture(0, NULL);

    return 1;

}

 

ÇÁ·ÎÁ§Æ®: viewer_shaderSkin.zip