1

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

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

编辑 我已经设法重现了我在一个简单项目中遇到的问题,可以在这里下载。注意:要运行该项目,您需要安装最新的 SlimDX。

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

4

1 回答 1

0

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

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

  1. 使用创建渲染表面后,Surface.CreateRenderTarget(...)我必须使用mDevice.SetRenderTarget(0, mSurface). 这允许在表面上进行渲染。
  2. 在渲染操作期间,我删除了对 的调用,Device.Present()以便 WPF 可以处理正确的缓冲区渲染。

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

于 2011-10-25T09:34:23.540 回答