2

我正在使用 C++处理DXGIDirectX 11 。目前我正在尝试使用 IDXGIFactory。经过一些研究和阅读文档后,我注意到有不同的版本。

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 实例?

4

2 回答 2

4
  1. IDXGIFactory5 接口继承自 IDXGIFactory4
  2. IDXGIFactory4 接口继承自 IDXGIFactory3
  3. IDXGIFactory3 接口继承自 IDXGIFactory2
  4. IDXGIFactory2 接口继承自 IDXGIFactory1

您必须为接口类型包含适当的标题

#include <DXGI1_5.h>

并声明了正确指针类型的实例

IDXGIFactory5* outPtr = nullptr; \\this really should be a CComPtr

并调用CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);。如果成功,您将获得一个 IDXGIFactory5,它具有 IDXGIFactory4、IDXGIFactory3、IDXGIFactory2 和 IDXGIFactory1 具有的所有方法,以及它自己的CheckFeatureSupport方法。CreateDXGIFactory1CreateDXGIFactory2函数只是CreateDXGIFactoryDXGI 1.1 - 1.5 的重载版本,但用于CreateDXGIFactory创建IDXGIFactoryDXGI 1.0 对象。要创建 DXGIFactory5 对象,您必须使用 DXGI 1.5 (Windows 10 Direct3D 12)。要更好地理解 CheckFeatureSupport 函数的用途以及为什么需要它,请参阅Direct3D 12 级别说明。

于 2017-02-20T22:04:52.700 回答
2

上的数字CreateDXGIFactory与该函数签名的更改有关,与返回的 COM 对象实现的接口无关。特别是CreateDXGIFactory2添加了Flags参数。

您将以与任何其他 COM 对象相同的方式获得对所需接口的引用。任何一个:

  1. 将所需接口的 IID 传递为riid,然后将返回的对象强制转换为该接口或

  2. 传递接口的 IID,例如IUnknown. 调用QueryInterface返回的对象以获得所需的接口。如果您想支持多个版本,这可能很有用,例如,您可以尝试版本 5,如果找不到,则回退到版本 4。

例如,选项 1 可能如下所示:

IDXGIFactory2* factory;
HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory);
if(SUCCEEDED(hr))
{
  // ...
}
于 2017-02-20T21:27:09.880 回答