这个问题的改写可能是一个潜在的答案:我可以使用CanvasDevice
从ComPtr<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对象(例如,CanvasSwapChain
,CanvasDrawingSession
,Microsoft::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#新手)