获取ID3D12Device2接口失败,MeshShader管线创建问题求助
你已确认D3D12_FEATURE_D3D12_OPTIONS7支持(对应ID3D12Device5),但QueryInterface到ID3D12Device2失败,这不符合接口继承逻辑(ID3D12Device5 → Device4 → Device3 → Device2),说明问题大概率出在代码编译环境或接口定义上,而非硬件/系统支持。以下是具体排查步骤:
检查预处理器宏定义
确保在包含<d3d12.h>前定义正确的系统版本宏,ID3D12Device2要求至少Windows 10 1709(RS3):#define WINVER 0x0A00 #define NTDDI_VERSION NTDDI_WIN10_RS3 #include <d3d12.h>若未定义这些宏,
<d3d12.h>可能不会暴露ID3D12Device2的接口定义和IID,导致IID_PPV_ARGS使用错误的标识符。验证IID正确性
尝试手动指定ID3D12Device2的IID进行QueryInterface,排除头文件定义错误:const IID IID_ID3D12Device2 = {0x44710461, 0x704C, 0x4B22, {0xB3, 0x83, 0x75, 0x85, 0xBA, 0x71, 0x7D, 0x4D}}; ID3D12Device2* pDevice2; HRESULT hr = m_pDevice->QueryInterface(IID_ID3D12Device2, reinterpret_cast<void**>(&pDevice2));若此调用成功,说明项目中
<d3d12.h>的IID定义存在问题,需检查SDK包含路径是否有旧版本干扰。检查设备创建流程
确认m_pDevice的创建方式:调用D3D12CreateDevice时,直接请求ID3D12Device2或更高版本接口,而非先获取ID3D12Device再转换:ID3D12Device2* pDevice2 = nullptr; HRESULT hr = D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&pDevice2));若此方式能成功获取Device2,说明原
m_pDevice可能是被某种封装层限制了接口访问。排查项目编译配置
- 确认项目平台工具集为
v141(VS2017对应版本),未使用更低版本(如v140); - 检查项目属性→C/C++→常规→附加包含目录,确保优先使用Windows SDK 10.0.19041.0的头文件,无旧SDK路径;
- 确认编译目标为x64(D3D12仅支持64位应用),排除32位编译的兼容性问题;
- 检查链接器→输入→附加依赖项,确保链接的是Windows SDK 10.0.19041.0版本的
d3d12.lib,无旧版本库干扰。
- 确认项目平台工具集为
直接尝试更高版本接口
既然已确认D3D12_FEATURE_D3D12_OPTIONS7支持,可直接QueryInterface到ID3D12Device5,跳过Device2的转换:ID3D12Device5* pDevice5; HRESULT hr = m_pDevice->QueryInterface(IID_PPV_ARGS(&pDevice5)); if (SUCCEEDED(hr)) { pDevice5->CreatePipelineState(&desc, IID_PPV_ARGS(&pPipelineState)); pDevice5->Release(); }若此调用成功,说明设备本身支持高级接口,问题出在Device2的IID或头文件定义上。
内容的提问来源于stack exchange,提问作者Seize

