我正在使用C ++使用 DXGI 和 DirectX 11 。 目前我正在尝试使用IDXGIFactory。 经过一些研究和阅读the documentation后,我注意到有不同的版本。
IDXGIFactory IDXGIFactory1 IDXGIFactory2 IDXGIFactory3 IDXGIFactory4 IDXGIFactory5
但我也注意到,只有方法可以为前3个IDXGIFactory版本创建这样的实例,但不会为最后3个版本创建这样的实例。
CreateDXGIFactory CreateDXGIFactory1 CreateDXGIFactory2
没有CreateDXGIFactory3,CreateDXGIFactory4或CreateDXGIFactory5。
所以我的问题是如何创建IDXGIFactory5实例?
此外我想知道我是否无法自己实例化IDXGIFactory5的实例如何强制D3D11CreateDevice在内部创建和使用IDXGIFactory5以便我可以从生成的ID3D11Device中检索引用?
修改
现在好了,我了解了不同的CreateDXGIFactory函数以及如何创建IDXGIFactory5实例。 但在理解了这一点后,我得到了下一个问题。 来自IDXGIAdapter2的文档说我应该使用IDXGIFactory1 :: EnumAdapters1来查询实例。 但是看看函数签名我只得到一个IDXGIAdapter1。
HRESULT EnumAdapters1(
UINT Adapter,
[out] IDXGIAdapter1 **ppAdapter
);
如何枚举IDXGIAdapter2实例?
答案 0 :(得分:2)
CreateDXGIFactory
上的数字与该函数签名的更改有关,而与返回的COM对象实现的接口无关。特别是,CreateDXGIFactory2
添加了Flags
参数。
您将以与任何其他COM对象相同的方式获取对所需接口的引用。之一:
将所需接口的IID传递为riid
,然后将返回的对象强制转换为该接口或
传递IUnknown
等接口的IID。在返回的对象上调用QueryInterface
以获取所需的接口。如果您想支持多个版本,这可能很有用,因为您可以尝试使用版本5,如果找不到版本,则可以回退到版本4,例如。
例如,选项1可能如下所示:
IDXGIFactory2* factory;
HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory);
if(SUCCEEDED(hr))
{
// ...
}
答案 1 :(得分:2)
您必须为接口类型
添加适当的标头 #include <DXGI1_5.h>
并声明了正确指针类型的实例
IDXGIFactory5* outPtr = nullptr; \\this really should be a CComPtr
并致电CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);
。如果成功,您就拥有了IDXGIFactory5,其中包含IDXGIFactory4,IDXGIFactory3,IDXGIFactory2和IDXGIFactory1所具有的所有方法,以及它自己的CheckFeatureSupport方法。对于DXGI 1.1 - 1.5,CreateDXGIFactory1
和CreateDXGIFactory2
函数只是CreateDXGIFactory
的重载版本,但CreateDXGIFactory
用于创建IDXGIFactory
DXGI 1.0对象。要创建DXGIFactory5对象,您必须使用DXGI 1.5(Windows 10 Direct3D 12)。为了更好地理解CheckFeatureSupport函数的用途以及为什么需要它,请查看Direct3D 12级别的this解释。