#c #graphics #directx #game-engine #direct2d
Вопрос:
У меня есть графический движок, использующий ID2D1Device1, но я не могу изменить его, чтобы использовать ID2D1Device3. Кто-нибудь знает где-нибудь пример? Вот мой основной код:
Microsoft::WRL::ComPtr<ID2D1Device1> dev2d;
Microsoft::WRL::ComPtr<ID2D1DeviceContext3> devCon3;
Microsoft::WRL::ComPtr<ID3D11Device> dev; // the actual Direct3D device
Microsoft::WRL::ComPtr<ID3D11DeviceContext> devCon; // device context
Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;// to get the DXGI factory
Microsoft::WRL::ComPtr<IDXGIAdapter> dxgiAdapter;// to get the DXGI factory
Microsoft::WRL::ComPtr<IDXGIFactory> dxgiFactory;// to get the DXGI factory
Microsoft::WRL::ComPtr<IDXGISwapChain> swapChain; // the swap chain
D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, 0, createDeviceFlags, NULL, 0, D3D11_SDK_VERSION, amp;dev, amp;featureLevel, amp;devCon);
Hres = dev.As(amp;dxgiDevice);
Hres = dxgiDevice->GetAdapter(dxgiAdapter.GetAddressOf());
Hres = dxgiAdapter->GetParent(__uuidof(IDXGIFactory), amp;dxgiFactory);
Hres = dxgiFactory->CreateSwapChain(dev.Get(), amp;scd, swapChain.GetAddressOf());
Hres = (D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, __uuidof(ID2D1Factory3), amp;options, amp;factory));
Hres = (dev.Get()->QueryInterface(__uuidof(IDXGIDevice), amp;dxgiDevice));
Hres = factory->CreateDevice(dxgiDevice.Get(), amp;dev2d);
Hres = dev2d->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, amp;devCon3);
в последней строке я получаю ошибку «C ни один экземпляр перегруженной функции не соответствует списку аргументов».
Я не могу понять, как вызвать эту функцию с помощью ID2D1Device3 .
Я попытался изменить createdevice (предыдущая строка), чтобы создать указатель device3, но затем он жалуется на ту же ошибку.
Хорошо , спасибо, Чак, теперь у меня есть это, которое, кажется, работает….посмотрим
Microsoft::WRL::ComPtr<ID2D1Device3> dev3d;
Hres = (D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, __uuidof(ID2D1Factory3), amp;options, amp;factory));
//obtain the ID2D1Device3 interface.
dev3d.Get()->QueryInterface(__uuidof(IDXGIDevice), amp;dxgiDevice);
D2D1_DEVICE_CONTEXT_OPTIONS options;
Hres = factory->CreateDevice(dxgiDevice.Get(), amp;dev2d);
dev3d->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, amp;devCon3);
Вызов CreateDevice не работает из-за несоответствия аргументов.
Должен ли я вызывать его с помощью ID2D1Device1 ?
Hres = (dev3d.Get()->QueryInterface(__uuidof(IDXGIDevice), amp;dxgiDevice));
Hres = factory->CreateDevice(dxgiDevice.Get(), amp;dev3d);
Hres = dev3d->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS, amp;devCon3);
Ответ №1:
Вам нужно сначала использовать QueryInterface()
— или, поскольку вы используете Microsoft::WRL::ComPtr
, просто используйте As
оператора — для получения ID2D1Device3
интерфейса. У него есть метод:
STDMETHOD(CreateDeviceContext)(
D2D1_DEVICE_CONTEXT_OPTIONS options,
_COM_Outptr_ ID2D1DeviceContext3 **deviceContext3
) PURE;
В настоящее время вы используете ID2D1Device1
метод, в котором этого метода нет.