当使用SlimDX呈现Direct3D内容时,未呈现WPF UI

问题描述:

我正在处理一个项目,其中有一个在WPF应用程序中托管的D3DImage。我有其他的WPF控件在D3DImage上呈现,每个都有透明背景。然而,当我渲染我的场景时,我的用户界面消失,直到我将鼠标悬停在控件上(可能会迫使它们重新渲染)。当使用SlimDX呈现Direct3D内容时,未呈现WPF UI

我知道这不应该是一个问题,因为我已经完成了这个相对最近没有这个问题,但我不再有这个项目,所以我无法比较我的代码。如果任何人对这可能是什么有任何想法,我全都耳熟能详。我将在明天早上创建一个小型测试项目来重现此问题;所以我会更新这个问题。

编辑 我已成功地重现我在一个简单的项目,可以下载here有问题。注意:要运行该项目,您需要安装最新的SlimDX。

编辑 在该测试项目中注释掉对D3DImage.AddDirtyRect(...)的调用会导致UI被正确绘制。但是,在旋转对象时(并且随后在更新旋转时重新渲染3D内容),用户界面闪烁并且不会始终重新绘制。

我找到了问题的原因。基本上,在WPF中,当使用D3DImage作为Direct3D内容的渲染表面时,不能使用Device.Present()方法调用,因为这会处理前端缓冲区的呈现。这不应该这样做,因为D3DImage需要自己处理,所以它可以应用正确的透明胶片(有关此更多信息,请参阅here)。

简单地说,我的修补程序由两个部分组成:

  1. 使用Surface.CreateRenderTarget(...)我有目标传递到使用mDevice.SetRenderTarget(0, mSurface)设备创建渲染表面后。这允许渲染发生在表面上。
  2. 在渲染操作期间,我删除了对​​的调用,以便WPF可以处理正确的缓冲区渲染。

我敢说这个解释不是100%准确的,但是通过该链接阅读并且围绕D3DImage的MSDN文档应该清除它。