【问题标题】:CreateInputLayout returns E_INVALIDARGCreateInputLayout 返回 E_INVALIDARG
【发布时间】:2019-09-26 12:57:18
【问题描述】:

我正在使用 DirectX11 用 C++ 编写程序。现在我想从着色器开始,为此我还需要 ID3D11InputLayout

//in main
shader.Bind(DeviceContext);

ID3D11InputLayout *pLayout;
D3D11_INPUT_ELEMENT_DESC ied[] =
{
    {"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},
};

HRESULT hh = Device->CreateInputLayout(ied, 2, shader.GetVSBlob()->GetBufferPointer(), shader.GetVSBlob()->GetBufferSize(), &pLayout);

DeviceContext->IASetInputLayout(pLayout);

//Vertex Shader
struct VOut
{
float4 position : SV_POSITION;
float4 color : COLOR;
};

VOut main(float4 position : POSITION, float4 color : COLOR)
{
VOut output;

output.position = position;
output.color = color;

return output;
}
//pixel shader
struct VOut
{
float4 position : SV_POSITION;
float4 color : COLOR;
};

float4 main(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
return color;
}

Device->CreateInputLayout() 返回 E_INVALIDARG。

【问题讨论】:

    标签: c++ graphics directx directx-11


    【解决方案1】:

    在您的描述中,您将 POSITION 定义为 R32G32B32,但着色器应为 float4,这是为什么呢?

    要么是这样,要么是 blob 数据有问题。我假设着色器 blob 数据用于顶点着色器而不是像素着色器?

    【讨论】:

    • 着色器 blob 数据适用于两者
    • 试试看:float4 main(VOut input) : SV_TARGET { return input.color; }
    【解决方案2】:

    启用Direct3D Debug Device 并查找调试输出。

    D3D11 ERROR: ID3D11Device::CreateInputLayout: The provided input signature expects
    to read an element with SemanticName/Index: 'SV_Position'/0, but the declaration
    doesn't provide a matching name.
    [ STATE_CREATION ERROR #163: CREATEINPUTLAYOUT_MISSINGELEMENT]
    

    在这种情况下,您会看到您在布局中使用了传统的“POSITION”语义,但在着色器中使用了“SV_Position”。它们需要保持一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      相关资源
      最近更新 更多