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

編集:

シェーダー コードをいろいろいじった後、最初の位置 のセマンティクスを
float4 pos : POSITION;に変更すると、次のようになることがわかりました。
2番目の位置へ: 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の入力位置のセマンティクスを持っている必要があることです (これは、システムセマンティクスの 1 つです)。

おまけとして、一般的に使用されるものをいくつかお勧めします。

  • int size = ARRYSIZE(inputayoutDesc);
  • D3D11_APPEND_ALIGNED_ELEMENT12、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 に答える