添加几何着色器会导致“着色器链接错误”

问题描述 投票:1回答:1

我正在向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的顺序相同。我怎么了?

c++ shader directx hlsl
1个回答
0
投票

问题的原因是,除了使用我提供的着色器渲染场景外,我还使用某些库来绘制文本。显然,其中包含一些顶点和像素着色器,并带有它们自己的输入和输出签名。将几何体着色器设置为null解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.