Problems trying to create custom shader w/XTK

Started by
-1 comments, last by Dissipate 9 years, 7 months ago

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.

This topic is closed to new replies.

Advertisement