2017-03-16 8 views
0

저는 C++에서 DirectX11을 사용하여 programm을 작성하고 있습니다. 이제 셰이더부터 시작하고 싶었고 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); 

을 내가 어떤 대답을 주셔서 감사합니다, 들으

답변

0

같은 셰이더 바이트 코드가 나타납니다 CreateInputLayout에 입력으로 전달되었습니다. 따라서 선언 된 D3D11_INPUT_ELEMENT_DESC 설명 자와 일치하지 않는 동일한 입력 레이아웃이 예상됩니다. 다른 입력 레이아웃을 사용하려는 경우, 각각은 일치하는 셰이더로 만들어야합니다.

+0

예, 그게 합리적인 말입니다 : D thx – MisterRecursion