我试图将几何着色器引入到我的管道中,但它似乎无法被识别,并且顶点着色器尝试直接进入像素着色器。 我收到此错误消息:
D3D11 ERROR: ID3D11DeviceContext::Draw: Vertex Shader - Pixel Shader linkage error: Signatures between stages are incompatible. The input stage requires Semantic/Index (SV_Position,0) as input, but it is not provided by the output stage. [ EXECUTION ERROR #342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]
这是所有着色器的数据输入和输出
struct vs_input_t
{
float3 localPosition : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD;
};
struct v2g_t
{
float4 position : POSITIONT;
float4 worldPosition : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD;
};
struct g2p_t
{
float4 position : SV_Position;
float4 color : COLOR;
float2 uv : TEXCOORD;
};
这是着色器代码:
[maxvertexcount(4)]
void GeometryMain(line v2g_t geoInput[2], inout TriangleStream<g2p_t> triangleStream)
{
float3 up = float3(0.0f, 0.0f, 1.0f);
float3 towardsCam = EyePosition - geoInput[0].worldPosition;
towardsCam.z = 0.0f;
towardsCam = normalize(towardsCam);
float3 right = cross(up, towardsCam);
float4 vertexes[4];
vertexes[0] = float4(geoInput[0].worldPosition);
vertexes[1] = float4(geoInput[1].worldPosition);
vertexes[2] = float4(geoInput[0].worldPosition + float4(right, 1.0f));
vertexes[3] = float4(geoInput[1].worldPosition + float4(right, 1.0f));
g2p_t output;
[unroll]
for (int i = 0; i < 4; i++)
{
output.color = geoInput[0].color;
output.position = mul(ViewMatrix, vertexes[i]);
output.position = mul(ProjectionMatrix, output.position);
output.uv = geoInput[0].uv;
triangleStream.Append(output);
}
}
float4 PixelMain(g2p_t input) : SV_Target0
{
float4 resultingColor = diffuseTexture.Sample(diffuseSampler, input.uv) * input.color * ModelColor;
if (resultingColor.w == 0)
discard;
return resultingColor;
}
v2g_t VertexMain(vs_input_t input)
{
v2g_t v2g;
float4 position = float4(input.localPosition, 1);
float4 modelTransform = mul(ModelMatrix, position);
v2g.worldPosition = modelTransform;
float4 modelToViewPos = mul(ViewMatrix, modelTransform);
v2g.position = mul(ProjectionMatrix, modelToViewPos);
v2g.color = input.color;
v2g.uv = input.uv;
return v2g;
}
我没有看到数据结构之间有任何不匹配之处
正如 @mateeeeeee 提到的,以防其他人遇到类似的情况。 我忘了打电话 ID3D11DeviceContext::GSSetShader