2017-03-16 352 views
0

我正在用C++編寫一個使用DirectX11的程序。現在我想從着色器開始,爲此我還需要ID3D11InputLayout。因爲我想給以後使用的選擇。我有兩個頂點結構中傳遞給VertexShader:爲什麼ID3D11Device :: CreateInputLayout失敗並返回E_INVALIDARG?

typedef struct _Vertex1 
{ 
    XMFLOAT3 Pos; 
    XMFLOAT4 Color; 
} VertexPosColor; 
typedef struct _Vertex2 
{ 
    XMFLOAT3 Pos; 
    XMFLOAT3 Normal; 
    XMFLOAT2 Tex0; 
    XMFLOAT2 Tex1; 
}; 

而且沒有我創建ID3D11InputLayouts喜歡如下:

// Create INPUTLAYOUT 1 
D3D11_INPUT_ELEMENT_DESC vertex1Desc[] = 
{ 
    {"POSITION", 0U, DXGI_FORMAT_R32G32B32_FLOAT, 0U, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0U}, 
    {"COLOR", 0U, DXGI_FORMAT_R32G32B32A32_FLOAT, 0U, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0U}, 
}; 
hr = GInterface::m_d3dDevice->CreateInputLayout(vertex1Desc, 2U, pVertexBlob->GetBufferPointer(), pVertexBlob->GetBufferSize(), &GInterface::m_d3dInputLayouts[0]); 
if (FAILED(hr)) { 
    EErrors::printError(L"Failed to create input layout 1!", L"Pipeline Error", L"CreateInputLayout", EEE_D3D11, hr); 
    return false; 
} 

// Create INPUTLAYOUT 2 
D3D11_INPUT_ELEMENT_DESC vertex2Desc[] = 
{ 
    {"POSITION", 0U, DXGI_FORMAT_R32G32B32_FLOAT, 0U, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0U}, 
    {"NORMAL", 0U, DXGI_FORMAT_R32G32B32_FLOAT, 0U, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0U}, 
    {"TEXCOORD", 0U, DXGI_FORMAT_R32G32_FLOAT, 0U, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0U}, 
    {"TEXCOORD", 1U, DXGI_FORMAT_R32G32_FLOAT, 0U, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0U}, 
}; 
hr = GInterface::m_d3dDevice->CreateInputLayout(vertex2Desc, 4U, pVertexBlob->GetBufferPointer(), pVertexBlob->GetBufferSize(), &GInterface::m_d3dInputLayouts[1]); 
if (FAILED(hr)) { 
    EErrors::printError(L"Failed to create input layout 2!", L"Pipeline Error", L"CreateInputLayout", EEE_D3D11, hr); 
    return false; 
} 

的CreateInputLayout函數的第一次調用成功,但第二個返回一個E_INVALIDARG HRESULT。 我不知道爲什麼......

爲InputLayouts的變量是靜態的,初始化像如下:

ID3D11InputLayout** GInterface::m_d3dInputLayouts = (ID3D11InputLayout**)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3D11InputLayout*) * GInterface::m_d3dInputLayoutsAmount); 

我明白任何答案,THX

回答

0

同樣的着色器字節似乎是作爲輸入傳遞給CreateInputLayout。因此預計相同的輸入佈局與描述符聲明的D3D11_INPUT_ELEMENT_DESC不匹配。如果您希望使用不同的輸入佈局,則每個佈局都必須使用匹配的着色器創建。

+0

是的,這使得意識到:D thx – MisterRecursion

相關問題