I think I have the input and output between vertex and geo shader right, but here is the error:
D3D11 ERROR: ID3D11DeviceContext::Draw: Vertex Shader - Geometry Shader linkage error: Signatures between stages are incompatible. Semantic 'TYPE' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX]
Here are the declarations on the c++ side:
struct Particle
{
DirectX::XMFLOAT4 InitialPos;
DirectX::XMFLOAT3 InitialVel;
DirectX::XMFLOAT2 Size;
float Age;
unsigned int Type;
};
enum ParticleType
{
standard,
rain,
};
static D3D11_INPUT_ELEMENT_DESC ParticleVertexLayout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "VELOCITY", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "SIZE", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "AGE", 0, DXGI_FORMAT_R32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TYPE", 0, DXGI_FORMAT_R32_UINT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
My struct that I use and we see the TYPE semantic.
struct Particle
{
float4 InitialPosW : POSITION;
float3 InitialVelW : VELOCITY;
float2 SizeW : SIZE;
float Age : AGE;
uint Type : TYPE;
};
Here is the simple vertex shader:
Particle main( Particle vin)
{
return vin;
}
And the more complex Geometry shader:
[maxvertexcount(6)]
void mainGS(point Particle gin[1], inout PointStream<Particle> ptStream)
{
gin[0].Age += playingTime;
if (gin[0].Type == PT_EMITTER)
{
// time to emit a new particle?
if (gin[0].Age > 0.002f)
{
for (int i = 0; i < 5; ++i)
{
// Spread rain drops out above the camera.
float3 vRandom = 35.0f*RandVec3((float)i / 5.0f);
vRandom.y = 20.0f;
Particle p;
p.InitialPosW = float4((emitterPositionW.xyz + vRandom),1.0);
p.InitialVelW = float3(0.0f, 0.0f, 0.0f);
p.SizeW = float2(1.0f, 1.0f);
p.Age = 0.0f;
p.Type = PT_FLARE;
ptStream.Append(p);
}
// reset the time to emit
gin[0].Age = 0.0f;
}
// always keep emitters
ptStream.Append(gin[0]);
}
else
{
// Specify conditions to keep particle; this may vary from system to system.
if (gin[0].Age <= 3.0f)
ptStream.Append(gin[0]);
}
}
GeometryShader gsStreamOut = ConstructGSWithSO( CompileShader(gs_5_0, mainGS()),"POSITION.xyzw; VELOCITY.xyz; SIZE.xy; AGE.x; TYPE.x");
Anyone got an idea why I am getting this, I've seen this error before, but not when both are using the same input/output structure.