首页 > 解决方案 > CreateGraphicsPipelineState 失败并显示 E_INVALIDARG

问题描述

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

D3D12 错误:ID3D12Device::CreateBlendState: DestBlendAlpha[ 0 ] 正在尝试使用 D3D11_BLEND 值 (0x4) 来操纵颜色,这是无效的。[ STATE_CREATION 错误 #115:CREATEBLENDSTATE_INVALIDDESTBLENDALPHA] D3D12 错误:ID3D12Device::CreateDepthStencilState: BackFace.StencilFailOp 具有无法识别的值。[ STATE_CREATION 错误 #106:CREATEDEPTHSTENCILSTATE_INVALIDBACKFACSTENCILFAILOP] D3D12 错误:ID3D12Device::CreateDepthStencilState: BackFace.StencilDepthFailOp 具有无法识别的值。[ STATE_CREATION 错误 #107:CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILZFAILOP] D3D12 错误:ID3D12Device::CreateDepthStencilState: BackFace.StencilPassOp 具有无法识别的值。[STATE_CREATION 错误 #108:CREATEDEPTHSTENCILSTATE_INVALIDBACKFACETENCILPASSOP] D3D12 错误:ID3D12Device::CreateDepthStencilState: BackFace.StencilFunc 具有无法识别的值。[ STATE_CREATION 错误 #109:CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFUNC] D3D12 错误:ID3D12Device::CreateRasterizerState: FillMode 具有无法识别的值。[STATE_CREATION 错误 #95:CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREF_MODERAME,Conservative_RASTERIZATION1_MODE_ON2CONSERVATIVE_RASTERIZATION1 [STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] [ STATE_CREATION 错误 #109:CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFUNC] D3D12 错误:ID3D12Device::CreateRasterizerState: FillMode 具有无法识别的值。[STATE_CREATION 错误 #95:CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREF_MODERAME,Conservative_RASTERIZATION1_MODE_ON2CONSERVATIVE_RASTERIZATION1 [STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] [ STATE_CREATION 错误 #109:CREATEDEPTHSTENCILSTATE_INVALIDBACKFACESTENCILFUNC] D3D12 错误:ID3D12Device::CreateRasterizerState: FillMode 具有无法识别的值。[STATE_CREATION 错误 #95:CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREF_MODERAME,Conservative_RASTERIZATION1_MODE_ON2CONSERVATIVE_RASTERIZATION1 [STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] ID3D12Device::CreateRasterizerState: FillMode 具有无法识别的值。[STATE_CREATION 错误 #95:CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREF_MODERAME,Conservative_RASTERIZATION1_MODE_ON2CONSERVATIVE_RASTERIZATION1 [STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] ID3D12Device::CreateRasterizerState: FillMode 具有无法识别的值。[STATE_CREATION 错误 #95:CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREF_MODERAME,Conservative_RASTERIZATION1_MODE_ON2CONSERVATIVE_RASTERIZATION1 [STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREFRAME,ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON。[STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] CreateRasterizerState:当 ConservativeRaster 为 D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON 时,FillMode 必须为 D3D12_FILL_MODE_SOLID:FillMode = D3D12_FILL_MODE_WIREFRAME,ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_ON。[STATE_CREATION ERROR #95: CREATERASTERIZERSTATE_INVALIDFILLMODE] D3D12 错误:ID3D12Device::Create*: 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引] 指定的节点掩码 (0xcccccccc) 包含超出设备节点计数的位设置。[状态创建错误#900:无效节点索引]

名单还在继续……

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

指定节点掩码(0xcccccccc)

…我确定在CreateGraphicsPipelineState调用之前它不是 0xcccccccc,调试器确认。

标签: c++directx-12

解决方案


原来在我的机器上构建的exe无法在其他计算机上创建PSO,但是如果该项目要在其他机器上构建并在我的机器上运行,就不会有PSO问题。

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


推荐阅读