如何在Directx 10中加载另一个网格

时间:2017-11-02 02:00:35

标签: c++ mesh directx-10

我已经设法在DirectX 10中加载一个网格,我现在正在尝试加载另一个网格,但每当我添加一个新网格时,原始网格就会消失。如何同时显示两个网格?这是我到目前为止尝试的代码的一部分(如果需要,我可以发布更多代码):

const D3D10_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D10_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = sizeof( layout ) / sizeof( layout[0] );

// Create the input layout
D3D10_PASS_DESC PassDesc;
g_pTechnique->GetPassByIndex( 0 )->GetDesc( &PassDesc );
V_RETURN( pd3dDevice->CreateInputLayout( layout, numElements, PassDesc.pIAInputSignature,
                                         PassDesc.IAInputSignatureSize, &g_pVertexLayout ) );

// Set the input layout
pd3dDevice->IASetInputLayout( g_pVertexLayout );

// Load the mesh
V_RETURN( g_Mesh.Create( pd3dDevice, L"Tiger\\tiger.sdkmesh", true ) );
V_RETURN( g_Mesh.Create( pd3dDevice, L"Wing\\wing.sdkmesh", true ) );


// Initialize the world matrices
D3DXMatrixIdentity( &g_World );

渲染网格:

//
// Render the mesh
//
UINT Strides[1];
UINT Offsets[1];
ID3D10Buffer* pVB[1];
pVB[0] = g_Mesh.GetVB10( 0, 0 );
Strides[0] = ( UINT )g_Mesh.GetVertexStride( 0, 0 );
Offsets[0] = 0;
pd3dDevice->IASetVertexBuffers( 0, 1, pVB, Strides, Offsets );
pd3dDevice->IASetIndexBuffer( g_Mesh.GetIB10( 0 ), g_Mesh.GetIBFormat10( 0 ), 0 );

D3D10_TECHNIQUE_DESC techDesc;
g_pTechnique->GetDesc( &techDesc );
SDKMESH_SUBSET* pSubset = NULL;
ID3D10ShaderResourceView* pDiffuseRV = NULL;
D3D10_PRIMITIVE_TOPOLOGY PrimType;

for( UINT p = 0; p < techDesc.Passes; ++p )
{
    for( UINT subset = 0; subset < g_Mesh.GetNumSubsets( 0 ); ++subset )
    {
        pSubset = g_Mesh.GetSubset( 0, subset );

        PrimType = g_Mesh.GetPrimitiveType10( ( SDKMESH_PRIMITIVE_TYPE )pSubset->PrimitiveType );
        pd3dDevice->IASetPrimitiveTopology( PrimType );

        pDiffuseRV = g_Mesh.GetMaterial( pSubset->MaterialID )->pDiffuseRV10;
        g_ptxDiffuseVariable->SetResource( pDiffuseRV );

        g_pTechnique->GetPassByIndex( p )->Apply( 0 );
        pd3dDevice->DrawIndexed( ( UINT )pSubset->IndexCount, 0, ( UINT )pSubset->VertexStart );
    }
}

1 个答案:

答案 0 :(得分:0)

代码完全按照您的要求执行:

// Load the mesh
V_RETURN( g_Mesh.Create( pd3dDevice, L"Tiger\\tiger.sdkmesh", true ) );
V_RETURN( g_Mesh.Create( pd3dDevice, L"Wing\\wing.sdkmesh", true ) );

如果你想同时加载两个网格,你需要使用两个不同的g_Mesh实例 - 我猜是SDKmesh.cpp / SDKMesh.h帮助器来自那些旧样本的东西。

  

我不知道你为什么要使用DirectX 10.因为支持DirectX 10的每一个支持的平台都支持DirectX 11,所以它没有任何价值,DirectX 11支持得更好,支持更广泛的范围。硬件。 TL; DR:使用DirectX 11,而不是DirectX 10

     

您正在使用legacy DirectX SDK中已弃用的D3DX10实用程序库,这需要使用旧的DXSETUP部署。您应该考虑使用open source replacements来实现此功能 - 这再次假设您使用的是DirectX 11而不是旧的10.x API。例如,您可以使用Effects for Direct3D 11

而不是使用Effect for Direct3D 10