SetInputLayout,VertexShader和PixelShader之间不匹配

时间:2015-07-06 17:43:13

标签: shader direct3d hlsl vertex-shader

我每个人之间都有明显的不匹配,但我看不出他们为什么或如何不匹配。我一直在看它,所以我现在看不到任何东西,所以也许还有几组眼睛......

Here are the members of the vertex struct:
    XMFLOAT4   _vertexPosition;
    XMFLOAT4   _vertexColor;

以下是输入布局说明:

static const D3D11_INPUT_ELEMENT_DESC vertexLayout[] =
{
    { "SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR",       0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

这是顶点着色器输入:

struct VertexShaderInput
{
    float4 Position             : SV_POSITION0;
    float4 Color                : COLOR0;
};

最后,像素着色器输入:

struct PixelShaderInput
{
    float4 Color                : COLOR0;
};

目前仅在两个阶段之间的最终错误是:

D3D11 ERROR: ID3D11DeviceContext::Draw: Input Assembler - Vertex 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]
D3D11 ERROR: ID3D11DeviceContext::Draw: Vertex Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'COLOR' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX]

对我来说,vertexLayout定义似乎与顶点着色器输入匹配,但运行时肯定不会!谁能发现我拙劣的东西?任何提示将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:3)

顶点着色器需要输出SV_POSITION,因为光栅化器使用它来确定像素着色器应该在哪里运行。让Pixel Shader输入没有SV_POSITION0是合法的,但在这种情况下,你不能使用与VS输出和PS输入相同的PixelShaderInput结构。

同样按照惯例,您不会将语义索引与位置一起使用,因此在HLSL着色器中将SV_POSITION更改为COLOR - 顶点不能位于两个位置马上。

每顶点颜色顶点着色器输入通常为COLOR0,而COLOR1 / struct VertexShaderInput { float4 Position : SV_POSITION; float4 Color : COLOR; }; 用于顶点着色器输出/像素着色器输入,用于漫反射与镜面反射颜色。

{{1}}