【问题标题】:How to load another mesh in Directx 10如何在 Directx 10 中加载另一个网格
【发布时间】:2017-11-03 07:45:27
【问题描述】:

我已经设法在 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 );
    }
}

【问题讨论】:

    标签: c++ mesh directx-10


    【解决方案1】:

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

    // 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,它得到更好的支持并支持更广泛的硬件。 TL;DR:使用 DirectX 11,而不是 DirectX 10

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

    【讨论】:

    • 我不知道如何创建另一个 g_Mesh 实例。渲染网格时是否完成?我已将渲染网格代码添加到我的问题中
    • 您的g_Mesh 声明在哪里。你不能复制它并制作一个g_Mesh2 或者将它变成一个数组g_Mesh[2]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多