我正在使用DXGI和DirectX 11使用C++。目前,我正在用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 1::EnumAdapters1 1查询实例。但是看看函数签名,我只得到了一个IDXGIAdapter1。
HRESULT EnumAdapters1(
UINT Adapter,
[out] IDXGIAdapter1 **ppAdapter
);
如何枚举IDXGIAdapter2实例?
发布于 2017-02-20 21:27:09
CreateDXGIFactory
上的数字与该函数签名的更改有关,而不是与返回的COM对象实现的接口相关。特别是,CreateDXGIFactory2
添加了Flags
参数。
您将以与任何其他COM对象相同的方式获得对所需接口的引用。以下任一项:
riid
,然后将返回的对象强制转换为该接口或IUnknown
)的IID。对返回的对象调用QueryInterface
以获得所需的接口。如果您想要支持多个版本,这可能是有用的,因为您可以尝试版本5,如果没有发现,请返回到版本4,例如。例如,备选方案1看起来可能如下:
IDXGIFactory2* factory;
HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory);
if(SUCCEEDED(hr))
{
// ...
}
发布于 2017-02-20 22:04:52
您必须为接口类型包括适当的头。
#include <DXGI1_5.h>
并声明了一个正确指针类型的实例。
IDXGIFactory5* outPtr = nullptr; \\this really should be a CComPtr
打电话给CreateDXGIFactory1(__uuidof(IDXGIFactory5),&outPtr);
。如果它成功了,您将得到一个IDXGIFactory5,它拥有IDXGIFactory4、IDXGIFactory3、IDXGIFactory2和IDXGIFactory1所拥有的所有方法,再加上它自己的CheckFeatureSupport方法。CreateDXGIFactory1
和CreateDXGIFactory2
函数只是DXGI1.1-1.5的CreateDXGIFactory
重载版本,而CreateDXGIFactory
用于创建IDXGIFactory
DXGI1.0对象。要创建DXGIFactory5对象,必须使用DXGI1.5 (Windows 10 Direct3D 12)。要更好地理解CheckFeatureSupport函数的用途以及为什么需要它,请参阅这对Direct3D 12级别的解释。
https://stackoverflow.com/questions/42354369
复制相似问题