Один потенциальный ответ был бы основан на перефразировке вопроса: могу ли я создать пригодный для использования Win2D CanvasDevice
из ComPtr<ID3D11Device>
, используя CanvasDevice.CreateFromDirect3D11Device(IDirect3DDevice direct3DDevice)
?(И если так, как мне преобразовать / привести ComPtr<ID3D11Device>
в IDirect3DDevice
?)
Фон:
У меня есть приложение Windows UWP, которое использует элемент управления SwapChainPanel
в качествеосновной элемент пользовательского интерфейса.Как часть установки, Microsoft::WRL::ComPtr < ID3D11Device >
получается и хранится внутри класса реализации C ++, где он используется для рендеринга OpenGLES / Angle.EGLSurface создается из SwapChainPanel
, и большая часть содержимого приложения визуализируется в нем с использованием OpenGL ES через Angle.
У меня есть текст, который отображается в TOP этого, используя отдельный элемент управления Win2D CanvasSwapChainPanel
, указанный отдельно в другом файле View.xaml:
<canvas:CanvasSwapChainPanel x:Name="canvasSwapChainPanel" IsHitTestVisible="False" x:FieldModifier="public"/>
СоответствующийView.xaml.cs содержит код
CanvasDevice device = CanvasDevice.GetSharedDevice();
float h = (float)EnrouteMap.ActualHeight;
float w = (float)EnrouteMap.ActualWidth;
CanvasSwapChain swapChain = new CanvasSwapChain(device, h, w, 96);
canvasSwapChainPanel.SwapChain = swapChain;
, который позволяет мне позже визуализировать текст с помощью объектов и методов Win2D;Например, я создаю CanvasDrawingSession
, используя CanvasSwapChain
:
CanvasDrawingSession drawingSession = swapChain.CreateDrawingSession(Colors.Transparent);
CanvasTextLayout textLayout = new CanvasTextLayout(drawingSession labelText, _textFormat, 0.0f, 0.0f);
drawingSession(textLayout, 0.0f, 0.0f, Colors.White);
swapChain.Present();
drawingSesssion.Dispose();
Я хотел бы иметь возможность рендеринга в тот же EGLSurface
, который был создан из SwapChainPanel основного пользовательского интерфейса, но с использованиемКоманды Win2D, которые сейчас на месте.Частично это сделано для того, чтобы я мог чередовать слои визуализированных объектов по мере необходимости, независимо от того, визуализируются ли они с помощью OpenGL ES / ANGLE или Win2D.
Доступно ли взаимодействие для создания соответствующего объекта Win2D (например, CanvasDevice
, CanvasSwapChain
, CanvasDrawingSession
) из объекта Microsoft::WRL::ComPtr<ID3D11Device>
, к которому я могу получить доступ?
Насколько я понимаю, Win2D находится поверх DirectX, так что, похоже, это должно быть возможно.
1) До сих пор я нашел некоторый код взаимодействия в https://github.com/microsoft/Win2D-Samples/blob/master/ExampleGallery/Direct3DInterop/SpriteBatchPerformance.cpp,, но похоже, что он просто позволяет идти в противоположном направлении, чтобы делать вызовы DirectX при запуске с объектами Win2D.
2) Я также попытался предоставить методы доступа в класс C ++, чтобы вернуть объект Microsoft::WRL::ComPtr<ID3D11Device>
, на который есть ссылки, в качестве аргумента
CanvasDevice.CreateFromDirect3D11Device()
(я пытался использовать этов качестве замены CanvasDevice.GetSharedDevice()
, как используется в настоящее время.) Не уверен, что это сработает, учитывая, что аргументом для этого является IDirect3DDevice direct3DDevice
- но, возможно, будет работать некоторое приведение.Однако в настоящее время я получаю, что подпись C3986 "public member содержит собственный тип Microsoft::WRL::ComPtr<ID3D11Device>
для метода, который возвращает это в C #, поэтому я пока не знаю, будет ли возвращаемый тип работать. Может быть, приведение перед возвратом чего-нибудь приемлемого для управляемого кода? (Я новичок в C #)