创建 IDXGIFactory1 然后查询 IDXGIFactory5 的任何原因:
CreateDXGIFactory1(IID_PPV_ARGS(&factory));
factory->QueryInterface(IID_PPV_ARGS(&factory5));
而不是仅仅创建 IDXGIFactory5:
CreateDXGIFactory1(IID_PPV_ARGS(&factory5));
?
当factory5具有factory1的所有方法时,为什么我可能需要在同一个应用程序中使用两个不同的接口版本(factory1和factory5)(我认为这不是为了向后兼容)?
同样的问题
ID3D11Device
、ID3D11Device5
和ID3D11DeviceContext
、ID3D11DeviceContext4
。
DXGI 随 Windows 一起提供。因此,随着新版本的 Windows 的出现,新版本的 DXGI 也随之而来。
您在官方文档中看不到这一点,因为微软只提到了迄今为止支持的版本(这并不是 100% 正确,但我们经常看到这一点)。
因此,由于
IDXGIFactory5
页面显示此内容:
这意味着
IDXGIFactory5
在 Windows 10 上受支持(截至今天仍然受支持)。如果您选中 IDXGIFactory6
,它会显示:
我们无法回到过去,但是,例如,Windows 7 仅支持 DXGI 最多
IDXGIFactory2
。
您还可以检查头文件(dxgi1_5.g、dxgi1_6.h 等),因为有时文档是错误的...并且...标头也会使用较新版本的 SDK 进行修改。
至于直接使用
CreateDXGIFactory1(IID_PPV_ARGS(&factory5));
,它应该可以工作(如果可以的话那就没问题了),因为这是首先接受 IID 类型参数的目的,但经验表明有时不支持这种快捷方式由于某种原因由底层实现决定。
注意:您还可以在较低版本的 Windows 上使用完全相同的代码,您应该收到
E_NOTINTERFACE
错误,这是预期的正常行为。
Direct3D 和 Direct2D 对象模型的情况大致相同。