E_INVALIDARG 一个或多个参数无效。 dx11 创建输入布局

Posted

技术标签:

【中文标题】E_INVALIDARG 一个或多个参数无效。 dx11 创建输入布局【英文标题】:E_INVALIDARG One or more arguments are invalid. dx11 CreateInputLayout 【发布时间】:2022-01-19 08:23:41 【问题描述】:

我尝试创建一个 3d 应用程序,并且实例化在位置上运行良好。我想为实例设置颜色,但它不起作用,我收到运行时错误“E_INVALIDARG 一个或多个参数无效。”。


    float4 Pos : POSITION;  // question 1
    float2 Tex : TEXCOORD0;
    float4 InstancePosition : TEXCOORD1; // instance data - ok
    float3 InstanceColor : COLOR; // question 2 (without it works fine)
;


PS_INPUT VS(VS_INPUT input)

    PS_INPUT output = (PS_INPUT)0;
    ...


C++ part:
        D3D11_INPUT_ELEMENT_DESC layout[] =
        
            // data from vertex buffer
             "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,  D3D11_INPUT_PER_VERTEX_DATA, 0  // question 1
            , "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 

            // data from instance buffer
            , "TEXCOORD", 1, DXGI_FORMAT_R32G32B32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 
            , "COLOR", 1, DXGI_FORMAT_R32G32B32_FLOAT, 1, 12, D3D11_INPUT_PER_INSTANCE_DATA, 1  // question 2 (without it works fine)
        ;
        UINT numElements = ARRAYSIZE(layout);

        hr = g_pd3dDevice->CreateInputLayout(layout, numElements, pVSBlob->GetBufferPointer(),
            pVSBlob->GetBufferSize(), &g_pVertexLayout2); // <== error: "E_INVALIDARG One or more arguments are invalid."

问题 1:在 VS 中它说“float4 Pos : POSITION;”,但是 C++ 代码是“”POSITION”,DXGI_FORMAT_R32G32B32_FLOAT”(=12 字节,float3),为什么它有效? (效果很好) 问题 2:我无法将其他数据添加到实例(颜色)。 问题 3:我也意识到,VS 和 C++ 中的名称可以不同,正如您在 VS 中看到的那样:“POSITION, TEXCOORD0, TEXCOORD1”,在 C++ 中:“POSITION, TEXCOORD, TEXCOORD”。知道为什么吗?我认为它们必须是相同的 VS/C++。 我被困了几个星期 - 任何帮助将不胜感激。

【问题讨论】:

由于您是 Direct3D 11 的新手,您可能想看看 DirectX Tool Kit for DX11。 【参考方案1】:

在 Visual Studio 中,底部有对该问题的解释,基于它,我可以修复代码。最终的 - 也是有效的 - 一个是:

D3D11_INPUT_ELEMENT_DESC layout[] =
        
            // data from vertex buffer
             "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,  D3D11_INPUT_PER_VERTEX_DATA, 0 
            , "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 

            // data from instance buffer
            , "TEXCOORD", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 
            , "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 12, D3D11_INPUT_PER_INSTANCE_DATA, 1 

        ;

问题出在第二个参数(索引)0 iso 1。我应该更仔细地阅读这篇精彩的文章:https://www.braynzarsoft.net/viewtutorial/q16390-34-aabb-cpu-side-frustum-culling

【讨论】:

以上是关于E_INVALIDARG 一个或多个参数无效。 dx11 创建输入布局的主要内容,如果未能解决你的问题,请参考以下文章

HRESULT 异常:0x80070057 (E_INVALIDARG)

参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))

参数错误。 (异常来自 HRESULT:0x80070057 (E_INVALIDARG))

dynamoDB 的 CloudFormation 模板不起作用:一个或多个参数无效

CoCreateInstance 返回 E_INVALIDARG

该 URL 包含一个或多个无效字符