CreateGraphicsPipelineState 失败并显示E_INVALIDARG

CreateGraphicsPipelineState fails with E_INVALIDARG

本文关键字:INVALIDARG 显示 失败 CreateGraphicsPipelineState      更新时间:2023-10-16

在Directx 12 中创建管道状态对象失败,E_INVALIDARG调试层输出一堆废话,说实例中的数据无效D3D12_GRAPHICS_PIPELINE_STATE_DESC

D3D12 错误: ID3D12Device::CreateBlendState: DestBlendAlpha[ 0 ] is 尝试使用D3D11_BLEND值 (0x4) 来操作颜色,这 无效。[ STATE_CREATION错误 #115: CREATEBLENDSTATE_INVALIDDESTBLENDALPHA] D3D12 错误: ID3D12Device::CreateDepthStencilState: BackFace.StencilFailOp 有一个 无法识别的值。[ STATE_CREATION错误 #106: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFAILOP] D3D12 错误: ID3D12Device::CreateDepthStencilState: BackFace.StencilDepthFailOp has 无法识别的值。[ STATE_CREATION错误 #107: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILZFAILOP] D3D12 错误: ID3D12Device::CreateDepthStencilState: BackFace.StencilPassOp 有一个 无法识别的值。[ STATE_CREATION错误 #108: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILPASSOP] D3D12 错误: ID3D12Device::CreateDepthStencilState: BackFace.StencilFunc 有一个 无法识别的值。[ STATE_CREATION错误 #109: CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFUNC] D3D12 错误: ID3D12设备::创建光栅器状态:填充模式具有无法识别的内容 价值。[ STATE_CREATION错误 #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误: ID3D12设备::创建光栅器状态:填充模式必须为 D3D12_FILL_MODE_SOLID 当保守栅格 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON:填充模式 = D3D12_FILL_MODE_WIREFRAME,保守光栅 = D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON. [ STATE_CREATION错误 #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误: ID3D12设备::创建*:指定的节点掩码 (0xcccccccc) 包含一个 超出设备节点计数的位集。[ STATE_CREATION错误 #900:INVALID_NODE_INDEX]

不胜枚举...

看起来内存已损坏,而事实并非如此,我已经一遍又一遍地检查了所有值,它们很好。 至少某些值必须是正确的,例如查看最后一条消息,它说

指定的节点掩码 (0xcccccccc)

。我确定在调用之前没有0xccccccccCreateGraphicsPipelineState调试器确认。

事实证明,在我的机器上构建的exe将无法在其他计算机上创建PSO,但是如果要在其他机器上构建项目并在我的机器上运行,则不会出现PSO问题。

重新安装 Windows SDK 有助于消除该问题。

我读过有人的回答,声称重新安装或更改 SDK 版本为他们解决了问题。但不适合我。这实际上是我的程序.exe旁边缺少的dxil.dll

您可以先尝试将psoDesc初始化为零,以避免不正确的值,例如NodeMask字段中的0xcccccccc

D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {};