如何使用Win2D渲染到现有的DirectX曲面中?

时间:2019-05-30 20:15:16

标签: c# directx interop directx-11 win2d

这个问题的改写可能是一个潜在的答案:我可以使用CanvasDeviceComPtr<ID3D11Device>创建可用的Win2D CanvasDevice.CreateFromDirect3D11Device(IDirect3DDevice direct3DDevice)吗? (如果是这样,如何将ComPtr<ID3D11Device>转换/广播为IDirect3DDevice?)

背景:

我有一个Windows UWP应用程序,该应用程序使用SwapChainPanel控件作为主要UI元素。作为设置的一部分,将获取Microsoft::WRL::ComPtr < ID3D11Device >并将其保存在C ++实现类中,该类用于OpenGLES / Angle渲染。从SwapChainPanel创建了EGLSurface,并且大多数应用程序内容都通过OpenGL ES通过Angle渲染到了其中。

我使用一些单独的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();

我希望能够渲染到从主UI的SwapChainPanel创建的同一EGLSurface中,但是使用现在已经存在的Win2D命令。在某种程度上,这是为了我可以根据需要交错渲染对象的层,无论它们是通过OpenGL ES / ANGLE还是Win2D渲染。

是否可以使用互操作来从我可以访问的CanvasDevice对象创建合适的Win2D对象(例如,CanvasSwapChainCanvasDrawingSessionMicrosoft::WRL::ComPtr<ID3D11Device>)? / p>

我的理解是Win2D位于DirectX之上,因此似乎应该可行。

1)到目前为止,我在https://github.com/microsoft/Win2D-Samples/blob/master/ExampleGallery/Direct3DInterop/SpriteBatchPerformance.cpp处找到了一些互操作代码,但是看起来像是一个相反的方向,以便从Win2D对象开始进行DirectX调用。

2)我也尝试过在C ++类中提供访问器方法,以返回在那里引用的Microsoft::WRL::ComPtr<ID3D11Device>对象作为参数

CanvasDevice.CreateFromDirect3D11Device()

(我正在尝试使用它代替当前使用的CanvasDevice.GetSharedDevice()。)由于该参数为IDirect3DDevice direct3DDevice,因此不确定是否甚至可以使用-但可能会强制转换工作。但是,我目前在将C3986“公共成员的签名包含本机类型Microsoft::WRL::ComPtr<ID3D11Device>的方法上将本机类型返回到C#,所以我还不知道返回的类型是否还能工作。也许是强制转换< em>之前将其返回到托管代码可以接受的东西上(我是C#新手)

0 个答案:

没有答案