如何在DirectX11中正确链接几何着色器

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

我试图将几何着色器引入到我的管道中,但它似乎无法被识别,并且顶点着色器尝试直接进入像素着色器。 我收到此错误消息:

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;
}

我没有看到数据结构之间有任何不匹配之处

3d rendering directx-11 hlsl geometry-shader
1个回答
0
投票

正如 @mateeeeeee 提到的,以防其他人遇到类似的情况。 我忘了打电话 ID3D11DeviceContext::GSSetShader

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