我正在尝试基于WPF创建一个地图编辑器。目前我正在使用一种hack方法来渲染DirectX内容。我创建了一个WinFormsHost并在WinForms-Panel上进行渲染。
所有这些都是因为DirectX(我正在使用具有Featurelevel 10的DirectX 11)需要句柄(别名IntPtr)来进行渲染。我不知道如何在没有句柄的情况下初始化和使用DX设备。
但是WPF控件没有句柄。所以我刚刚发现了一个名为“D3DImage”的interop类。但我不知道如何使用它。
我的当前系统工作方式如下:
内部循环遍历“IGameloopElement”列表。对于每个元素,它调用“Draw()”来呈现其内容。之后,它调用交换链的“Present()”以显示更改。然后,它将设备重置为切换到下一个元素的句柄(大多数情况下只有一个元素)。
现在,因为D3DImage没有句柄,我该如何在其上进行渲染?我只知道我必须使用“Lock()”,然后“SetBackBuffer()”,“AddDirtyRect()”,然后“Unlock()”。
但是如果不指定设备的句柄,我该如何在DirectX11.Texture2D对象上进行渲染?
我真的迷失了...我刚在codeplex上找到了“DirectX 4 WPF”示例,但这个示例实现了所有版本的DirectX,自己管理设备,并具有如此巨大的开销。我想保持我的现有系统。我正在自己管理设备。我不希望WPF控件来处理它。
循环应该只调用“Render()”,然后将后备缓冲区纹理传递给WPF控件。
是否有人能告诉我如何做到这一点?我完全被卡住了...
非常感谢:)
R
所有这些都是因为DirectX(我正在使用具有Featurelevel 10的DirectX 11)需要句柄(别名IntPtr)来进行渲染。我不知道如何在没有句柄的情况下初始化和使用DX设备。
但是WPF控件没有句柄。所以我刚刚发现了一个名为“D3DImage”的interop类。但我不知道如何使用它。
我的当前系统工作方式如下:
内部循环遍历“IGameloopElement”列表。对于每个元素,它调用“Draw()”来呈现其内容。之后,它调用交换链的“Present()”以显示更改。然后,它将设备重置为切换到下一个元素的句柄(大多数情况下只有一个元素)。
现在,因为D3DImage没有句柄,我该如何在其上进行渲染?我只知道我必须使用“Lock()”,然后“SetBackBuffer()”,“AddDirtyRect()”,然后“Unlock()”。
但是如果不指定设备的句柄,我该如何在DirectX11.Texture2D对象上进行渲染?
我真的迷失了...我刚在codeplex上找到了“DirectX 4 WPF”示例,但这个示例实现了所有版本的DirectX,自己管理设备,并具有如此巨大的开销。我想保持我的现有系统。我正在自己管理设备。我不希望WPF控件来处理它。
循环应该只调用“Render()”,然后将后备缓冲区纹理传递给WPF控件。
是否有人能告诉我如何做到这一点?我完全被卡住了...
非常感谢:)
R