c++ - 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,调试器确认。
解决方案
原来在我的机器上构建的exe无法在其他计算机上创建PSO,但是如果该项目要在其他机器上构建并在我的机器上运行,就不会有PSO问题。
重新安装 Windows SDK 有助于消除该问题。
推荐阅读
- javascript - 在 textarea 中键入时,JavaScript 表单验证消息不断触发
- laravel - Laravel Summernote 在显示中
- html - 如何根据屏幕大小允许多个列大小?
- pdf - 如何格式化/标记水平跨多个页面的可访问 PDF 表格?
- java-8 - 流式传输对象,发送具有可完成未来的请求并将结果分配给对象
- javascript - 如何在 v-bind 和 v-for 中获取要使用的对象
- jquery - JQuery 函数没有正确删除类(select2Buttons)
- javascript - Is this the most efficient use of ES6 to find factors without a loop?
- c++ - 在什么意义上 std::disjunction 在 compile_time 短路
- django - 具有长期计划任务的 Django + Celery