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 模板不起作用:一个或多个参数无效