2017-11-02 7 views
0

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); 
    } 
} 

답변

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/입니다오래된 샘플의 도우미 물건.

왜 당신은 DirectX 10을 사용하게 될지 모르겠다. DirectX 10을 지원하는 모든 단일 지원 플랫폼이 전혀 지원하지 않으며 DirectX 11을 지원하므로 훨씬 더 잘 지원되고 광범위한 하드웨어. TL : DR : DirectX 10이 아닌 DirectX 11을 사용합니다.

이전 DXSETUP 배포를 사용해야하는 legacy DirectX SDK에서 더 이상 사용되지 않는 D3DX10 유틸리티 라이브러리를 사용하고 있습니다. 대신이 기능을 위해 open source replacements을 사용하는 것이 좋습니다. 이전 10.x API 대신 DirectX 11을 사용한다고 가정합니다. 예를 들어 Direct3D 10에 Effects를 사용하는 대신 Effects for Direct3D 11을 사용할 수 있습니다.

+0

g_Mesh의 다른 인스턴스를 만드는 방법을 알아낼 수 없습니다. 메쉬를 렌더링 할 때 완료됩니까? 내 렌더링 메쉬 코드를 내 질문에 추가했습니다. –

+0

"g_Mesh"선언은 어디에 있습니까? ''g_Mesh2''를 만들거나''g_Mesh [2]''배열로 만들 수 없습니까? –

+0

g_Mesh2 만들기, 도와 주셔서 감사합니다 :-) –

관련 문제