Я добавляю геометрический шейдер (очень простой) в мою программу 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 находятся в одинаковом порядке. В чем моя ошибка?