我正在向DirectX 11程序添加一个几何着色器(非常简单的一种)。我已经写了顶点和像素着色器,它们按预期工作-没有错误,没有警告。着色器也很简单。顶点着色器是:
cbuffer PerApplication : register(b0)
{
matrix projectionMatrix;
}
cbuffer PerFrame : register(b1)
{
matrix viewMatrix;
}
cbuffer PerObject : register(b2)
{
matrix worldMatrix;
}
struct VertexShaderInput
{
float4 position : POSITION;
float4 color: COLOR;
};
struct VertexShaderOutput
{
float4 color : COLOR;
float4 position : SV_POSITION;
};
//entry point
VertexShaderOutput SimpleVertexShader(VertexShaderInput IN)
{
VertexShaderOutput OUT;
matrix mvp = mul(projectionMatrix, mul(viewMatrix, worldMatrix));
OUT.color = IN.color;
OUT.position = mul(mvp, IN.position);
return OUT;
}
像素着色器是:
struct PixelShaderInput
{
float4 color : COLOR;
};
float4 SimplePixelShader(PixelShaderInput IN) : SV_TARGET
{
return IN.color;
}
嗯,正如我所说的,这很好。然后,我添加了一个几何着色器,它实际上什么也没做,只是取一个三角形并返回相同的三角形。几何着色器是:
struct VertexInput
{
float4 color : COLOR;
float4 position : POSITIONT;
};
struct VertexOutput
{
float4 color : COLOR;
float4 position : SV_Position;
};
[maxvertexcount(3)]
void SimpleGeometryShader(triangle VertexInput input[3], inout TriangleStream<VertexOutput> stream)
{
VertexOutput v1 = { input[0].color, input[0].position };
stream.Append(v1);
VertexOutput v2 = { input[1].color, input[1].position };
stream.Append(v2);
VertexOutput v3 = { input[2].color, input[2].position };
stream.Append(v3);
stream.RestartStrip();
}
执行此操作还需要更改顶点着色器,现在它将返回
struct VertexShaderOutput
{
float4 color : COLOR;
float4 position : POSITIONT; //I'm not returning SV_Position in vertex shader anymore.
};
程序本身可以正常运行,并且可以按预期运行,我看到了我期望看到的。但是现在有两个D3D11错误:
D3D11错误:ID3D11DeviceContext :: DrawIndexed:顶点着色器-几何着色器链接错误:阶段之间的签名不兼容。输入级需要语义/索引(POSITIONT,0)作为输入,但输出级不提供。 [执行错误#342:DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]
D3D11错误:ID3D11DeviceContext :: DrawIndexed:几何着色器-像素着色器链接错误:阶段之间的签名不兼容。输入级需要语义/索引(TEXCOORD,0)作为输入,但输出级未提供。 [执行错误#342:DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]
两者都很奇怪。顶点着色器显然会返回POSITIONT,并且COLOR和POSITIONT的顺序相同。我怎么了?
问题的原因是,除了使用我提供的着色器渲染场景外,我还使用某些库来绘制文本。显然,其中包含一些顶点和像素着色器,并带有它们自己的输入和输出签名。将几何体着色器设置为null解决了我的问题。