C++ 着色器输入布局无效

C++ 着色器输入布局无效,c++,directx,shader,C++,Directx,Shader,我试图向工作代码中添加内容,但调用CreateInputLayout()时返回错误[Invalid Arg] 它在我添加纹理材料之前工作,但在我添加纹理材料时失败。 已编译的着色器文件没有错误。 我觉得我做布局的方式很糟糕。这是正确的吗 C++顶点结构: struct VertexData{ XMFLOAT3 Pos; XMFLOAT4 Color; XMFLOAT2 TexCoord; }; C++布局: D3D11_INPUT_ELEMENT_DESC in

我试图向工作代码中添加内容,但调用CreateInputLayout()时返回错误[Invalid Arg]

它在我添加纹理材料之前工作,但在我添加纹理材料时失败。
已编译的着色器文件没有错误。
我觉得我做布局的方式很糟糕。这是正确的吗

C++顶点结构:

struct VertexData{
    XMFLOAT3 Pos;
    XMFLOAT4 Color;
    XMFLOAT2 TexCoord;
};
C++布局:

    D3D11_INPUT_ELEMENT_DESC inputLayout[]={
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    }; uint lSize=sizeof(inputLayout)/sizeof(inputLayout[0]);
着色器代码:

    // Stuff from DX Tutorial 7
Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );

cbuffer ViewData : register(b0){
    matrix World;
    matrix View;
    matrix Projection;
}

struct VS_INPUT{
    float4 pos : SV_POSITION;
    float4 color : COLOR0;
    float2 tex : TEXCOORD0;
};
struct PS_INPUT{
    float4 pos : SV_POSITION;
    float4 color : COLOR0;
    float2 tex : TEXCOORD0;
};

PS_INPUT VS(VS_INPUT input){
    PS_INPUT output=(PS_INPUT)0;

    output.pos=mul(input.pos, World);
    output.pos=mul(output.pos, View);
    output.pos=mul(output.pos, Projection);

    output.color = input.color;

    output.tex = input.tex;

    return output;
}

float4 PS(PS_INPUT input) : SV_Target {
    return input.color;
}
编辑:

在对着色器代码进行了一系列修改之后,我发现如果我更改…
1st位置到:float4位置:位置
第二位到:浮动4位:SV\U位
…输入布局已成功创建

我在没有SV_u[system value]前缀的情况下尝试了这两种方法,但也失败了。我不知道为什么我不能让它们都一样


这似乎有点神奇。不确定我是否应该用这个回答我自己的问题,或者等待更聪明的人更好地回答。

输入语义不应该是SV\u位置如果它们位于输入顶点,它们应该是我认为的位置

你也要申报吗-

struct VS_INPUT{
    float4 pos : SV_POSITION;
这不应该是
float3 pos:POSITION


您的输入布局只有该项的3个浮动。不确定是不是问题,但看起来不太正确。

您的结构不匹配:

struct VertexData
{
    XMFLOAT3 Pos;  // float3 here
    XMFLOAT4 Color;
    XMFLOAT2 TexCoord;
};

struct VS_INPUT{
    float4 pos : SV_POSITION; // float4 here
    float4 color : COLOR0;
    float2 tex : TEXCOORD0;
};
对于三维空间中的位置,我更喜欢使用float3。因此,作为您的输入布局:

"POSITION", 0, R32G32B32_FLOAT
关于语义魔术: HLSL中的名称必须与输入布局名称匹配。例如:

布局:

{ "POSITION", 0, .. }
顶点着色器:

float4 pos : POSITION0;
唯一的例外是像素着色器必须始终具有像素输入位置的
float4 pos:SV_POSITION
语义(它是SsystemV值语义之一)

作为奖励,我想推荐一些常用的东西:

  • int size=ARRYSIZE(InputYoutDesc)
  • 使用
    D3D11\u APPEND\u ALIGNED\u元素
    代替12、28数字作为对齐偏移量

输入语义不能在这些输入上?思维扭曲。我以前问过这个问题。另一些人则表示,这是为了调整数据。SV_位置是顶点着色器输出和像素着色器输入的适当语义。顶点着色器的输入不正确,请使用您自己的名称。POSITION可以很好地工作,显然它在VS的结构和输入布局声明中都需要相同的名称。在VS中,您将4个浮动加载到pos中,但仅为其提供输入中3个浮动的数据。我认为只要在着色器中只使用.xyz元素,它仍然可以像您预期的那样工作。除此之外,我不知道该如何帮助(谢谢你提供的信息。另外,我以前也问过不匹配浮动。人们说它是用来调整数据的。