Sign in to follow this  
Dissipate

Problems trying to create custom shader w/XTK

Recommended Posts

Dissipate    483

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.

Edited by Dissipate

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this