Добавление геометрического шейдера вызывает «ошибку связывания шейдера» - PullRequest
1 голос
/ 18 марта 2020

Я добавляю геометрический шейдер (очень простой) в мою программу 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: Vertex Shader - Ошибка связывания геометрического шейдера: подписи между этапами несовместимы. Для входного каскада требуется Semantic / Index (POSITIONT, 0) в качестве входных данных, но он не предоставляется выходным каскадом. [ИСПОЛНЕНИЕ ОШИБКИ # 342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]

D3D11 ОШИБКА: ID3D11DeviceContext :: DrawIndexed: Геометрический шейдер - Ошибка связывания пиксельного шейдера: подписи между этапами несовместимы. Для входного каскада требуется Semantic / Index (TEXCOORD, 0) в качестве входного, но он не предоставляется выходным каскадом. [ОШИБКА ИСПОЛНЕНИЯ # 342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]

Оба довольно странные. Вершинный шейдер четко возвращает POSITIONT, а COLOR и POSITIONT находятся в одинаковом порядке. В чем моя ошибка?

1 Ответ

0 голосов
/ 20 марта 2020

Причиной проблемы было то, что помимо рендеринга сцены с помощью предоставленных мною шейдеров я также рисовал текст с использованием некоторой библиотеки. Очевидно, что в него были вовлечены некоторые вершинные и пиксельные шейдеры со своими собственными входными и выходными сигнатурами. Установка геометрического шейдера на ноль решила мою проблему.

...