4

我正在尝试将内容添加到我的工作代码中,但在调用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 position 的语义更改为: float4 pos : POSITION;
第二个位置: float4 pos : SV_POSITION;
...输入布局成功创建。

我在没有 SV_ [系统值] 前缀的情况下都尝试了,但这也失败了。我不知道为什么我不能让它们相同。

语义似乎有点神奇。不知道我是否应该用这个回答我自己的 Q,或者等待更聪明的人更好地回答。

4

2 回答 2

4

您的结构不匹配:

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

对于 3D 空间中的位置,我更喜欢使用 float3。因此,作为您的输入布局:

"POSITION", 0, R32G32B32_FLOAT

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

布局:

{ "POSITION", 0, .. }

顶点着色器:

float4 pos : POSITION0;

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

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

  • int size = ARRYSIZE(inputayoutDesc);
  • 使用D3D11_APPEND_ALIGNED_ELEMENT而不是 12、28 数字作为对齐偏移量。
于 2012-10-26T20:31:47.300 回答
0

如果输入语义在您的输入顶点中,则输入语义不应该是 SV_POSITION,我认为它们应该是 POSITION。

您还声明了这一点-

struct VS_INPUT{
    float4 pos : SV_POSITION;

这不应该是float3 pos : POSITION;

您的输入布局只有 3 个浮点数用于该项目。不确定是否是问题所在,但看起来不太正确。

于 2012-10-25T07:58:27.600 回答