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

时间:2011-10-24 15:27:35

标签: c# wpf slimdx

我正在开发一个项目,我在WPF应用程序中托管了一个D3DImage。我在D3DImage上渲染了其他WPF控件,每个控件都有透明背景。但是,当我渲染场景时,我的UI会消失,直到我将鼠标悬停在控件上(可能会强制它们重新渲染)。

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

修改 我设法重现了我在一个简单项目中遇到的问题,可以下载here。注意:要运行项目,您需要安装最新的SlimDX。

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

1 个答案:

答案 0 :(得分:0)

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

简单来说,我的修复包括两部分:

  1. 使用Surface.CreateRenderTarget(...)创建渲染表面后,我必须使用mDevice.SetRenderTarget(0, mSurface)将目标传递给设备。这允许渲染在表面上进行。
  2. 在渲染操作期间,我删除了对Device.Present()的调用,以便WPF可以处理正确的缓冲区渲染。
  3. 我敢说解释不是100%准确,但是阅读该链接以及D3DImage的MSDN文档应该清除它。