Я работаю с 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 :: EnumAdapters1 для запроса экземпляра.
Но, глядя на сигнатуру функции, я получаю только IDXGIAdapter1.
HRESULT EnumAdapters1(
UINT Adapter,
[out] IDXGIAdapter1 **ppAdapter
);
Как мне перечислить экземпляры IDXGIAdapter2?
Числа на CreateDXGIFactory
связаны с изменениями в сигнатуре этой функции, а не с интерфейсами, реализованными возвращенным COM-объектом. Особенно, CreateDXGIFactory2
добавил Flags
параметр.
Вы получите ссылку на нужный интерфейс так же, как и любой другой COM-объект. Или:
Передайте IID желаемого интерфейса как riid
затем приведите возвращенный объект к этому интерфейсу ИЛИ
Передайте IID интерфейса, такого как IUnknown
, Вызов QueryInterface
на возвращенный объект для получения желаемого интерфейса. Это может быть полезно, если вы хотите поддерживать несколько версий, так как вы можете попробовать версию 5 и, если она не найдена, вернуться к версии 4, например.
Например, вариант 1 может выглядеть так:
IDXGIFactory2* factory;
HRESULT hr = CreateDXGIFactory2(0, IID_IDXGIFactory5, (void**)&factory);
if(SUCCEEDED(hr))
{
// ...
}
Вы должны включить соответствующий заголовок для типа интерфейса
#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
функции просто перегруженные версии CreateDXGIFactory
для DXGI 1.1 — 1.5, однако CreateDXGIFactory
для создания IDXGIFactory
DXGI 1.0 объекты. Для создания объекта DXGIFactory5 вы должны использовать DXGI 1.5 (Windows 10 Direct3D 12). Чтобы лучше понять назначение функции CheckFeatureSupport и почему вы хотите ее увидеть этот объяснение Direct3D 12 уровней.