【问题标题】:IDXGIFactory versionsIDXGIFactory 版本
【发布时间】:2017-02-20 21:17:07
【问题描述】:

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

IDXGIFactory IDXGIFactory1 IDXGIFactory2 IDXGIFactory3 IDXGIFactory4 IDXGIFactory5

但我也注意到只有前 3 个 IDXGIFactory 版本创建此类实例的方法,而后 3 个则没有。

创建DXGIFactory 创建DXGIFactory1 创建DXGIFactory2

没有 CreateDXGIFactory3、CreateDXGIFactory4 或 CreateDXGIFactory5。

所以我的问题是如何创建 IDXGIFactory5 实例?

此外,我想知道自己是否无法实例化 IDXGIFactory5 的实例,如何强制 D3D11CreateDevice 在内部创建和使用 IDXGIFactory5,以便从生成的 ID3D11Device 中检索引用?

编辑:

好的,现在我了解了不同的 CreateDXGIFactory 函数以及如何创建 IDXGIFactory5 实例。 但是在理解了这一点之后,我遇到了下一个问题。 IDXGIAdapter2 的文档说我应该使用 IDXGIFactory1::EnumAdapters1 来查询实例。 但看看函数签名,我只得到一个 IDXGIAdapter1。

HRESULT EnumAdapters1(
    UINT Adapter,
    [out] IDXGIAdapter1 **ppAdapter
);

如何枚举 IDXGIAdapter2 实例?

【问题讨论】:

  • CreateDXGIFactory 是 Direct3D 10 的原始 DXGI 1.0 工厂函数。对于 Direct3D 11,您应该始终使用 CreateDXGIFactory1 并创建 IDXGIFactory1 或更高版本的接口。对于 Windows 8.1 和 Windows 10 上的调试版本,您可以使用 CreateDXGIFactory2 创建 IDXGIFactory1 或更高版本的调试版本——例如,请参阅 this template。对于 DIrect3D 12,您可以假设 CreateDXGIFactory2并且支持IDXGIFactory4 或更高版本。

标签: c++ directx-11 dxgi


【解决方案1】:
  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 函数只是 DXGI 1.1 - 1.5 的 CreateDXGIFactory 的重载版本,但是 CreateDXGIFactory 用于创建 IDXGIFactory DXGI 1.0 对象。要创建 DXGIFactory5 对象,您必须使用 DXGI 1.5 (Windows 10 Direct3D 12)。要更好地了解 CheckFeatureSupport 函数的用途以及为什么需要它,请参阅 this Direct3D 12 级别的说明。

【讨论】:

    【解决方案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))
    {
      // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2017-06-09
      • 2018-11-17
      • 2021-01-22
      • 2016-04-15
      相关资源
      最近更新 更多