Как рисовать на WinUI-3 контролы из С++ библиотеки на directX
Всем привет
У нас есть С++ либа, которая использует для рендеринга DirectX 9. Стоит задача использовать ее в WinUI-3 приложении на C#.
Ранее, когда стояла задача использовать эту библиотеку с WPF приложением делал так:
из С++ получал back buffer:
IDirect3DSurface9 *pSurf = NULL;
m_pD3Ddevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurf);
Затем на шарпе использовал D3DImage контрол и в него делал D3DImage.SetBackBuffer(), передавая указатель полученный из С++ и флаг D3DResourceType.IDirect3DSurface9
Но в WinUI 3 такого контрола нет (вроде как) и пока не могу найти работающего способа рендерить что-то на контролы из WinUI с помощью директX напрямую
Да, я нашел много разных упоминаний типа https://stackoverflow.com/questions/36840262/uwp-and-directx
но не нашел ни одного работающего примера.
Может кто-то помочь найти работающий пример, чтобы понять как это люди делают, или описать механизм как имея С++ код с директХ рисовать по WinUI контролу?
Ответы (1 шт):
Немного истории. До WinUI была, и есть библиотека Windows.UI.XAML, и в ней такая возможность была (и есть) при помощи контрола SwapChainPanel.
// FILE: DirectXPage.xaml
<SwapChainPanel x:Name="swapChainPanel">
<TextBlock Text="Test New App #1"
HorizontalAlignment="Right"
VerticalAlignment="Top"
FontSize="30" />
</SwapChainPanel>
Далее, уже в С++ коде, он связывался с объектом IDXGISwapChain4:
// Объявление
winrt::com_ptr<IDXGISwapChain4> m_swapChain;
// Связывание ...
com_ptr<IDXGISwapChain1> swapChain;
check_hresult(m_dxgiFactory->CreateSwapChainForComposition(m_commandQueue.get(), &swapChainDesc, nullptr, swapChain.put()));
m_swapChain = swapChain.as<IDXGISwapChain4>();
m_swapChainPanel.Dispatcher().RunAsync(
winrt::Windows::UI::Core::CoreDispatcherPriority::High, [=]() {
com_ptr<ISwapChainPanelNative> panelNative{ m_swapChainPanel.as<ISwapChainPanelNative>() };
panelNative->SetSwapChain(m_swapChain.get());
});
И, в конце концов, происходит отрисовка:
// Презентация
m_swapChain->Present(1, 0);
Дело, однако, в том, что для это нужен DirectX 12 (никак не ниже, точно не версии 9, хотя есть теоретическая возможность использовать 11on12, но я не проверял):
// Такой девайс нужен
winrt::com_ptr<ID3D12Device5> m_d3dDevice;
Заканчивая повествование, Microsoft.WinUI создаётся "по образу и подобию" Windows.UI.XAML, но чтобы не зависеть от версии Windows. На данный момент (WinUI 3, WinAppSDK 1.1) реализации контрола SwapChainPanel в ней нет.
Кстати, полезная программa "WinUI 3 Gallery". Официально от Microsoft, в поиске найти можно. Её ценность, что прям в ней можно искать все текущие реализованные контролы и примеры их использования со ссылками на документацию.
Если без WinUI 3, а на "чистом" Windows UWP XAML C++, то выглядит совместное использование всего этого так:
