使用 SlimDX 渲染 Direct3D 内容时未渲染 WPF UI

发布于 2024-12-11 18:22:42 字数 562 浏览 0 评论 0原文

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

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

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

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

I'm working on a project where I have a D3DImage hosted in a WPF application. I have other WPF controls being rendered over the D3DImage, each with transparent backgrounds. However, when I render my scene, my UI disappears until I hover over the controls (presumably forcing them to be re-rendered).

I know this shouldn't be an issue, as I have accomplished this relatively recently without this issue, but I no longer have that project so I can't compare my code. If anyone has any ideas as to what this might be, I am all ears. I shall be creating a small test project to try to reproduce this issue tomorrow morning; so I'll update this question then.

Edit
I have managed to reproduce the problem I'm having in a simple project, which can be downloaded here. Note: To run the project, you will need the latest SlimDX installed.

Edit
Commenting out the call to D3DImage.AddDirtyRect(...) in that test project causes the UI to be drawn correctly. However, when rotating the object (and subsequently re-rendering the 3D content when the rotation is updated) the UI flickers and does not consistently get re-drawn.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等风来 2024-12-18 18:22:42

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

简而言之,我的修复由两部分组成:

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

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

I've found the cause of the issue. Basically, in WPF when using the D3DImage as a render surface for the Direct3D content, you cannot use the Device.Present() method call, as this handles the presenting of the front buffer. This should not be done as the D3DImage needs to handle this itself so it can apply the correct transparencies (see here for more information on this).

To put it simply, my fix consisted of two parts:

  1. After creating the render surface using Surface.CreateRenderTarget(...) I have to pass the target to the device using mDevice.SetRenderTarget(0, mSurface). This allows the rendering to occur on the surface.
  2. During the render operation, I removed the call to Device.Present() so that WPF could handle the correct buffer rendering.

I dare say that explanation is not 100% accurate, but reading through that link and around the MSDN documentation for the D3DImage should clear it up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文