I've stared at this for at least half an hour now and I cannot figure out what directx is complaining about. I know this error normally means you put float3 instead of a float4 or something like that, but I've checked over and over and as far as I can tell, everything matches.
This is the full error message:
D3D11: ERROR: ID3D11DeviceContext::DrawIndexed: Input Assembler - Vertex Shader linkage error: Signatures between stages are incompatible. The input stage requires Semantic/Index (COLOR,0) as input, but it is not provided by the output stage. [ EXECUTION ERROR #342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND ]
This is the vertex shader's input signature as seen in PIX:
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------ ------
// POSITION 0 xyz 0 NONE float xyz
// NORMAL 0 xyz 1 NONE float
// COLOR 0 xyzw 2 NONE float
The HLSL structure looks like this:
struct VertexShaderInput
{
float3 Position : POSITION0;
float3 Normal : NORMAL0;
float4 Color: COLOR0;
};
The input layout, from PIX, is:
The C# structure holding the data looks like this:
[StructLayout(LayoutKind.Sequential)]
public struct PositionColored
{
public static int SizeInBytes = Marshal.SizeOf(typeof(PositionColored));
public static InputElement[] InputElements = new[]
{
new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
new InputElement("NORMAL", 0, Format.R32G32B32_Float, 0),
new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 0)
};
Vector3 position;
Vector3 normal;
Vector4 color;
#region Properties
...
#endregion
public PositionColored(Vector3 position, Vector3 normal, Vector4 color)
{
this.position = position;
this.normal = normal;
this.color = color;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder(base.ToString());
sb.Append(" Position=");
sb.Append(position);
sb.Append(" Color=");
sb.Append(Color);
return sb.ToString();
}
}
SizeInBytes comes out to 40, which is correct (4*3 + 4*3 + 4*4 = 40). Can anyone find where the mistake is?