Как я могу сделать рендеринг в существующую поверхность DirectX, используя Win2D? - PullRequest
0 голосов
/ 30 мая 2019

Один потенциальный ответ был бы основан на перефразировке вопроса: могу ли я создать пригодный для использования 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 #)

...