【问题标题】:WPF UI not rendered when Direct3D content is rendered using SlimDX使用 SlimDX 呈现 Direct3D 内容时未呈现 WPF UI
【发布时间】:2011-10-25 17:34:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# wpf slimdx


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2021-08-12
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-07
      • 1970-01-01
      相关资源
      最近更新 更多