Hi,
May I ask for your help with this issue please... (its an easy one)
Using: Win7, VS2012, DirectXTK
Error:
D3D11 ERROR: ID3D11Device::CreateInputLayout: The provided input signature expects to read an element with SemanticName/Index: 'NORMAL'/0, but the declaration doesn't provide a matching name. [ STATE_CREATION ERROR #163: CREATEINPUTLAYOUT_MISSINGELEMENT]
Ok I know that the NORMAL0 is supposed to be in the D3D11_INPUT_ELEMENT_DESC I am creating a custom shader and passing my own compiled shader in. Somehow the EffectFactory is overwriting the Input Element Description with its own shader description!?! Possibley from XTK/Src/VertexTypes.h. Would you kindly show me the correct way of using my own shader with DirectXTK. The Documentation is usless.
Question (also): How do you access the constant buffers then. To communicate with the shader?
Please see if I am doing this right? Also how do you access the constant buffers from the IEffect. Or do you reinterpret_cast it to DGSLEffect? ...maybe like:
m_spDGSLEffect.reset(reinterpret_cast<DGSLEffect*>(m_spEffect.get())); // ??
I have traced that it is through the DGSLEffectFactory's constructor that it creates the Pixel Shader (...::pImpl::CreatePixelShader(...)). There's so much of the private implementation that i can't touch - gonna have to augment the code with my own methods.
Here are fragments of my code from the knowledge I've managed to glean after weeks/months:
DGSLEffectFactory::DGSLEffectInfo info;
info.name = L"main";
info.alpha = 1.0f;
info.ambientColor = XMFLOAT3( 0.2f, 0.2f, 0.2f);
info.diffuseColor = XMFLOAT3( 0.8f, 0.8f, 0.8f );
info.pixelShader = L"VertexShader.cso";
std::unique_ptr<DGSLEffectFactory> m_spDGSLEffectFactory; // In header
std::unique_ptr<IEffect> m_spEffect; // In header
m_spDGSLEffectFactory.reset(new DGSLEffectFactory(g_pD3DObj->m_spD3DDevice.Get()));
m_spDGSLEffectFactory->SetDirectory(L"H:/Code/_PROGS/DXTB/x64/Debug");
m_spEffect = m_spDGSLEffectFactory->CreateDGSLEffect(info, g_pD3DObj->m_spD3DImmediateContext.Get());
D3D11_INPUT_ELEMENT_DESC stVertexDesc[] =
{
{"SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 1, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 2, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 3, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 4, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 5, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}
};
void const* pByte;
size_t Size = 0;
m_spEffect->GetVertexShaderBytecode(&pByte, &Size);
HR(g_pD3DObj->m_spD3DDevice->CreateInputLayout(stVertexDesc, 2, pByte, Size, &m_pInputLayout));
I have asked so much and would be deeply and graciously gratified with your suggestions.