【发布时间】: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。
标签: c++ arguments directx-11 vertex-shader