CreateInputLayout returns E_INVALIDARG

CreateInputLayout returns E_INVALIDARG

本文关键字:INVALIDARG returns CreateInputLayout      更新时间:2023-10-16

我正在使用 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。

启用 Direct3D 调试设备并查找调试输出。

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"。它们需要保持一致。

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

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